之前写过一个自绘的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. document.addEventListener理解

    document.addEventListener("事件名称", 函数, false); function 某函数(event){ // 方法执行 } addEventListe ...

  2. PBOC2.0与3.0的区别

    一.PBOC规范颁布的历程 1997年12月,PBOC V1.0  定义了五个方面的事项  电子钱包/电子存折应用(EP,ED)  卡片和终端的接口  卡片本身的技术指标  应用相关的交易流程  终端 ...

  3. 【Convert Sorted Array to Binary Search Tree】cpp

    题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...

  4. 使用sqlserver日期函数获取当前日期

    使用sqlserver日期函数中的getdate()可以获取当现的日期,下面就将为您介绍这种使用sqlserver日期函数获取当前日期的方法,供您参考,希望对您学习sqlserver日期函数有所启迪. ...

  5. Codeforces Beta Round #69 (Div. 1 Only) C. Beavermuncher-0xFF 树上贪心

    题目链接: http://codeforces.com/problemset/problem/77/C C. Beavermuncher-0xFF time limit per test:3 seco ...

  6. Codeforces Round #353 (Div. 2) C Money Transfers

    题目链接: http://www.codeforces.com/contest/675/problem/C 题意: 给一个数组,每个数与他相邻的数相连,第一个与最后一个相连,每个数的数值可以左右移动, ...

  7. 【Python】多线程编程

    1.thread模块 2.threading模块 3.Queue模块与多线程互斥 简介: thread和threading模块允许创建和管理线程,thread模块提供了基本的线程和锁的支持,而thre ...

  8. Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal

    原题地址 二叉树基本操作 [       ]O[              ] [       ][              ]O 代码: TreeNode *restore(vector<i ...

  9. Leetcode#56 Merge Intervals

    原题地址 排序+合并,没啥好说的 第一次尝试C++的lambda表达式,有种写js的感觉,很神奇 c11就支持了lambda表达式,仔细想想,我学C++大概就是在09~10年,c11还没有发布,不得不 ...

  10. A*(A星)算法python实现

    在春节放假前两天我偶然看到了A\*算法(A\*算法是一个启发式的地图寻路算法),感觉挺有意思.正好放假前也没有什么事情,就花了一个下午写出算法的骨架,节后又花了半天时间完善屏幕输出的细节并且调试完成. ...