MFC Button控件自绘制----详细讲解

VC下的界面着实难看 有时候我们不得不自己进行控件的绘制 以前 一直不理解最近再次看了学了一遍终于明白了一点   与大家分享下...       需要源代码的Q我 寻找一起学VC的朋友 

   比如说

我们要改变一个编辑框的背景 我们响应WM_CTLCOLOR函数 进行OnCtlColor进行修改但是对与 Button控件就不行了 ..      这时候我们要进行自绘制    相关函数   virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

  要覆盖掉这个虚函数  并且类型要设置为 BS_OWNERDRAW 这时候 放 应用程序进行初始化界面的时候 会进入我们的

  DrawItem函数 进行控件的绘制   所以说 自绘制 就2个步骤    

  ASSERT 宏       Evaluate an expression and generate a debug report when the result is FALSE (debug version only).       计算表达是当结果是false的时候生成调试报告 (仅仅在debug下 )  

1. 类型要设置为 BS_OWNERDRAW

2.重写 virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );函数   代码就我们自己设计了

 重绘需要的函数  注意 都是SDK中的函数       BOOL DrawFrameControl(   //这个函数画一个指定类型控件的框架   HDC hdc,     // handle to device context  DC   LPRECT lprc, // bounding rectangle   举行区域    UINT uType,  // frame-control type   类型   UINT uState  // frame-control state  状态 具体看MSDN  );   

   int DrawText(   //在指定的矩形区域 输出文本   HDC hDC,          // handle to DC   LPCTSTR lpString, // text to draw   int nCount,       // text length   LPRECT lpRect,    // formatting dimensions   UINT uFormat      // text-drawing options );

COLORREF SetTextColor(  //设置指定DC的文本颜色    HDC hdc,           // handle to DC   COLORREF crColor   // text color );

int FillRect(  // 用给定画刷填充矩形区域    HDC hDC,           // handle to DC   CONST RECT *lprc,  // rectangle   HBRUSH hbr         // handle to brush );

int SetBkMode(    //设置背景模式   TRANSPARENT透明    HDC hdc,      // handle to DC   int iBkMode   // background mode );

typedef struct tagDRAWITEMSTRUCT {    //具体看MSDN    UINT      CtlType;      //控件类型    UINT      CtlID;    //id   UINT      itemID;    //项ID     UINT      itemAction;  行为       UINT      itemState;  //状态    HWND      hwndItem;    //控件句柄   HDC       hDC;    //dc句柄    RECT      rcItem;   //举行区域    ULONG_PTR itemData;    } DRAWITEMSTRUCT  ;

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

   BOOL DrawFocusRect     (  画一个虚线矩形      HDC hDC,          // handle to device context     CONST RECT* lprc  // logical coordinates     );       数功能: 画一个焦点矩形。这个矩形是在标志焦点的样式中通过异或运算完成的(焦点通常用一个点线表示)。    如用同样的参数再次调用这个函数,就表示删除焦点矩形

 

下面是程序代码: 

   void  CBtnXiaoWei::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CString btnCaption;  //保存button标题  GetWindowText(btnCaption);  //获得button标题  CRect drawRect; //定义CRect对象 HDC dc= lpDrawItemStruct->hDC;//控件DC CDC*pDC=CDC::FromHandle(dc);//获得CDC指针 通过 HDC UINT nStyle=lpDrawItemStruct->CtlType; drawRect.CopyRect(&(lpDrawItemStruct->rcItem)); //拷贝控件矩形区域到我们的CRect对象    DrawFrameControl(dc,&drawRect,DFC_MENU,nStyle); //绘制控件框架  CBrush pBrush;//创建画刷

static int n=0; pBrush.CreateSolidBrush(RGB(100+n,130,n)); //创建 pDC->FillRect(drawRect,&pBrush);//画矩形 pDC->SetTextColor(m_clo); //设置文本颜色

CRect textRect;//定义一个CRect用于绘制文本 textRect.CopyRect(&drawRect); //拷贝矩形区域 CSize sz=pDC->GetTextExtent(btnCaption);//获得字符串尺寸 textRect.top+=(textRect.Height()-sz.cy)/2;//调整文本位置 居中 pDC->SetBkMode(TRANSPARENT);//设置文本背景透明 pDC->DrawText(btnCaption,&textRect,DT_RIGHT|DT_CENTER|DT_BOTTOM);//绘制文本 n+=10; }

 

void CBtnXiaoWei::SetTextColer(COLORREF clo) { m_clo=clo; Invalidate(); //是局部无效引起重画  }

 

时间: 2024-09-14 11:51:47

MFC Button控件自绘制----详细讲解的相关文章

mfc界面美化-MFC的Button控件设计界面

问题描述 MFC的Button控件设计界面 新手求救,花了一天做button按钮的设计还做不出来,能改变颜色和大小就好,最好能有源代码,这样我才看的懂 解决方案 MFC_Button控件MFC Button控件的背景色MFC Button控件的背景色 解决方案二: CButton有个SetBitmap函数,想要什么图案自己画,大小是按钮的基本参数,很容易设置. 解决方案三: 要重绘啊,自己用代码来生成按钮

mfc 直角坐标图-mfc的哪种控件可以 绘制坐标图

问题描述 mfc的哪种控件可以 绘制坐标图 用 mfc 绘制直角坐标图,应该用哪个控件实现坐标随窗口的改变而改变 解决方案 什么控件都可以绘制,只要活得到这个控件的DC之后,就可以用GDI绘图来绘制你要的图了 解决方案二: 使用teechart控件 你是做动态曲线图吗 可以参考博客 http://blog.csdn.net/lpp0900320123/article/details/29847201 注意 teechart控件需要自行安装 解决方案三: http://wenku.baidu.co

VS2010 MFC ocx控件 button隐藏

问题描述 VS2010 MFC ocx控件 button隐藏 我的代码如下: 1.在初始化函数OnInitDialog中给按钮添加位图 if (m_button1.GetBitmap()==NULL) { m_button1.SetBitmap(::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP22))); //旋转90° ·······} 2.给菜单项"隐藏工具栏"添加事件处理程序,代码如下: void M

Android群英传笔记——第三章:Android控件架构与自定义控件讲解

Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基础的,可以先看下我之前写的几篇基础的View博客 Android绘图机制(一)--自定义View的基础属性和方法 Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 Android绘图机制(三)--自定义View的三种实现方式以及实战

MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法

MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法  <参考资料 MSDN MFC TNO 15>  文档将概述MFC中定制自定义控件的3种方法: 拥有者绘制控件(Owner Drawing Control and Menu)   自绘制控件(self drawing control and menu)  和子集化(subclass)  1  使用MFC方法定制控件必备的几个基本概念:  控制定制风格的控件的几个标准Windows消息: 

mfc 图片控件旋转问题,一次旋转90°

问题描述 mfc 图片控件旋转问题,一次旋转90° mfc 图片控件旋转,这个可以旋转么?怎么写代码?求大神指导,菜鸟一个 解决方案 控件没有办法旋转,但是上面绘制的图形或者文字是可以得. 解决方案二: 第一步,你必须知道位图即BMP格式的文件的结构. ??????????????位图(bmp)文件由以下几个部分组成: ?????????????????????1.BITMAPFILEHEADER,它的定义如下: ?????????????????????????typedef?struct?t

vb.net的Button控件

Button(按钮)控件一般接受鼠标单击事件被用来启动.中断或结束一个进程(相当于Visual Basic以前版本的CommandButton控件).单击Button控件时将调用已写入Click事件过程中的过程.Button控件在大多数Visual Basic应用程序中都会用到,用户可以单击按钮执行操作.单击时,按钮不仅能执行相应的操作,而且看起来与被按下和松开一样.Button控件在工具箱中的图标如图所示: 1.向窗体添加按钮 在应用程序中很可能要使用多个按钮.就象在其他容器控件上绘制按钮那样

MFC Edit控件 error:“DDX_Control”: 不能将参数 3 从“int”转换为“CWnd &amp;amp;”

在使用MFC的Edit Control等控件时可能你会遇到这样的问题:error:"DDX_Control": 不能将参数 3 从"int"转换为"CWnd &"或error:"DDX_Control": 不能将参数 3 从"CString"转换为"CWnd &".这是什么原因呢? 一.浅析 查看资料和搜索后,我也看到了一些具体分析: 在一个对话框程序里,有个按钮IDC_

radio button-C#编程 其中radioButton控件48个,button控件24个,请教各位大牛,如何简化编写,功能如下代码重复24次。

问题描述 C#编程 其中radioButton控件48个,button控件24个,请教各位大牛,如何简化编写,功能如下代码重复24次. 1C private void radioButton1_CheckedChanged(object sender EventArgs e) { if (radioButton1.Checked == true) button1.BackColor = Color.Red; } private void radioButton2_CheckedChanged(o