自绘按钮中注意的问题(DrawItem)

今天从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!

今天从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!


相关内容

  • 房建施工投标工具使用手册
  • 乌鲁木齐房建施工电子投标工具 使用手册 广联达软件股份有限公司 2015-9-1 一.概述 1.本使用手册编写目的 本手册的阅读对象为:投标人. 请各制作人认真阅读,以便能够准确高效的完成标书制作. 系统功能和模块在不同时期可能略有差别,请以正式发布的为准. 二.投标文件操作指南 1.新建项目 功能 ...

  • 加样器的使用及注意事项
  • 加样器的使用及注意事项 方法一:前进移液法(适用于常规液体移取) 1.将加样枪刻度或读数调至所需定量吸取的液体量值,并装上合适的吸头. 2.将按钮压至第一停点位置(有明显的阻滞感)并保持,以挤出吸头内空气,形成吸头内负压. 3.将吸头浸入待移取的液体液面下2-3毫米深处,然后慢慢松开按钮,液体在大气 ...

  • 龙教版信息技术九年级上全部教案
  • 第一课 [教学目标] 1.知识与技能 画像 ◆认识 Flash 8 的开始页.程序窗口: ◆掌握工具面板中绘图.颜色.选取等部分工具的操作: ◆熟悉制作基本图画的方法. 2.过程与方法 ◆通过绘制画像,掌握工具面板中相应工具的使用: ◆通过学生自主探究,熟悉制作基本图画的方法. 3.情感态度与价值观 ...

  • 职校毕业生电工实训报告
  • 一、实训目的 电工实习是职业教育中的重要实践教学环节。它对学生掌握基本的理论知识,运用基本知识,训练基本技能,增强实践能力,对达到职业教育培养目标的要求有着十分重要的意义和作用。而对于我们即将毕业的学生来说,实习的意义更加重大。它是我们从学校走向社会工作岗位的一个纽带和桥梁,是我们由学生角色向工人角 ...

  • 中国石化用户统一身份管理系统-自助服务使用手册
  • 中国石化胜利油田分公司 中国石化统一用户身份管理系统 用户自服务手册 胜利油田分公司信息化管理中心 2016年5月 目 录 1. 系统介绍 ................................................................ 4 2. 自服务平台介绍 .. ...

  • Word基础知识学习
  • Word 基础知识学习 word基础教程---word实用技巧---去掉页眉中的黑线 在编辑一些word文档时,为了页面的清晰美观,常常要加上页眉,可是,当我们想取消页眉内容的时候,常常会发现一个问题,页眉底下的黑线总是存在,影响到整个页面的美观.所以这里我告诉大家,怎么才能够去掉它(利用这种方法也 ...

  • 青岛市房地产网上报表
  • 青岛市房地产网上报表 企业(客户端)使用说明书 青岛市统计局 青岛锐普信息科技有限公司 业务咨询电话:85912253 技术服务电话:85912248 2006年6月 目 录 一. 二. 三. 使用要求 ................................................ ...

  • 毕业论文设计问卷调查页
  • 毕业论文 设计问卷调查页 问卷调查活动是各种商业活动或社会活动中最常见的反馈信息收集方式.其往往可以帮助活动的组织者获得第一手的反馈资料,了解用户.民众对某一些事务的观感和感受.问卷调查页是通过网页进行问卷调查的一种方式,相对传统的问卷调查,使用网页可以降低调查活动的成本,同时也节省了用户填写调查表 ...

  • VB- 工具栏.对话框
  • 工具栏 可以用工具栏进一步增强应用程序的菜单界面.工具栏含有工具栏按钮,它提供了对于应用程序中最常用的命令的快速访问.例如:Visual Basic 的工具栏含有执行常用命令的 ToolBarButton,如"打开"(打开已存在的工程)."保存"(存储当前的工 ...