[cpp] view plain copy

  1. //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下:
  2. void CNewListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  3. {
  4. // TODO: Add your code to draw the specified item
  5. ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
  6. LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData;
  7. ASSERT(lpszText != NULL);
  8. CDC dc;
  9. dc.Attach(lpDrawItemStruct->hDC);
  10. // Save these value to restore them when done drawing.
  11. COLORREF crOldTextColor = dc.GetTextColor();
  12. COLORREF crOldBkColor = dc.GetBkColor();
  13. // If this item is selected, set the background color
  14. // and the text color to appropriate values. Also, erase
  15. // rect by filling it with the background color.
  16. if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
  17. (lpDrawItemStruct->itemState & ODS_SELECTED))
  18. {
  19. dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  20. dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
  21. dc.FillSolidRect(&lpDrawItemStruct->rcItem,
  22. ::GetSysColor(COLOR_HIGHLIGHT));
  23. }
  24. else
  25. {
  26. if(lpDrawItemStruct->itemID%2)
  27. dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));
  28. else
  29. dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));
  30. }
  31. // If this item has the focus, draw a red frame around the
  32. // item's rect.
  33. if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
  34. (lpDrawItemStruct->itemState & ODS_FOCUS))
  35. {
  36. CBrush br(RGB(0, 0, 128));
  37. dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
  38. }
  39. lpDrawItemStruct->rcItem.left += 5;
  40. // Draw the text.
  41. dc.DrawText(
  42. lpszText,
  43. strlen(lpszText),
  44. &lpDrawItemStruct->rcItem,
  45. DT_LEFT|DT_SINGLELINE|DT_VCENTER);
  46. // Reset the background color and the text color back to their
  47. // original values.
  48. dc.SetTextColor(crOldTextColor);
  49. dc.SetBkColor(crOldBkColor);
  50. dc.Detach();
  51. }
  52. void CNewListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  53. {
  54. // TODO: Add your code to determine the size of specified item
  55. ASSERT(lpMeasureItemStruct->CtlType == ODT_LISTBOX);
  56. LPCTSTR lpszText = (LPCTSTR) lpMeasureItemStruct->itemData;
  57. ASSERT(lpszText != NULL);
  58. CSize   sz;
  59. CDC*    pDC = GetDC();
  60. sz = pDC->GetTextExtent(lpszText);
  61. ReleaseDC(pDC);
  62. lpMeasureItemStruct->itemHeight = 2*sz.cy;
  63. }
  64. // 其中m_listBox为CNewListBox类型的对象
  65. #define IDC_LISTBOX 0x1101
  66. m_listBox.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|
  67. LBS_OWNERDRAWVARIABLE, CRect(0, 0, 380, 280), this, IDC_LISTBOX);

效果图如下所示:

http://blog.csdn.net/visualeleven/article/details/5935430

简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数的更多相关文章

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

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

  2. Ubuntu虚机中SVN连接出错,虚机本机可正常CO,CIN,解决方法

    Ubuntu虚机中SVN连接出错,虚机本机可正常CO,CIN,外面机器无法正常连接. 解决: 虚机换个IP即可正常连接,原因不明,有可能为公司网管对该IP做了某些限制. PS:VMware中只需将网络 ...

  3. Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构

    Batch Normalization Batch Normalization是深度学习领域在2015年非常热门的一个算法,许多网络应用该方法进行训练,并且取得了非常好的效果. 众所周知,深度学习是应 ...

  4. C++ 虚函数表与多态 —— 多重继承的虚函数表 & 内存布局

    多重继承的虚函数表会有两个虚表指针,分别指向两个虚函数表,如下代码中的 vptr_s_1.vptr_s_2,Son类继承自 Father 和 Mather 类,并且改写了 Father::func_1 ...

  5. Python中使用cutecharts实现简单的手绘风格的图表

    场景 效果 cutecharts的Github: https://github.com/chenjiandongx/cutecharts 注: 博客: https://blog.csdn.net/ba ...

  6. 简单的class及运算符重载

    #include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...

  7. C#通过重载构造函数传递参数、实现两个窗体下的方法的互相调用

    直接切入主题 有时候同一个项目下我们可能会使用多个窗体,窗体间方法互相调用也不可避免,好了,使用无参无返回值的方法,开始上图 1.新建一个winform项目Form1,并再添加一个窗体Form2:拖入 ...

  8. <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数

    说起反射之前和很多用C#/.net的同仁们一样,相比于一般应用层对数据的增删改查总有点觉得深奥到难以理解.其实程序这东西,用过.实践过就很简单,我一直这么认为. 先说下概念:反射 Reflection ...

  9. kvm 虚机环境碰到的两个小坑

    1)当部署一个商用VA的时候,出现virsh version|grep "Using library" 返回错误,经过查看,发现里面有汉字,猜应该是这个原因导致无法检索到libvi ...

随机推荐

  1. CentOS如何分区

    安装Linux CentOS时,需要在硬盘建立CentOS使用的分区,在大多情况下,至少需要为CentOS建立以下3个分区. (1)/boot分区(不是必须的):/boot分区用于引导系统,它包含了操 ...

  2. extjs的combobox的用法

    可以用javascript的数组作为数据源,也可以用json作为数据源: 1.用javascript数组 var CountryCode = [ ['93','Afghanistan(93)'], [ ...

  3. 为checkboxSelectionModel赋值

    store.on('load', function(store, records, options) { sm.clearSelections();   //清空数据 Ext.each(records ...

  4. openerp学习笔记 计算字段支持搜索

    示例1: # -*- encoding: utf-8 -*-import poolerimport loggingimport netsvcimport toolslogger = netsvc.Lo ...

  5. mac常用设置

    1.修改mac主机名 系统偏好设置->共享->电脑名称 ,编辑就可以了. sudo scutil --set HostName hostname 这个是修改主机名 sudo scutil ...

  6. ActiveMQ之deliveryMode

    在下面的例子中,分别发送一个Persistent和nonpersistent的消息,然后关闭退出JMS. import javax.jms.Connection;import javax.jms.De ...

  7. c位段

    假如程序表示四盏灯的开关状态灯只有开或关两种状态所以用1和0就可以表示为了节省内存就用一个二进制位表示一盏灯这里就定义位域用 a b c d 各表示一盏 这里定义时注意选用无符号类型位域允许用各种格式 ...

  8. 全部快捷方式图标变成LNK文件怎么办

    windowsLNK文件打开方式恢复 相信有些用户曾试过错误地把LNK文件打开方式更改其文件导致系统所有快捷方式都失效vista与Windows7系统还普遍使用时候相信大家会有点惊慌失措要紧下面只要大 ...

  9. c# this.location和e.X的区别

    this.location是窗口当前位置 e.X是具体事件的相对坐标 size是窗口尺寸宽和高

  10. C# type - IsPrimitive

    Type t = typeof(string); if (t.IsPrimitive)//not { Console.WriteLine("string is a Primitive&quo ...