MFC Button控件自绘

文章参考地址:  http://blog.csdn.net/yue7603835/article/details/6649458

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

   比如说

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

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

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

  •   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-10-20 07:01:28

MFC Button控件自绘的相关文章

Button控件自绘

1. 派生CButton 2. 重写PreSubclassWindow函数,设置BS_OWNERDRAW属性 void CButtonEx::PreSubclassWindow() { // TODO: 在此添加专用代码和/或调用基类 UINT nStyle = GetButtonStyle(); SetButtonStyle(nStyle | BS_OWNERDRAW); CButton::PreSubclassWindow(); } 3. 重写DrawItem函数实现Button重绘 But

深入Windows窗体原理及控件重绘技巧

之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望这篇文章可以帮你解惑. 1.Windows窗体原理 首先,如果看过Win32 SDK编程的都知道Windows的三大核心系统:负责窗口对象产生和消息分发的USER模块,负责图像显示绘制的GDI模块,负责内存.进程.IO管理的KERNEL模块.试想象一下如何在一个像素阵列上产生窗口对象,其实就是使用G

OpenCV在MFC图像控件内显示图像

1.依照文章<OpenCV+MFC显示图像>,完毕配置. 2.创建对应的图像控件,button控件. 3.进行类型转换. 在当前OpenCV2版本号内,图像格式为cv::Mat ,而该格式无法直接在MFC内显示.因此,须要将其转换为能够在MFC内显示的CvvImage类格式,该类内有函数 DrawToHDC()支持MFC.试了一下无法直接实现,须要曲线救国.首先,将 格式cv::Mat变换为格式IplImage,再转换格式为 CvvImage. 还有问题,眼下openCV2版本号不再支持Cvv

开发ActiveX控件调用另一个ActiveX系列1——开发一个MFC ActiveX控件

ActiveX开发的教程有很多,我也从中受益匪浅,例如以下这几篇: 基本教程:http://www.cnblogs.com/guenli/articles/1629915.html 注意事项:http://jon-lt.iteye.com/blog/1676272 属性.方法开发:http://blog.csdn.net/waxgourd0/article/details/7652478 但是由于我的目的是开发一个身份证识别仪的ActiveX控件,因此我就要先仿照识别仪ActiveX开发一个Ac

mfc中 控件 对话框 添加颜色 背景图片

1 设置对话框透明 在设置控件颜色中要使用 nCtlColor Contains one of the following values, specifying the type of control: CTLCOLOR_BTN   Button control CTLCOLOR_DLG   Dialog box CTLCOLOR_EDIT   Edit control CTLCOLOR_LISTBOX   List-box control CTLCOLOR_MSGBOX   Message b

Button控件

从最简单的开始写起: 首先先从工具性中拖入一个Button控件,然后可以在其属性面板之中更改其自身的属性. 当然也可用直接在代码编辑界面进行直接的编辑添加,如果有什么属性不清楚,可在属性面板中查看一下,然后可以用代码直接编写,和在属性面板中更改的是一样的. 之后可以编辑控件的事件了,其中Button有Click事件和Command事件,在这里就只写Click事件. 代码: 1 <asp:Button ID="Button1" runat="server" Te

VB.NET 章鱼哥出品--入门基础Button控件的使用详解(一)

全网最全的Button控件详解!!!Button 按钮是VB.NET 中最基础,也是最常用的控件,不管你是初学者还是大牛.每个程序中必然少不了Button按钮.但是Button控件有很多用法很多大牛却不见得知道.用的最多的无非就是在点击事件中处理程序,今天我将使用2到3篇文章的篇幅来详细讲解Button按钮的用法.      '作者:章鱼哥,QQ:3107073263 群:309816713            '如有疑问或好的建议请联系我,大家一起进步     1,属性(以最常用的开始) (

纯代码创建Button控件:

纯代码创建Button控件: // 创建按钮 UIButton *btn = [[UIButton alloc] init]; // 添加按钮 [self.view addSubview:btn]; // 设置frame btn.frame = CGRectMake(50, 50, 100, 100); // 设置背景图片 // 通过文件名加载图片(凡是PNG图片,都不用加拓展名) UIImage *normal = [UIImage imageName:@“btn_01”]; // 设置普通状

MFC各种控件的常见操作(逐步添加中......)

由于经常切换系统或界面框架进行编程,难免有时会忘记之前的编程函数等等.所有在此自己做一个备份,以防止重新充电带来的痛苦! 1.CButton 1.1 在VC中编程实现按钮的启用(enable)和禁用(disable) 1.1.1 方式1:在对控件添加变量以后 m_btnQuit.EnableWindow(FALSE); //禁用按钮 m_btnQuit.EnableWindow(TRUE); //启用按钮 m_btnQuit.EnableWindow(FALSE); //禁用按钮 m_btnQu