【转】MSDN中关于OnDrawItem的说明

afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );

Parameters

nIDCtl

      存储发送WM_DRAWITEM 消息的控件ID,如果是菜单发送的,nIDCtl 的值为0。

lpDrawItemStruct

      一个指向DRAWITEMSTRUCT 结构体的指针,该结构体保存有关要被绘制的项目与绘制所需要的类型等星系。

Remarks

当自绘按钮(owner-draw button),下拉列表框(combo box),列表框(list box)视觉属性,或者菜单发生变化时,框架为他们的owner调用该函数。

DRAWITEMSTRUCT结构的itemAction 成员定义了要进行的绘制操作行为。该值确定了所需的绘制动作。

在处理完此消息之前,应用程序应当确保由DRAWITEMSTRUCT 结构的成员hDC 标识的设备上下文还原到默认状态。

如果上面结构的成员hwndItem 指向CButtonCMenuCListBox或者CComboBox 对象,那么就调用相应类的DrawItem 虚函数。重载相应类的DrawItem 成员函数来绘制各个项。

 

其他的一些说明:

OnPaint()这个函数是在已经有形的控件上进行画图的      
  OnPaint()  
  {  
      在这里只是画原控件没有的图形  
  }  
   
  OnDrawItem()这个函数是自已去绘画一个控件,根据你想要的形状,图案.它是建立一个控件的外表而用到的

 

可以这样理解,OnDrawItem是画窗口中的子控件的,因为它的入口参数LPDRAWITEMSTRUCT带入不同子控件的相关参数,而且,你得把字控件设置成“自画”类型,才会调用到OnDrawItem,顺便说一下自画,不是所有设置成自画类型的控件都会调用父窗口的OnDrawItem,例如ListBox的自画,你就必须重载CListBox的DrawItem方法和MeasureItem方法才可以,但象菜单,按钮等的自画则会调用OnDrawItem。OnPaint和OnDrawItem不在一个范畴内,他是WM_PAINT的响应函数,凡是基于CWnd的类都有OnPaint事件发生,就是说凡是窗口都有WM_PAINT事件发生。(不知道我理解的对不对)

转载于:https://www.cnblogs.com/sqzxcv/archive/2009/12/06/1618117.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MFC,如果想要自定义绘制一个控件的外观,可以通过重载控件的OnDrawItem函数来实现。OnDrawItem函数是在WM_DRAWITEM消息处理程序被调用的,它提供了一个CDC类对象,可以用它来绘制自己的控件。 下面是一个简单的示例代码: 首先在资源文件将按钮的Style属性设置为OwnerDraw,然后在窗口类的头文件添加下面的声明: ```c++ afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); ``` 然后在窗口类的实现文件添加下面的函数定义: ```c++ void CMyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { if (nIDCtl == IDC_MY_BUTTON) // IDC_MY_BUTTON是按钮的ID { CDC dc; dc.Attach(lpDrawItemStruct->hDC); // 绘制按钮的背景 if (lpDrawItemStruct->itemState & ODS_SELECTED) dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255, 0, 0)); // 设置选状态的背景颜色为红色 else if (lpDrawItemStruct->itemState & ODS_FOCUS) dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0, 255, 0)); // 设置获取焦点状态的背景颜色为绿色 else dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0, 0, 255)); // 设置普通状态的背景颜色为蓝色 // 绘制按钮的文本 CString strText; GetDlgItemText(IDC_MY_BUTTON, strText); // 获取按钮的文本 CRect rect = lpDrawItemStruct->rcItem; dc.SetTextColor(RGB(255, 255, 255)); // 设置文本颜色为白色 dc.DrawText(strText, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // 居绘制文本 dc.Detach(); } } ``` 在上面的代码,我们首先判断当前消息所涉及的控件是否是我们要处理的按钮,然后根据按钮的状态设置对应的背景颜色,最后绘制文本。 需要注意的是,在使用CDC类对象绘制控件时,不要忘记在函数结束时调用Detach()函数,以释放关联的DC对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值