之前写过一个自绘的CListBox类,详细请参考http://blog.csdn.net/VisualEleven/archive/2010/10/12/5935430.aspx
现在修改这之前的代码,使该CListBox能够支持多行显示的问题。

  1. // 重写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_WORDBREAK);
  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. // 重写MeasureItem虚函数
  53. void CNewListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  54. {
  55. // TODO: Add your code to determine the size of specified item
  56. ASSERT(lpMeasureItemStruct->CtlType == ODT_LISTBOX);
  57. LPCTSTR lpszText = (LPCTSTR) lpMeasureItemStruct->itemData;
  58. ASSERT(lpszText != NULL);
  59. CRect rect;
  60. GetItemRect(lpMeasureItemStruct->itemID, &rect);
  61. CDC* pDC = GetDC();
  62. lpMeasureItemStruct->itemHeight = pDC->DrawText(lpszText, -1, rect, DT_WORDBREAK | DT_CALCRECT);
  63. ReleaseDC(pDC);
  64. }
  65. // 调用方法
  66. CNewListBox m_listBox; // 成员变量
  67. #define IDC_LISTBOX 0x1010
  68. m_listBox.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL |
  69. LBS_OWNERDRAWVARIABLE , CRect(0, 0, 300, 200), this, IDC_LISTBOX);
  70. for(int i=0; i<10; i++)
  71. {
  72. if(i%2)
  73. m_listBox.AddString(_T("Hello,World1/r/nHello,World2"));
  74. else
  75. m_listBox.AddString(_T("Hello,World"));
  76. }

效果图如下所示:

 
 

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

简单的自绘CListBox(多行显示)(覆盖DrawItem函数,然后用CDC绘制)的更多相关文章

  1. 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)

    运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...

  2. 简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

    [cpp] view plain copy //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下: void CNewListBo ...

  3. LaTeX中表格多行显示的最简单设置方法

    这事实上是一个非常easy的问题,可是这两天发现我之前的解决方式太麻烦了.简介一下这样的最简单的方法: 之前设置多行显示的时候,用类似于以下这样的方法进行多行显示: \begin{table} \ne ...

  4. visual studio 编辑窗口 设置固定选项卡 使窗口选项卡多行显示

    工具>选项> 确定后 如图就可以多行显示了.

  5. css多行显示省略号

    首先说css多行显示省略号和单行文本省略号: 我们知道,单行显示省略号时,我们首先需要设置容器的宽度width:value(具体的值),然后强制文本在一行内显示,即white-spacing:nowr ...

  6. CSS移动端多行显示多余省略号

    /*css3 多行显示省略号,也可用于单行*/ .one-line { display: -webkit-box; overflow : hidden; text-overflow: ellipsis ...

  7. windows下cmd命令行显示UTF8字符设置(CHCP命令)

    本文由 www.169it.com 收集整理 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下 ...

  8. Android的有关EditText的能多行显示但无法禁止自动换行的Bug!

    需求: 使 EditText或TextView 支持 多行显示,但是不自动换行,即能水平滚动较长的内容. Bug: 想当然的,在XML定义中设置如下,应该就可以了. android:scrollHor ...

  9. Html+Css+Js_之table每隔3行显示不同的两种颜色

    <html> <head> <script type="text/javascript"> /** 最近因项目的需求,有这样的一个问题: 一个t ...

随机推荐

  1. php对象

    在php中,必须使用class关键字明确的声明对象,然后在对象类中定义数据类型和方法. 示例: class Color{ public $value; public static $RED = &qu ...

  2. C++中的static关键字(转)

    原出处:http://blog.csdn.net/hackbuteer1/article/details/7487694 C++的static有两种用法:面向过程程序设计中的static和面向对象程序 ...

  3. 移植net-snmp到开发板(mini210)

    1.安装交叉编译工具arm-linux-gcc 2.下载net-snmp源码安装包 3.解压安装包 4../configure --build=i686-linux --host=arm-linux ...

  4. PSP0表格二

    一 项目计划日志 周活动总结表 姓名: 陆宇 日期:2015. 3. 21 日期       任务 听课 编写程序 阅读课本 准备考试 日总计/(min) 周日 60 30 90 周一 300 0 1 ...

  5. 软件工程随堂小作业——(C++)

    一.设计思路 本来我的思路是根据上楼的人数和上楼的层数来计算出平均值,但是我发现这个思路不对.于是我选择了最笨的方法,复杂度为O(n2). (1)输入坐电梯的人数和要去的楼层: (2)找到输入楼层里最 ...

  6. android 系统应用在运行时被卸载

    android 系统应用在运行时被rm 掉了,是否还会运行? 环境:root,且开机运行 经过试验,apk本身是在 /system/app 目录下面,且apk已经运行了,这个时候直接 rm /syst ...

  7. 9、android开发之java.lang.verifyError(转载)

    原文链接: http://www.linuxidc.com/Linux/2012-08/67289.htm 解决方案: 最近在做一个Android开发小项目的时候,遇到java.lang.verify ...

  8. MySQL数据库远程连接开启方法

    有时候需要远程连接mysql数据库,默认是不可以的,可以参考下面的方法,解决下. 1.登陆自己机器的MySQL数据库:mysql -uroot -p密码 设置root用户可以任意IP访问,代码如下(可 ...

  9. Window.document对象(1)

    1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:     var a =docunme ...

  10. Linux 下Valgrind 使用

    Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内 ...