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

               

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

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

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

 

前面已经有七篇文章介绍了Windows界面编程,目录如下:

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

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

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

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

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

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

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

 

       在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 struct tagDRAWITEMSTRUCT {

    UINTCtlType;

    UINTCtlID;

    UINTitemID;

    UINTitemAction;

    UINTitemState;

    HWNDhwndItem;

    HDChDC;

    RECT rcItem;

    ULONG_PTR itemData;

} DRAWITEMSTRUCT;

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

//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;  }  breakcase 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

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值