做点贡献,提供一个方法,利用消息实现3态位图按纽

tangshiping 2004-10-13 03:40:55
呵呵,非转载:
目前网上的办法一般是重载,学vc半年了,从csdn做了大量不劳而获的亏心事,做点贡献这次。我这里提供一个用消息做的,写详细点,给初学者共享:
(基于对话框的)
假设有2个按纽,一个叫“退出”,一个叫“浏览”。
1:选择它们的owerdraw属性
2:定义2个 CBitmapButton 变量。
CBitmapButton m_exit;
CBitmapButton m_browse;
可以定义在头文件中。
3:在初始化中加入:
m_exit.AutoLoad(IDC_BUTTON_EXIT, this);
m_exit.LoadBitmaps(IDB_BITMAP_EXIT_NORMAL,IDB_BITMAP_EXIT_DOWN,IDB_BITMAP_EXIT_OVER,IDB_BITMAP_EXIT_GREY);
//第一个参数是正常状态位图,第二个是按下状态的,第三个是位于上方时的,第四个是不可用时的
m_browse.AutoLoad(IDC_BUTTON_BROWSE, this);
m_browse.LoadBitmaps(IDB_BITMAP_BROWSE_NORMAL,IDB_BITMAP_BROWSE_DOWN,IDB_BITMAP_BROWSE_OVER,IDB_BITMAP_BROWSE_GREY);
4:在cpp上面定义2个全局变量:
bool BROWSEreDraw = 0;
bool EXITreDraw = 0;
5:BOOL C ....Dlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_MOUSEMOVE)
{
if(pMsg->hwnd == GetDlgItem(IDC_BUTTON_EXIT)->m_hWnd)
{
if(!EXITreDraw)
{
GetDlgItem(IDC_BUTTON_EXIT)->SetFocus();
EXITreDraw = !EXITreDraw;
}
}
else if(pMsg->hwnd == GetDlgItem(IDC_BUTTON_BROWSE)->m_hWnd)
{
if(!BROWSEreDraw)
{
GetDlgItem(IDC_BUTTON_BROWSE)->SetFocus();
BROWSEreDraw = !BROWSEreDraw;
}
}
else
{
if(BROWSEreDraw )
{
BROWSEreDraw = !BROWSEreDraw ;
}
if(EXITreDraw)
{
EXITreDraw = !EXITreDraw;
}
GetDlgItem(IDC_OTHER)->SetFocus(); //将任意一个其他的控件获得焦点
}
}
.......................
}
结束了(应该没有漏掉什么吧),不用担心,没有闪烁。
...全文
200 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangan 2010-06-17
  • 打赏
  • 举报
回复
LoadCursor应改为LoadStandyardCursor,因为加载的是标准cursor
angelcool 2004-10-23
  • 打赏
  • 举报
回复
多说些,有人旁听!! ^_^
auly403 2004-10-23
  • 打赏
  • 举报
回复
我现在做按钮,呵呵
不妨告诉你,我用的是热区。

什么是热区?
tangshiping 2004-10-23
  • 打赏
  • 举报
回复
对列,呵呵
goodsmaker 2004-10-23
  • 打赏
  • 举报
回复
根据不同的区域,显示不同的东西,做不同的工作
tangshiping 2004-10-23
  • 打赏
  • 举报
回复
热区?
当鼠标到屏幕的某一块区域内时, 鼠标变成一只"手",有时还出现一些提示性的文字.这些区域就光标热区.

vc中一般通过ClassWizard响应wm_setcursor消息,其响应函数如下:
BOOL C......Dlg::OnSetCursor(CWnd *pWnd,UINT nHitTest,UINT message )

{ switch (pWnd->GetDlgCtrlID())//得到ID

{

case IDC_PICTURE :

{ //设置鼠标指针为"手"形指针

SetCursor (AfxGetApp ()->LoadCursor(IDC_HAND));

//将提示文字可见

GetDlgItem (IDC_TEXT)->ShowWindow(SW_SHOW);

//显示文字

GetDlgItem(IDC_TEXT)->SetWindowText("This is a picture !");

return true; }

break;

case IDC_BUTTON1 :

{ SetCursor (AfxGetApp()->LoadCursor(IDC_HAND));

GetDlgItem(IDC_TEXT)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_TEXT)->SetWindowText("This is a button!");

return true;

} break;

default:

{ GetDlgItem(IDC_EXT)->ShowWindow(SW_HIDE);

SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

return true;

}}

return CDialog::OnSetCursor(pWnd,nHitTest,message);
}
//SetCursor()函数用于显示特定的鼠标光标图形,一般来说和LoadCursor函数结合使用

不知道 cadinfo(无语清风) 是不是在OnSetCursor里处理按纽图标的?纯属猜测。呵呵

cadinfo 2004-10-20
  • 打赏
  • 举报
回复
我现在做按钮,呵呵
不妨告诉你,我用的是热区。

你VC是不是刚入门?
tangshiping 2004-10-19
  • 打赏
  • 举报
回复
没有查到,迷惑。
tangshiping 2004-10-14
  • 打赏
  • 举报
回复
去查查。
再敢问 清风 ,你现在做位图按纽怎么做?还是那样吗?
cadinfo 2004-10-14
  • 打赏
  • 举报
回复
关键在ID字符串上面,你可以查找一下参考资料,MSDN上应该有
...U...F....D类似这样的字符串.
tangshiping 2004-10-13
  • 打赏
  • 举报
回复
to : cadinfo(无语清风)
我真的不知道你所说的那个方法,3态的位图按纽那么简单?请你告诉我吧,呵呵,真的不知道
zhaogaojian 2004-10-13
  • 打赏
  • 举报
回复
收藏
cadinfo 2004-10-13
  • 打赏
  • 举报
回复
我记得当初我学用Vc时候只需要准备三态按钮,设置ID为某字符串
不需要写一行代码就能实现三态按钮啊!!!

你这个不是多此一举?
tangshiping 2004-10-13
  • 打赏
  • 举报
回复
没有人要这0分吗?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧