`
webcode
  • 浏览: 5943494 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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(); //是局部无效引起重画
}


分享到:
评论

相关推荐

    MFC重载Button实现圆形按钮 椭圆按钮类

    VS2017,MFC,很简单的重载Button实现圆形按钮 椭圆按钮类。 VS2017,MFC,很简单的重载Button实现圆形按钮 椭圆按钮类。

    MFC BUtton按钮自绘

    在MFC的基础上将按钮控件分别以垂直、水平和倾斜三种形式绘制了一个6个按钮控件图,但是在绘图上还是有很大的差距的

    mfc使用的颜色button

    mfc界面美化的一个小点--颜色button,可以设置button按钮的背景色和字体色,使用时注意设置button的属性为所有者绘制

    Visual_C++MFC入门教程

    |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 |------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |----...

    2个MFC不规则Button类

    2个MFC不规则Button类,可以绘制好看的不规则按钮控件,如箭头控件。 点击按钮弹出下拉菜单

    重绘MFC ListCtrl控件

    这是一个重绘的 MFC List control 控件 ,里面包含了重绘的progress control控件、combo box控件 以及一个button 控件,可以在list control 控件的单元格中插入这些控件,便于更好的展示信息,对于初学者学习重绘...

    Visual C++MFC入门教程

    - 第四章 窗口控件|------ 4.1 Button|------ 4.2 Static Box|------ 4.3 Edit Box|------ 4.4 Scroll Bar|------ 4.5 List Box/Check List Box|------ 4.6 Combo Box/Combo Box Ex|------ 4.7 Tree Ctrl|------ 4.8...

    Visual C++ MFC入门教程[TXT]

    |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 |------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |------ ...

    C++MFC教程

    对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比较...

    结合基于对话框的MFC+opencv+OpenGL绘制球体或者读取图片

    本工具主要是利用基于...主要通过点击MFC对话框的button按钮,弹出两个非模态对话框,一个用于OpenGL显示图像,另一个设置滑动条控件控制图像的实时变换。对于各个界面的通信采用单例设置模式控制全局变量,比较方便

    MFC添加在标题栏的按钮控件

    MFC添加在标题栏的按钮控件,包含头文件和CPP文件就可以使用。派生自CButton类。所给的文件是一个MFC工程,不妨先运行试试看看效果!

    VC++6.0 从入门到精通

    |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 |------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |------ ...

    Visual C++/MFC入门教程

    ------ 3.3 使用菜单 |------ 3.4 文档,视,框架之 间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章 窗口控件 |------ 4.1 Button |...

    MFC自绘Button按钮分析和实现

    对于按压式的Button按钮,WM_CTLCOLOR无法完成按钮控件的背景颜色和字体颜色修改,若想要完成外观定制需要添加WM_DRAWITEM消息或者重写CButton类中的DrawItem函数完成按钮外观修改,下面逐一介绍。 自绘制知识基础 ...

    Button控件的字体颜色和背景颜色

    方法简单,可单控件刷新,不需要整页面OnDraw的重新绘制

    vc 在按钮上显示图标和文字

    能够在按钮上显示图标和文字,用到了CButton中的CButtonST类。在CButtonST类中对DrawItem函数进行重载,实现绘制图标的功能。

    闻怡洋VC基础教程

    --- 3.4 文档,视,框架之间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章 窗口控件 |------ 4.1 Button |------ 4.2 Static Box |------ 4.3...

    自绘圆形按钮

    用最简单的代码编写的圆形按钮。用MFC工具箱添加按钮控件,再自建新类修改按钮形状为圆形。

    如何控制列表控件的一行颜色显示

    理解这个程序的关键是理解Common控件的WM_NOTIFY消息 这个消息先发给控件自身,自己处理后再决定要不要发给父窗口。 WM_NOTIFY的消息通知码有很多种,如下表 Notification Sent When NM_CLICK The control is clicked...

    vc++曲线图绘制和动态html对话框和定制button

    1、一个像windows任务管理器中网络属性页中的本地连接类似的图表控件,可以设置横纵坐标,可以同时绘制两条以上的不同颜色的曲线,源代码的MFC类。 2、使用CHTMLDialog,显示Html页,且能实现HTML动态显示,交互,...

Global site tag (gtag.js) - Google Analytics