DrawItem
原文链接: http://blog.csdn.net/jiftlixu/article/details/4893505
今天从CButton派生了一个类CUIButton,主要用于自绘,按照基本的流程,重写DrawItem方法。
步骤如下:点击CUIButton按钮,在右键弹出菜单中选择“add windows message Handler",
找到DrawItem,为其添加消息映射,添加的代码如下:
void CUIButton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
结果在使用到CUIButton的地方用SubClassDlgItem就会出问题。
后来调试发现,不应该按照上面的添加此消息的映射,而是为CUIButton类重写DrawItem函数,添
加方法:
在类CUIButton右键,在弹出菜单中选择"Add Virtual Function",弹出的添加虚函数框中选
择"DrawItem",向导为我们生成的代码如下:
void CUIButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
在这里添加所需的自绘代码就ok了
附: how to implement control to self-draw
1、从CButton类派生自己的CUIControl类
2、借助于MFC向导生成工具,为期添加虚函数DrawItem()和OnEraseBkgnd()。
注意:DrawItem()是控件重定义的函数,不是OnDrawItem()。
3、在DrawItem()中近控件的自绘处理,这里给出一个实例代码,用于一个自定义Button,在
Button上面绘图:
void CUIButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
//CButton::OnDrawItem(nIDCtl, lpDrawItemStruct);
int nCxIcon = ::GetSystemMetrics(SM_CXICON);
int nCyIcon = ::GetSystemMetrics(SM_CYICON);
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,nCxIcon,nCyIcon);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = (CBitmap *)dcMem.SelectObject(bitmap);
ASSERT(pOldBitmap);
HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
ASSERT(hIcon);
CRect rcClient;
GetClientRect(&rcClient); // get the button's rect
dcMem.StretchBlt(0,0,nCxIcon,nCyIcon,pDC,2,2,rcClient.Width() - CX_SHADOW - 4,
rcClient.Height() - CY_SHADOW - 4,SRCCOPY);
dcMem.DrawIcon(0,0,hIcon);
// draw border around icon
CPen pen;
pen.CreateStockObject(BLACK_PEN);
ASSERT(pDC != NULL);
CPen* pPenOld = pDC->SelectObject(&pen);
pDC->Rectangle(0, 0, rcClient.Width()-CX_SHADOW, rcClient.Height()-CY_SHADOW);
if (pPenOld)
pDC->SelectObject(pPenOld);
//pDC->StretchBlt(0,0,80,80,&dcMem,0,0,nCxIcon,nCyIcon,SRCCOPY);
pDC->StretchBlt(2,2,rcClient.Width() - CX_SHADOW - 4,rcClient.Height() - CY_SHADOW - 4,&dcMem,0,0,nCxIcon,nCyIcon,SRCCOPY);
}
4、为OnEraseBkGround()添加代码。这里很简单,直接返回True即可:
BOOL CUIButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
//return CButton::OnEraseBkgnd(pDC);
}
5、在你的对话框中使用CUIButton按钮,首先在dialog资源中添加一个按钮(CButton)。
6、在对话框类的头文件中定义一个成员CUIButton m_CtlUIBtn;注意变量的类型是CUIButton而
不是CButton
7 、在OnInitDialog中用SubClass技术:
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_CtlUIButton.SubclassDlgItem(IDC_UI_BUTTON,this);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
that is OK!
DrawItem的更多相关文章
- 重绘控件中OnPaint、OnDraw、OnDrawItem和DrawItem的区别
==================================================================================================== ...
- TabControl控件的DrawItem事件怎么注册
只有DrawMode等于OwnerDrawFixed时,才会在绘制选项卡时发生DrawItem事件tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
- 简单的自绘CListBox(多行显示)(覆盖DrawItem函数,然后用CDC绘制)
之前写过一个自绘的CListBox类,详细请参考http://blog.csdn.net/VisualEleven/archive/2010/10/12/5935430.aspx现在修改这之前的代码, ...
- 自绘CListCtrl类,重载虚函数DrawItem
//自绘CListCtrl类,重载虚函数DrawItem void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TOD ...
- 简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数
[cpp] view plain copy //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下: void CNewListBo ...
- WM_DRAWITEM与DrawItem()的讨论(自绘)
http://blog.csdn.net/FlowShell/archive/2009/10/10/4648800.aspx 我在学习中经常遇到要重写DrawItem()的情况,但又有一个WM_DRA ...
- VC++中关于控件重绘函数/消息 OnPaint,OnDraw,OnDrawItem,DrawItem的区别
而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息. OnDraw()是CVIEW的成员函数,并且没有响应消息的功能.这就是为什么你用VC成的程序代码时,在视图类只有OnDraw ...
- 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)
运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
随机推荐
- JAVA 报错exe4j中this executable was created with an evaluation 怎么办
如果使用未破解注册的exe4j打包JAR文件为EXE,运行EXE的时候就会出现下面的提示 打开exe4j软件,Change License或者是输入序列号,然后用注册机算一个注册码即可
- Awk使用及站点日志分析
Awk使用及站点日志分析 Awk简单介绍 概述 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入, ...
- JDK5.0 特性-线程 Condition
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291471.html import java.util.concurrent.Executor ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- python中string和十六进制、二进制互转
def str_to_hex(s): return ' '.join([hex(ord(c)).replace('0x', '') for c in s]) def hex_to_str(s): re ...
- sync_binlog
sync_binlogMySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去.虽然binlog也有binlog cache,但是MySQL并没有控制binlog cache ...
- android 安装调试第三方应用失败
Android Studio 3.0会在debug apk的manifest文件application标签里自动添加 android:testOnly="true"属性,导致IDE ...
- golang 面试
1) 基础语言描述理解考察https://www.tutorialspoint.com/go/go_interview_questions.htm这里有一栏.全面的问答,并且非常基础也包括golang ...
- java 如何对由json对象构成的数组形式的字符串进行遍历?
1.情景展示 现在已知字符串为: [{"name":"微微笑","img":"http://zos.alipayobjects ...
- SUMIF
SUMIF(range,criteria,sum_range) Range:条件区域,用于条件判断的单元格区域. Criteria:求和条件,由数字.逻辑表达式等组成的判定条件.criteria 参数 ...