按钮控件怎么自绘

2025-11-11 22:50:14

1、实现过程:

 

1.在主窗口中放置一个按钮

2、2.设置按钮的行为为:Owner Draw (控件自绘)设置此行为后,控件需要自己绘制,否则显示不了控件。默认没有设置,系统会绘制此控件。如图:

按钮控件怎么自绘

3、3.对父窗口的WM_DRAWITEM消息进行处理在父窗口资源对话框中,右击,查看属性,如下图:

找到WM_DRAWITEM,添加处理函数。如图:

添加消息处理后,如下图:

按钮控件怎么自绘

按钮控件怎么自绘

按钮控件怎么自绘

4、4.消息处理函数OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)第一个参数int nIDCtl是控件ID,可以通过IF语句对ID进行判断,然后对不同的ID的控件进行自绘。上图中可以看出,有两个按钮,判断后调用相应的函数进行自绘处理。当然,我都使用了相同的方式自绘。注意,调用函数要将第二个参数LPDRAWITEMSTRUCT lpDrawItemStruct传给自绘函数。这个参数是自绘结构体,有自绘需要的各种信息。

5、5.自绘函数编写。具体的每一句就不详细解释了。代码中有注释。

------------------------代码段开始---------------------------

void C自绘按钮Dlg::draw(LPDRAWITEMSTRUCT lpDrawItemStruct){    CDC ButtonDC;    CBitmap bitmapTrans;    BITMAP bmp;    CDC mem;    CRect rc;    //得到用于绘制按钮的DC    ButtonDC.Attach(lpDrawItemStruct->hDC);    //准备用于向按钮区域传输位图    mem.CreateCompatibleDC(&ButtonDC);    //获取按钮所占的矩形大小    rc=lpDrawItemStruct->rcItem;    //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮    UINT state = 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.运行的结果就是:单击按钮(得到焦点)会更换按钮显示的图片,单击另外的按钮(失去焦点)后又会恢复之前的图片。

另外实现的截图:单击前:

单击后:

按钮控件怎么自绘

按钮控件怎么自绘

按钮控件怎么自绘

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢