自绘WTL的CComboBox控件

这次自绘这个CComboBox控件,真是费了很长的时间,网上没找着一个合适的例子,不过还好总算给弄出来了,下面总结一下:

1,依然是继承CComboBox 和COwnerDraw两个类.然后和其他的OwnerDraw的用法基本一样
(1)在父窗口的MSG_MAP中 添加 REFLECT_NOTIFICATIONS() 
(2)在自己的新类的MSG_MAP中添加
     CHAIN_MSG_MAP_ALT(COwnerDraw, 1)
      DEFAULT_REFLECTION_HANDLER()
  并重载DrawItem函数
  你在DrawItem函数中写的重绘代码,做好这些以后呢,运行程序,你发现CComboBox并没有变样(假设要做的DropDown风格的CComboBox而且其他的属性为你都设置好了,并做好了子类化了).只有在你点击下拉按扭的时候在触发了DRAWITEM消息.
在这里要补充一点
   程序设计中组合框使用相当多,但对于组合框的结构,大部分程序设计者只知其大概,即一般的组合框是由 Edit框+ListBox框组合而成。实际情况是这样吗? 如果上面观点正确,那么就能够通过Edit指针和ListBox指针直接操做CComboBox控件了,可如何获得组合框的Edit指针和ListBox指针呢.当然情况不是这么简单的,CComboBox有三种风格Simple DropDown,DropList,我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist为静态控件.也就是说DropDown风格中包含一个Edit,而DropList风格中包含的是Static,  顺便说一下,组合框中的ListBox是在下拉时,也就是弹出ListBox时(即DropDown时)才创建的,等Listbox合起来时销毁的。
   有上面看来,我要自绘这个控件就必须分成两大块,在DrawItem 函数中绘制
ListBox,而要在父窗口的CTLCOLOREDIT消息处理函数中绘制Edit了(同样Static 要在相应的消息处理函数中绘制).再顺便说一下,你已经将CComboBox的属性设置为OwnerDraw Fixed了,你在使用CComboBox的成员函数AddString(),InSertString 添加的item就不会自动显示出来了,你必须要自己动手在DrawItem函数处理了这些item的位置和其他属性了,如果你发现显示的是乱码,可能是的ComboBox的has String 的属性你没有设置.
   CTLCOLOREDIT消息处理函数要注意的是,这里还要分为两部分来处理,一个是CComboBox 的绘制,还有就是它的子控件的绘制,下面贴了我写的代码,仅供参考
LRESULT CLoginDlg::OnCtlColorEdit(UINT , WPARAM wParam, LPARAM lParam, BOOL& )
{
 HDC hdcEdit   = (HDC)  wParam;
 HWND hwndEdit = (HWND) lParam;
    if(hwndEdit == m_ComboBox.GetWindow(GW_CHILD).m_hWnd)
 {
  //绘制Edit,这里我在只是改变了背景色
  HBRUSH m_hBrush = NULL;
  m_hBrush = ::CreateSolidBrush(RGB(216,216,216));
  SetBkMode(hdcEdit, TRANSPARENT);
  //SetBkColor(hdcEdit, m_UserName.Bkcol); //设置为透明,这句就没用了
  SetTextColor(hdcEdit, RGB(0,20,245));
  return ((LRESULT) m_hBrush);
 }
 else if(hwndEdit==m_ComboBox.m_hWnd)
 { 
  //绘制ComboBox
  HBRUSH m_hBrush = NULL;
  m_hBrush = ::CreateSolidBrush(RGB(216,216,216));
  CDCHandle dc = hdcEdit;
  CDC dcMem;
  dcMem.CreateCompatibleDC(dc);
  dc.SaveDC();
  dcMem.SaveDC();
  dcMem.SelectBitmap (m_DropDown);
  CRect rect;
  ::GetClientRect(hwndEdit,&rect);
  dc.FillSolidRect(&rect, RGB(216,216,216));
  //绘制下拉按钮
  dc.BitBlt( rect.right-19,2, 16, 17, dcMem, 0, 0, SRCCOPY); 
  return ((LRESULT) m_hBrush); 
 }
 return 0;
}
你如果少处理edit的,你可以试一下,你会发现 Edit周围让你绘制好了,就是那个可编辑的区域还是白色了.下面是程序的截图:
  自绘WTL的CComboBox控件
 
这张图片是从网上找来的,如果不妥的地方,请给我发邮件通知我,我核实后立即删除
Cedit控件的绘制,就和ComboBox中处理Edit一样,
Check控件,我是用button 来代替的.
非客户区自绘wtl版本指的是在Windows模板库(WTL)基础上通过自主绘制非客户区来定制界面的版本。 WTL是一个开源的C++模板库,用于简化Windows桌面应用程序的开发。它相较于MFC更轻量级,更容易学习和使用。WTL提供了一系列的模板类和宏,可以快速开发具有Windows UI风格的应用程序。 在WTL中,非客户区(Non-Client Area)是指窗口边框以及标题栏、菜单栏、状态栏等装饰性的部分。传统上,这部分通常由操作系统负责绘制和管理。但是对于一些特殊需求,比如自定义的窗口样式、非矩形窗口等,我们需要对非客户区进行自主绘制。 非客户区自绘wtl版本即是基于WTL框架,在需要自定义非客户区的情况下,通过手动绘制实现。这种方式需要重载WTL框架中的非客户区绘制相关的函数,比如`OnNcPaint()`、`OnNcCalcSize()`等,来处理非客户区的绘制逻辑。 非客户区自绘wtl版本的好处在于可以完全控制非客户区的外观。可以根据自己的需要,实现各种特殊的样式和效果,如渐变色、图案填充、自定义按钮等。这样可以使应用程序更加美观和独特,增强用户体验。 但是非客户区自绘wtl版本也存在一些挑战。首先,自绘非客户区需要较高的绘制技术和图形处理能力。其次,自绘非客户区还会涉及到一些与系统相关的问题,如窗口移动、窗口关闭等操作的处理。因此,需要对WTL框架有较深入的理解和熟练的编程技巧。 总之,非客户区自绘wtl版本是在WTL框架基础上,通过自主绘制实现自定义非客户区的一种方式。它可以让我们灵活控制非客户区的外观,提升应用程序的美观程度和用户体验。然而,也需要考虑到相关的技术和系统问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值