MFC自绘按钮 动态效果
来源:互联网 发布:python数组减1 编辑:程序博客网 时间:2024/06/01 21:51
最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了。
过程如下:
第一,新建一MFC对话框应用程序。
第二,删除自带按钮,并添加两个按钮,button1,button2,ID为IDB_BUTTON1,IDB_BUTTON2.同时响应鼠标单击按钮事件。如下
void Cbutton_fly3Dlg::OnBnClickedButton2()//video2{ // TODO: 在此添加控件通知处理程序代码 MessageBox(L"video2");//这里简单测试一下}
第三,添加位图资源,在资源视图下添加几张图片,如下图
第四,设置按钮参数OwnerDraw为true,此参数说明,按钮的绘制有使用者自己绘制。我的环境是VS2010,位置如下:
第五,添加消息响应函数WM_DRAWITEM,相应用户的按键操作,如图
在OnDrawItem()函数内部添加处理函数,我打算加载两个位图,在按钮按下以及释放时显示图片。
1 CDC buttonDC; 2 CBitmap bitmapTrans; 3 BITMAP bmp; 4 CDC mem; 5 CRect rc; 6 buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC 7 mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形 8 9 if (lpDrawItemStruct->CtlID == IDC_BUTTON1)10 {11 rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小12 UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮 13 if (state & ODS_FOCUS)//如果按钮已经取得焦点,绘制选中状态下的按钮14 {15 bitmapTrans.LoadBitmap(IDB_BITMAP2);16 bitmapTrans.GetBitmap(&bmp);17 CBitmap * old = mem.SelectObject(&bitmapTrans);18 //向按钮传输位图,使用stretcnblt可以使图片随按钮大小而改变19 buttonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);20 mem.SelectObject(old);21 bitmapTrans.DeleteObject();22 }23 else //如果按钮已经取得焦点,绘制选中状态下的按钮24 {25 bitmapTrans.LoadBitmap(IDB_BITMAP3);26 CBitmap *old2 = mem.SelectObject(&bitmapTrans);27 bitmapTrans.GetBitmap(&bmp);28 CBitmap *old=mem.SelectObject(&bitmapTrans);29 buttonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);30 mem.SelectObject(old2);31 bitmapTrans.DeleteObject();32 }33 }
我只是把图片的颜色稍微变了一下,但是效果在运行时可以明显看出来。效果如图:
部分重要代码:
1 void Cbutton_fly3Dlg::OnBnClickedButton1()//video1 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 MessageBox(L"video1"); 5 6 } 7 8 9 void Cbutton_fly3Dlg::OnBnClickedButton2()//video210 {11 // TODO: 在此添加控件通知处理程序代码12 MessageBox(L"video2");13 }14 15 16 void Cbutton_fly3Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)17 {18 // TODO: 在此添加消息处理程序代码和/或调用默认值19 //自绘按钮的实现20 CDC buttonDC;21 CBitmap bitmapTrans;22 BITMAP bmp;23 CDC mem;24 CRect rc;25 buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC26 mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形 27 28 if (lpDrawItemStruct->CtlID == IDC_BUTTON1)29 {30 rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小31 UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮 32 if (state & ODS_FOCUS)//如果按钮已经取得焦点,绘制选中状态下的按钮33 {
阅读全文
1 0
- MFC自绘按钮 动态效果
- mfc 按钮自绘
- MFC 按钮的自绘
- MFC-自绘贴图按钮
- MFC 下自绘按钮
- MFC自绘按钮的实现
- MFC下按钮自绘的实现
- MFC按钮自绘消息分析
- MFC 自绘按钮的实现
- MFC的自绘位图按钮
- MFC + CxImage 实现自绘半透明按钮
- MFC按钮 自绘 鼠标滑过
- MFC + CxImage 实现自绘半透明按钮
- MFC自绘按钮的实现
- MFC 自绘按钮的实现
- MFC(4)自绘按钮
- MFC下按钮自绘的实现
- (VC++2013)MFC自绘圆形按钮
- python数据类型
- php运行超时
- RT-Thread在STM32F103C8T6上面的使用——使用msh
- 本人为初学者,留下一点自己的知识
- 为什么不能用二级指针直接指向二维数组
- MFC自绘按钮 动态效果
- 计算1000以内的完数
- FormData 对象的使用
- kafka的offset是个什么鬼。。
- 洛谷1896[SCOI2005]互不侵犯King
- 关于opcdaauto.dll的注册
- Bootstrap4:导航栏右侧对齐
- jQuery第四节---jQuery效果2
- 她好像要走了