• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Woosa

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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(免积分)下载)。

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

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
//使窗口居中
void CenterWindow(HWND hwnd);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
	return 0;
}

const int MAX_NUMBER = 8;
const int MAX_STRING_LEN = 50;
const char STR_TEXT[MAX_NUMBER][MAX_STRING_LEN] = {
	"MoreWindows", 
	"Master",
	"blog.csdn.net/MoreWindows", 
	"weibo.com/MoreWindows",
	"Windows界面编程",
	"秒杀多线程面试题系列",
	"Windows界面编程第八篇",
	"listbox彩色显示隔行变色"
};
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND s_hLBColorListBox;
	switch (message)
	{
	case WM_INITDIALOG:
		{
			CenterWindow(hDlg);
			s_hLBColorListBox = GetDlgItem(hDlg, IDC_LB_COLORLISTBOX);
			//添加数据
			for (int i = 0; i < MAX_NUMBER; i++)
				SendMessage(s_hLBColorListBox, LB_ADDSTRING, 0, (LPARAM)STR_TEXT[i]);
		}
		return FALSE;
		
		
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hDlg, FALSE);
			return TRUE;

		case IDC_LB_COLORLISTBOX:  //listbox control ID
			switch (HIWORD(wParam))
			{
			case LBN_DBLCLK:   //双击事件
				{	
					char szBuffer[MAX_STRING_LEN];
					int nCurSel = SendMessage(s_hLBColorListBox, LB_GETCURSEL, 0, 0);
					SendMessage(s_hLBColorListBox, LB_GETTEXT, (WPARAM)nCurSel, (LPARAM)szBuffer);
					MessageBox(NULL, szBuffer, "listbox item", MB_OK);
				}
				return TRUE;
			}
			break;
		}
		break;


	case WM_DRAWITEM:
		{
			LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
			if (lpDrawItem->CtlType == ODT_LISTBOX || lpDrawItem->CtlID == IDC_LB_COLORLISTBOX)
			{
				if (lpDrawItem->itemID == -1)
					break;
				
				char szItemString[MAX_STRING_LEN];
				int nItemStringLen;
				SendMessage(s_hLBColorListBox, LB_GETTEXT, (WPARAM)lpDrawItem->itemID, (LPARAM)szItemString);
				nItemStringLen = strlen(szItemString);

				// 设置选中一行时,这一行加边框,反色
				if ((lpDrawItem->itemState & ODS_SELECTED) &&   
					(lpDrawItem->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
				{
					DrawFocusRect(lpDrawItem->hDC, &lpDrawItem->rcItem); 
					InvertRect(lpDrawItem->hDC, &lpDrawItem->rcItem);
				}
				else if (!(lpDrawItem->itemState & ODS_SELECTED) && 
					(lpDrawItem->itemAction & ODA_SELECT))
				{
					DrawFocusRect(lpDrawItem->hDC, &lpDrawItem->rcItem);
					InvertRect(lpDrawItem->hDC, &lpDrawItem->rcItem);
				}
				
				// 隔行变色
				if (lpDrawItem->itemID % 2 == 0)
					SetTextColor(lpDrawItem->hDC, RGB(25, 125, 0));
				else
					SetTextColor(lpDrawItem->hDC, RGB(0, 25, 125));
				
				// 文字背景色
				if (lpDrawItem->itemState & ODS_SELECTED)
				{
					SetBkMode(lpDrawItem->hDC, TRANSPARENT);
					SetTextColor(lpDrawItem->hDC, RGB(255, 255, 255));
				}
				else 
				{
					SetBkMode(lpDrawItem->hDC, OPAQUE);
					SetBkColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOW));
				}
				
				//输出文字
				DrawText(lpDrawItem->hDC, szItemString, nItemStringLen, &lpDrawItem->rcItem, DT_LEFT | DT_SINGLELINE);
				return TRUE;
			}	
		}
		break;
	}
	return FALSE;
}

void CenterWindow(HWND hwnd)
{
	RECT   rcDlg;
	int    nDlgWidth, nDlgHight;
	int    nScreenWidth, nScreenHight;
	
	nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	nScreenHight = GetSystemMetrics(SM_CYSCREEN);
	
	GetWindowRect(hwnd, &rcDlg);
	nDlgWidth = rcDlg.right - rcDlg.left;
	nDlgHight = rcDlg.bottom - rcDlg.top;
	
	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

posted on 2013-03-15 20:15  Woosa  阅读(255)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3