• MFC自绘按钮的实现


    自绘按钮的实现过程

    • 申明自绘属性
    • 进行VM_MESUREITEM事件响应,说明按钮的尺寸
    • 进行VM_DRAWITEM消息的重新响应,说明如何绘制按钮

    首先在vc6中新建工程,选择MFC并且新建dialog工程

    输入工程名,然后将生成的按钮等删除,重新添加两个按钮。

    为按钮设置属性

    选择自绘,就是自己向上贴图

    在dlg类的对象上添加WM_DRAWITEM属性

    在生成的OnDrawItem方法中添加如下代码

    //添加绘图函数
    void CMy40_mybuttonDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    	// TODO: Add your message handler code here and/or call default
    	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_BITMAP1);
    		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();
    		//设置文字背景为透明
    		ButtonDC.SetBkMode(TRANSPARENT);
    		ButtonDC.DrawText("已选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    	}
    	else
    	{
    		bitmapTrans.LoadBitmap(IDB_BITMAP2);
    		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);
    		ButtonDC.SetBkMode(TRANSPARENT);
    		ButtonDC.DrawText("未选中",&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    		mem.SelectObject(old2);
    		bitmapTrans.DeleteObject();
    	}
    
    	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }
    

    编译运行,运行后得到效果如果所示

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    vue-learning:8-template-v-on-and-modifier
    vue-learning:7-template-v-bind-with-class-and-style
    vue-learning:6-template-v-bind
    vue-learning:5-template-v-for
    Bootstrap 导航栏
    Bootstrap 导航元素
    Bootstrap 输入框组
    Bootstrap 按钮下拉菜单
    Bootstrap 按钮组
    Bootstrap 下拉菜单(Dropdowns)
  • 原文地址:https://www.cnblogs.com/skyme/p/1870308.html
Copyright © 2020-2023  润新知