zoukankan      html  css  js  c++  java
  • 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张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    vbscript错误代码及对应解释大全(希望还没过时)
    对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载
    一道算法题,求更好的解法
    浅谈SQLite——实现与应用
    Linux网络协议栈(二)——套接字缓存(socket buffer)
    服务器开发入门——理解异步I/O
    理解MySQL——复制(Replication)
    线性时间排序算法
    Linux网络协议栈(一)——Socket入门(2)
    理解MySQL——索引与优化
  • 原文地址:https://www.cnblogs.com/skyme/p/1870308.html
Copyright © 2011-2022 走看看