文章参考地址:  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(); //是局部无效引起重画
}

MFC Button控件自绘的更多相关文章

  1. 【MFC】Button控件和Picture Control的鼠标事件执行顺序

    1.Button控件鼠标事件执行顺序 (1) WM_LBUTTONDOWN (2) WM_LBUTTONUP (3) OnBnClickedButton1(); 2.Picture Control的鼠 ...

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

    之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望 ...

  3. 发布MFC ActiveX控件并实现自动更新

    一.        引言 上一篇我们讲了如何使用 VC 2005来开发 MFC ActiveX控件,我们开发 ActiveX控件最终目的是将 ActiveX控件发布出来并嵌入在 Web网页中,随着控件 ...

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

    1.依照文章<OpenCV+MFC显示图像>,完毕配置. 2.创建对应的图像控件,button控件. 3.进行类型转换. 在当前OpenCV2版本号内,图像格式为cv::Mat ,而该格式 ...

  5. VC++中关于控件重绘函数/消息 OnPaint,OnDraw,OnDrawItem,DrawItem的区别

    而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息. OnDraw()是CVIEW的成员函数,并且没有响应消息的功能.这就是为什么你用VC成的程序代码时,在视图类只有OnDraw ...

  6. ActiveX 控件重绘无效问题,用CClientDC 而不是CPaintDC

    ActiveX 控件重绘子控件时,用Invalid()会出现无效的情况即不会更新界面. OnPaint 方法里,是用的 CPaintDC,经测试无效,后换CClientDC,发现可以,百度查他们的区别 ...

  7. vs2010开发activex(MFC)控件/ie插件(一)

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782904  vs2010开发activex(MFC)控件:      第一步:生成ac ...

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

    ActiveX开发的教程有很多,我也从中受益匪浅,例如以下这几篇: 基本教程:http://www.cnblogs.com/guenli/articles/1629915.html 注意事项:http ...

  9. [原创]在Framelayout中放置button控件出现的覆盖问题

    android Framelayout(帧布局)是很常用的布局,主要用来处理需要多个view叠加显示的情况. 然而在使用中,我发现Framelayout中的Button控件,会挡住所有其他控件,而不论 ...

随机推荐

  1. 一个好用的C# HttpHelper类

    /// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...

  2. windows环境下安装scrapy框架报错问题--最快捷有效的解决方案

    windows在执行如下命令,安装scrapy的过程中会报错: pip install scrapy 报错分析: windows环境下,会出现如下错误: 1.提示的错误是编译环境的问题,字面意思看需要 ...

  3. centos7上部署新版 jumpserver 跳板机服务

    CentOS 7 建议在一个纯净的 centos7上进行下面的安装部署 关闭 selinux 和防火墙 [root@jumpserver ~]# setenforce 0 [root@jumpserv ...

  4. linux文件IO操作篇 (二) 缓冲文件

    2. 缓冲文件操作 //规模较大 实时性低的文件 //当数据长度快要超过缓冲区的范围时,或者时间周期达到时,数据才被送往指定位置 //需要使用FILE * 作为文件标识符 //stdin 标准输入 / ...

  5. anaconda 安装opencv win10

    直接在命令窗口里面运行:pip install opencv-python即可.

  6. JSON初体验(一):JsonObject解析

    在学校的呆了一段时间,马上又要回去工作了,不说了,我现在介绍一下json相关的内容 1.JSON数据格式(总的来说,json就是一个字符串) 1.整体结构 String json1 = "{ ...

  7. FJOI 2019 游记

    (FJOI 2019 滚粗记) Day 0 早上刷了一些水题,然后就上路了. (画图3D好好玩) 来得晚只有十几分钟时间看考场,于是连试机题都没有Ak. Day 1 果然我还是太菜了 走过来的时候再讨 ...

  8. kvm-1

    yum install libvirt* virt-* qemu-kvm* -y systemctl start libvirtd.service systemctl status libvirtd. ...

  9. BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...

  10. BFS搜索

    参考博客:[算法入门]广度/宽度优先搜索(BFS) 适用问题:一个解/最优解 重点:我们怎么运用队列?怎么记录路径? 假设我们要找寻一条从V0到V6的最短路径.(明显看出这条最短路径就是V0-> ...