原文链接: 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的更多相关文章

  1. 重绘控件中OnPaint、OnDraw、OnDrawItem和DrawItem的区别

    ==================================================================================================== ...

  2. TabControl控件的DrawItem事件怎么注册

    只有DrawMode等于OwnerDrawFixed时,才会在绘制选项卡时发生DrawItem事件tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;

  3. 简单的自绘CListBox(多行显示)(覆盖DrawItem函数,然后用CDC绘制)

    之前写过一个自绘的CListBox类,详细请参考http://blog.csdn.net/VisualEleven/archive/2010/10/12/5935430.aspx现在修改这之前的代码, ...

  4. 自绘CListCtrl类,重载虚函数DrawItem

    //自绘CListCtrl类,重载虚函数DrawItem void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TOD ...

  5. 简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

    [cpp] view plain copy //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下: void CNewListBo ...

  6. WM_DRAWITEM与DrawItem()的讨论(自绘)

    http://blog.csdn.net/FlowShell/archive/2009/10/10/4648800.aspx 我在学习中经常遇到要重写DrawItem()的情况,但又有一个WM_DRA ...

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

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

  8. 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)

    运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...

  9. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

随机推荐

  1. C#.NET常见问题(FAQ)-如何在不同窗体之间传递值

    最简单的方法是在定义窗体的时候就写好几个变量,在实例化Form2的时候,就把这些参数传递过去   或者你也可以定义一个类,然后通过这个类的静态变量交互(注意只能用静态的,因为Form2无法访问Form ...

  2. 【转】Java设计模式之《享元模式》及应用场景

    享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我 ...

  3. Asp.Net下通过切换CSS换皮肤

    直接重写Render事件 protected override void Render(System.Web.UI.HtmlTextWriter writer) { StringWriter sw = ...

  4. ReactJS.NET 之 Demo 初探

    ReactJS.NET 是专对 .NET 平台开发者设计,让我们不只可以在前端去Render出页面,也可以在Server端去Render页面.开发 ReactJS 可以用一般JS 库,也可以通过类似X ...

  5. WinForm 之 VS2010发布、打包安装程序

    第一步.在vs2010 打开要打包的应用程序解决方案,右键“ 解决方案 ” → “ 添加 ” → “ 新建项目 ” → “ 其他项目类型 ” → “ 安装和部署 ” → “ Visual Studio ...

  6. 【转】一些linux基础命令

    学习Linux,其实很多基础命令很重要. 不论多么复杂的shell或者命令组合,都是一个一个的拼接组合命令拼接而成: 大号一个基本功,遇到需要的场景,信手拈来,随意组合拼接,是非常重要的. 恰好看到一 ...

  7. Windows7安装UBUNTU虚拟机

    1.下载虚拟机:http://www.orsoon.com/Soft/12192.html 2.下载UBUNTU10.04:http://releases.ubuntu.com/lucid/ 3.安装 ...

  8. TxQueryRunner-JDBC小工具

    1.TxQueryRunner的简介(需要相关jar包的请留言) TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的,所以要导入comm ...

  9. tensorflow serving 编写配置文件platform_config_file的方法

    1.安装grpc gRPC 的安装: $ pip install grpcio 安装 ProtoBuf 相关的 python 依赖库: $ pip install protobuf 安装 python ...

  10. cocos2d-js 入门 (主要是HTML5)

    cocos2d-js是cocos2d-x的JavaScript版本,真正跨全平台的游戏引擎,采用原生JavaScript语言,可发布到包括Web平台,iOS,Android,Windows Phone ...