Windows界面编程第八篇 listbox彩色显示隔行变色

在CSDN论坛上看到很多询问如何设置listbox的颜色,如何让listbox隔行变色等等。因此专门写了一篇《Windows界面编程第八篇 listbox彩色显示隔行变色》来为大家解惑。

       首先看看下图(如果看不到,可以通过地址http://blog.csdn.net/morewindows/article/details/8656061访问)。

要设置listbox的颜色及让listbox隔行变色主要是通过处理WM_DRAWITEM消息,这个消息在MSDN的解释如下:

The WM_DRAWITEM message is sent to the parent window of an owner-drawn button, combo box, list box, or menu when a visual aspect of the button, combo box, list box, or menu has changed.

通过这个消息最主要可以得到一个DRAWITEMSTRUCT类型的结构体。这个结构体的原型如下:

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

typedef structtagDRAWITEMSTRUCT {

   UINTCtlType;

   UINTCtlID;

   UINTitemID;

   UINTitemAction;

   UINTitemState;

   HWNDhwndItem;

   HDChDC;

   RECT rcItem;

   ULONG_PTRitemData;

}DRAWITEMSTRUCT;

这个结构体比较复杂,功能也很强大。全部记住它的功能是不必要的。因此直接查看下如何设置listbox的颜色,如何让listbox隔行变色这两个功能是如何完成的即可。完整代码+注释如下(可以直接到http://download.csdn.net/detail/morewindows/5128660(免积分)下载)。

  1. //Windows界面编程第八篇 listbox彩色显示隔行变色 
  2. //http://blog.csdn.net/morewindows/article/details/8656061 
  3. //By MoreWindows-(http://blog.csdn.net/MoreWindows) 
  4. #include "stdafx.h" 
  5. #include "resource.h" 
  6.  
  7. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam); 
  8. //使窗口居中 
  9. void CenterWindow(HWND hwnd); 
  10.  
  11. int APIENTRY WinMain(HINSTANCE hInstance, 
  12.                      HINSTANCE hPrevInstance, 
  13.                     LPSTR     lpCmdLine, 
  14.                      int       nCmdShow) 
  15.     // TODO: Place code here. 
  16.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); 
  17.     return 0; 
  18.  
  19. constint MAX_NUMBER = 8; 
  20. constint MAX_STRING_LEN = 50; 
  21. constchar STR_TEXT[MAX_NUMBER][MAX_STRING_LEN] = { 
  22.     "MoreWindows",  
  23.     "Master"
  24.     "blog.csdn.net/MoreWindows",  
  25.     "weibo.com/MoreWindows"
  26.     "Windows界面编程"
  27.     "秒杀多线程面试题系列"
  28.     "Windows界面编程第八篇"
  29.     "listbox彩色显示隔行变色" 
  30. }; 
  31. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam) 
  32.     static HWND s_hLBColorListBox; 
  33.     switch (message) 
  34.     { 
  35.     case WM_INITDIALOG: 
  36.         { 
  37.             CenterWindow(hDlg); 
  38.             s_hLBColorListBox = GetDlgItem(hDlg, IDC_LB_COLORLISTBOX); 
  39.             //添加数据 
  40.             for (int i = 0; i < MAX_NUMBER; i++) 
  41.                 SendMessage(s_hLBColorListBox, LB_ADDSTRING, 0, (LPARAM)STR_TEXT[i]); 
  42.         } 
  43.         return FALSE; 
  44.          
  45.          
  46.     case WM_COMMAND: 
  47.         switch (LOWORD(wParam)) 
  48.         { 
  49.         case IDOK: 
  50.         case IDCANCEL: 
  51.             EndDialog(hDlg, FALSE); 
  52.             return TRUE; 
  53.  
  54.         case IDC_LB_COLORLISTBOX:  //listbox control ID 
  55.             switch (HIWORD(wParam)) 
  56.             { 
  57.             case LBN_DBLCLK:   //双击事件 
  58.                 {    
  59.                     char szBuffer[MAX_STRING_LEN]; 
  60.                    int nCurSel = SendMessage(s_hLBColorListBox, LB_GETCURSEL, 0, 0); 
  61.                     SendMessage(s_hLBColorListBox, LB_GETTEXT, (WPARAM)nCurSel, (LPARAM)szBuffer); 
  62.                     MessageBox(NULL, szBuffer,"listbox item", MB_OK); 
  63.                 } 
  64.                 return TRUE; 
  65.             } 
  66.             break
  67.         } 
  68.         break
  69.  
  70.  
  71.     case WM_DRAWITEM: 
  72.         { 
  73.             LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT)lParam; 
  74.             if (lpDrawItem->CtlType == ODT_LISTBOX || lpDrawItem->CtlID == IDC_LB_COLORLISTBOX) 
  75.             { 
  76.                 if (lpDrawItem->itemID == -1) 
  77.                     break
  78.                  
  79.                 char szItemString[MAX_STRING_LEN]; 
  80.                 int nItemStringLen; 
  81.                 SendMessage(s_hLBColorListBox, LB_GETTEXT, (WPARAM)lpDrawItem->itemID, (LPARAM)szItemString); 
  82.                 nItemStringLen = strlen(szItemString); 
  83.  
  84.                 // 设置选中一行时,这一行加边框,反色 
  85.                 if ((lpDrawItem->itemState & ODS_SELECTED) &&    
  86.                     (lpDrawItem->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) 
  87.                 { 
  88.                     DrawFocusRect(lpDrawItem->hDC, &lpDrawItem->rcItem);  
  89.                     InvertRect(lpDrawItem->hDC, &lpDrawItem->rcItem); 
  90.                 } 
  91.                 else if (!(lpDrawItem->itemState & ODS_SELECTED) &&  
  92.                     (lpDrawItem->itemAction & ODA_SELECT)) 
  93.                 { 
  94.                     DrawFocusRect(lpDrawItem->hDC, &lpDrawItem->rcItem); 
  95.                     InvertRect(lpDrawItem->hDC, &lpDrawItem->rcItem); 
  96.                 } 
  97.                  
  98.                 // 隔行变色 
  99.                 if (lpDrawItem->itemID % 2 == 0) 
  100.                     SetTextColor(lpDrawItem->hDC, RGB(25, 125, 0)); 
  101.                 else 
  102.                     SetTextColor(lpDrawItem->hDC, RGB(0, 25, 125)); 
  103.                  
  104.                 // 文字背景色 
  105.                 if (lpDrawItem->itemState & ODS_SELECTED) 
  106.                 { 
  107.                     SetBkMode(lpDrawItem->hDC, TRANSPARENT); 
  108.                     SetTextColor(lpDrawItem->hDC, RGB(255, 255, 255)); 
  109.                 } 
  110.                 else  
  111.                 { 
  112.                     SetBkMode(lpDrawItem->hDC, OPAQUE); 
  113.                     SetBkColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOW)); 
  114.                 } 
  115.                  
  116.                 //输出文字 
  117.                 DrawText(lpDrawItem->hDC, szItemString, nItemStringLen, &lpDrawItem->rcItem, DT_LEFT | DT_SINGLELINE); 
  118.                 return TRUE; 
  119.             }    
  120.         } 
  121.         break
  122.     } 
  123.     return FALSE; 
  124.  
  125. void CenterWindow(HWND hwnd) 
  126.     RECT   rcDlg; 
  127.     int    nDlgWidth, nDlgHight; 
  128.     int    nScreenWidth, nScreenHight; 
  129.      
  130.     nScreenWidth = GetSystemMetrics(SM_CXSCREEN); 
  131.     nScreenHight = GetSystemMetrics(SM_CYSCREEN); 
  132.      
  133.     GetWindowRect(hwnd, &rcDlg); 
  134.     nDlgWidth = rcDlg.right - rcDlg.left; 
  135.     nDlgHight = rcDlg.bottom - rcDlg.top; 
  136.      
  137.     MoveWindow(hwnd, (nScreenWidth  - nDlgWidth) / 2, (nScreenHight - nDlgHight) / 2, nDlgWidth, nDlgHight, FALSE); 

下面列出全部目录,方便大家浏览:

1. 《Windows界面编程第一篇位图背景与位图画刷

2. 《Windows界面编程第二篇半透明窗体

3. 《Windows界面编程第三篇异形窗体普通版

4. 《Windows界面编程第四篇异形窗体高富帅版

5. 《Windows界面编程第五篇静态控件背景透明化

6.《Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口)

7.《Windows界面编程第七篇 文件拖拽(文件拖放)

8.《Windows界面编程第八篇 listbox彩色显示隔行变色

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5128660

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8656061

欢迎关注微博:http://weibo.com/MoreWindows

原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589191.html