mfc自绘按钮,mfc自定义控件开发

  mfc自绘按钮,mfc自定义控件开发

  VC下的界面真的很丑。有时候,我们要自己画控件,但是我们以前从来没有理解过。最近看了又学,终于明白了一点,分享给大家.q,谁需要源码,我找个朋友一起学VC。

  例如

  我们想改变一个编辑框的背景。我们响应WM_CTLCOLOR函数修改OnCtlColor,但是不能用按钮控件.这时我们要执行自绘制相关函数Virtual Void DrawItem(lpdrawitemStruct lpdrawitemStruct);

  为了覆盖这个虚函数并将类型设置为BS_OWNERDRAW,应用程序将在初始化时进入我们的接口。

  DrawItem函数绘制控件,所以从绘制开始有两个步骤。

  ASSERT宏对表达式求值,并在结果为false时生成调试报告(仅限调试版本)。计算表达式是在结果为假时生成调试报告(仅在调试下)。

  1.类型应设置为BS_OWNERDRAW。

  2.重写虚拟Void DrawItem(lpdrawitemStruct lpdrawitemStruct);功能是我们自己设计的。

  注意重画所需的函数。SDK中的所有函数都是BOOL DrawFrameControl( /)这个函数绘制一个指定类型的控件HDC HDC,//句柄到设备上下文DC LP矩形LPRC,//包围矩形保持区域uintytype,//frame-controltype类型UINT uState //frame-control state状态。详见MSDN);

  指定矩形区域的int text(//输出文本HDC HDC,//句柄为DC lpctstr LP string,//文本绘制int ncount,//文本长度lprect lprect,//格式尺寸uint u format//文本绘制选项);

  colof settext color(//设置指定dc的文本颜色hdc hdc,//句柄为DC colorref Cr color//文本颜色);

  int rect(//用给定的画笔填充矩形区域HDC HDC,//handle to DC construct * lprc,//rectangle hbrush HBR//handle to brush);

  setbkmode(//设置后台模式透明透明HDC HDC,//句柄为DC int ibk mode//后台模式);

  typestruct tagdrawitemstruct {//详细信息请参见MSDN UINT CTL type;//控件类型UINT CtlID//id UINT itemID;//项目ID UINT itemAction行为单位项目状态;//state HWND hwn item;//控制手柄HDC hDC//dc句柄RECT rcItem;//保持区ULONG _ PTR itemData} DRAWITEMSTRUCT

  draw 3 rect(LPC rect lpRect,COLORREF clrTopLeft,COLORREF clrBottomRight);该函数用于实现绘制3D矩形的位置大小,其中lpRect为填充整个3D矩形的位置大小,clrTopLeft和clrBottomRight分别为3D效果左上方和右下方的RGB颜色值。

  BOOL DrawFocusRect(画一个虚线矩形HDC HDC,//handle to device context construct * lprc//逻辑坐标);功能:画一个聚焦框。这个矩形在标记焦点(焦点通常用虚线表示)的图案中通过XOR运算完成。用相同的参数再次调用这个函数意味着删除聚焦框。

  下面是程序代码:

  void cbtn Xiaowei:DrawItem(LPDRAWITEMSTRUCT LPDRAWITEMSTRUCT){ CString BTN caption;//保存按钮标题GetWindowText(BTN caption);//获取按钮标题cretdrawrect//定义CRect对象HDC DC=lpdrawitmestruct-//控制DC CDC * pDC=CDC:from handle(DC);//通过hdcuntn获取CDC指针

  静态int n=0;pBrush。CreateSolidBrush(RGB(100 n,130,n));//创建pDC- FillRect(drawRect,Pb rush);//绘制矩形pDC-SetTextColor(m _ clo);//设置文本颜色

  CRect textRect//定义一个CRect来绘制文本textRect。copy rect(draw rect);//复制矩形区域CSIZESZ=PDC-GetText Extent (BTN字幕);//获取字符串大小textrect . top=(textrect . height()-SZ . cy)/2;//将文本位置调整为居中pDC- SetBkMode(透明);//设置文本背景透明的PDC-DrawText (BTN标题,textrect,dt _ right dt _ center dt _ bottom);//绘制文本n=10}

  void cbtn Xiaowei:SetTextColer(COLORREF clo){ m _ clo=clo;invalidate();//局部无效导致的重绘}

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: