按钮控件怎么自绘
1、实现过程:1.在主窗口中放置一个按钮
2、2.设置按钮的行为为:OwnerDraw(控件自绘)设置此行为后,控件需要自己绘制,否则显示不了控件。默认没有设置,系统会绘制此控件。如图:
3、3.对父窗口的WM_DRAWITEM消息进行处理在父窗口资源对话框中,右击,查看属性,如下图:找到WM_DRAWITEM,添加处理函数。如图:添加消息处理后,如下图:
4、4.消息处惯栲狠疲理函数OnDrawItem(intnIDCtl,LPDRAWITEMSTRUCTlpDrawItemStruct)第一个参数intnIDCtl是控件ID,可以通过I僻棍募暖F语句对ID进行判断,然后对不同的ID的控件进行自绘。上图中可以看出,有两个按钮,判断后调用相应的函数进行自绘处理。当然,我都使用了相同的方式自绘。注意,调用函数要将第二个参数LPDRAWITEMSTRUCTlpDrawItemStruct传给自绘函数。这个参数是自绘结构体,有自绘需要的各种信息。
5、5.自绘函数胆咣骜岱编写。具体的每一句就不详细解释了。代码中有注释。------------------------代码段开始---------------------------v泠贾高框oidC自绘按钮Dlg::draw(LPDRAWITEMSTRUCTlpDrawItemStruct){CDCButtonDC;CBitmapbitmapTrans;BITMAPbmp;CDCmem;CRectrc;//得到用于绘制按钮的DCButtonDC.Attach(lpDrawItemStruct->hDC);//准备用于向按钮区域传输位图mem.CreateCompatibleDC(&ButtonDC);//获取按钮所占的矩形大小rc=lpDrawItemStruct->rcItem;//获取按钮目前所处的状态,根据不同的状态绘制不同的按钮UINTstate=lpDrawItemStruct->itemState;//如果按钮已经得到焦点,绘制选中状态下的按钮if(state&ODS_FOCUS){bitmapTrans.LoadBitmap(IDB_BITMAP2);bitmapTrans.GetBitmap(&bmp);CBitmap*old=mem.SelectObject(&bitmapTrans);//向按钮所在位置传输位图//使用StretcnBlt的目的是为了让位图随按钮的大小而改变ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);mem.SelectObject(old);bitmapTrans.DeleteObject();}else{bitmapTrans.LoadBitmap(IDB_BITMAP1);CBitmap*old2=mem.SelectObject(&bitmapTrans);bitmapTrans.GetBitmap(&bmp);CBitmap*old=mem.SelectObject(&bitmapTrans);ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);mem.SelectObject(old2);bitmapTrans.DeleteObject();}}------------------------代码段结束---------------------------IDB_BITMAP1IDB_BITMAP2是两个Bitmap资源,需要提前添加以下。
6、6.运行的结果就是:单击按钮(得到焦点)会更换按钮显示的图片,单击另外的按钮(失去焦点)后又会恢复之前的图片。另外实现的截图:单击前:单击后: