[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. Apache 2.4 多站点配置记录

    基于域名的虚拟主机配置 <VirtualHost *:80> DocumentRoot /var/www/cms ServerName www.example.com RewriteEng ...

  2. linux发展前景如何?

    2014-01-09 18:54Linux将不会取代Windows成为主流的桌面操作环境, 但它很有可能在信息接入设备中独霸天下. 为什么Linux无法取代Windows呢?最主要的原因是大多数最终用 ...

  3. 重绘panel控件,实现panel的阴影效果

    最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...

  4. hadoop自动安装的脚本与步骤

    最近要在10几台机器上安装hadoop.对于这种繁复而重复的工作,一步步的打命令行,对于程序员来说是一件不能忍的事情.所以我就琢磨着怎么写一个脚本来自动安装hadoop. 任务: 在10几台机器上中的 ...

  5. 在Web API中使用Swagger-UI开源组件(一个深坑的解决)

    介绍: Swagger-Ui是一个非常棒的Web API说明帮助页,具体详情可自行Google和百度. 官网:http://swagger.io/    GitHub地址:https://github ...

  6. ubuntu: 环境搭建

    1.修改更新源    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak    sudo gedit /etc/apt/sources.li ...

  7. Lua基础之字符串(string)

    1,计算字符串长度 2,返回字符串s的n个拷贝 3,返回字符串全部字母大写 4,返回字符串全部字母小写 5,返回一个类似printf的格式化字符串 6,根据下标截取字符串 7,在字符串中查找 8,在字 ...

  8. 自选项目--手机锁屏软件--NABC分析

    N(Need 需求) 关键字:利用碎片时间加强对想记的事物的记忆.备忘.一般来说,锁屏目的大致有三点: 1.保护手机隐私 2.防止误操作手机 3.在不关闭系统软件的情况下节省电量 对于市面上已有的锁屏 ...

  9. 【转】HTTP-only Cookie 脚本获取JSESSIONID的方法

    彻底避免xss攻击的方法. 别人可以通过注入js脚本获取你的session cookie,如果幸运的话还可以获取通过js遍历你的dom树获取你的用户的用户名和密码. 如果只是通过正则表达式验证输入的话 ...

  10. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...