开发学院软件开发C++ MFC自绘按钮 阅读

MFC自绘按钮

 2010-11-06 08:08:35 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄闁圭⒈鍋嗛惀顏囶樄闁哄本娲樼换婵婄疀閺囩姷鐛ラ梻浣哄帶婢瑰﹥绂嶅⿰鍫氣偓鏃堝礃椤忎礁浜鹃柨婵嗛婢ь喖霉閻樻瑥瀚粻楣冩煕椤愩倕鏋庨柣蹇嬪劜閵囧嫰寮村Ο鍝勫Е濡炪們鍨洪悷鈺呭箖閳╁啯鍎熼柕鍥у簻閹凤拷
核心提示:自绘按钮的实现过程 申明自绘属性 进行VM_MESUREITEM事件响应,说明按钮的尺寸 进行VM_DRAWITEM消息的重新响应,MFC自绘按钮,说明如何绘制按钮首先在vc6中新建工程,选择MFC并且新建dialog工程输入工程名,就是自己向上贴图在dlg类的对象上添加WM_DRAWITEM属性在生

自绘按钮的实现过程

  • 申明自绘属性
  • 进行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);
}

 

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

ATL和MFC来创建ActiveX控件

http://tech.cncms.com/develop/vc/59183.html

Tags:MFC 自绘 按钮

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
更多精彩
    赞助商链接

    热点阅读
      焦点图片
        最新推荐
          精彩阅读