Posted on 2010-12-03 01:24
Tinpont 閱讀(1566)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++/MFC
本文的焦點(diǎn)更多地偏重于控件繪制技術(shù)而非高級(jí)的繪制技術(shù),我們將演練一個(gè)簡(jiǎn)單的示例,其中列表視圖控件是一個(gè)自定義的繪制,因此項(xiàng)的文本將在創(chuàng)建拼接外觀的交替單元中顯示為不同的顏色。
創(chuàng)建一個(gè)基于 Visual C++ 2005 對(duì)話框的項(xiàng)目,名為 ListCtrlColor。
從 Class View 中選擇 Project 菜單選項(xiàng),并單擊 Add Class 調(diào)用 Add Class 對(duì)話框。
從分類列表中選擇 MFC,然后從模板列表中選擇 MFC Class。
單擊 Add 按鈕,調(diào)用 MFC Class Wizard 對(duì)話框。
對(duì)于 Class name,鍵入值 CListCtrlWithCustomDraw 并選擇 CListCtrl 的 Base class。
單擊 Finish 按鈕,生成類的標(biāo)頭和執(zhí)行文件。
對(duì)于 Class View,右鍵單擊 CListCtrlWithCustomDraw 類,并選擇 Properties 上下文菜單選項(xiàng)。
顯示 Properties 窗口時(shí),單擊頂部的 Messages 按鈕,顯示一個(gè)兩列的消息列表,您可以為其實(shí)現(xiàn)處理程序。
在消息列表中單擊 NM_CUSTOMDRAW 項(xiàng),然后下拉第二列的組合框箭頭,并選擇值 OnNMCustomdraw。
現(xiàn)在,處理繪制代碼。這里,我們只簡(jiǎn)單處理項(xiàng)和子項(xiàng)預(yù)繪制階段,指定基于當(dāng)前行(項(xiàng))和列(子項(xiàng))的文本和背景色。要進(jìn)行此操作,按如下所示修改 OnNMCustomdraw 函數(shù):
void CListCtrlWithCustomDraw::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)


{
LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast(pNMHDR);

switch(lpLVCustomDraw->nmcd.dwDrawStage)

{
case CDDS_ITEMPREPAINT:
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
if (0 == ((lpLVCustomDraw->nmcd.dwItemSpec + lpLVCustomDraw->iSubItem) % 2))

{
lpLVCustomDraw->clrText = RGB(255,255,255); // white text
lpLVCustomDraw->clrTextBk = RGB(0,0,0); // black background
}
else

{
lpLVCustomDraw->clrText = CLR_DEFAULT;
lpLVCustomDraw->clrTextBk = CLR_DEFAULT;
}
break;

default: break;
}

*pResult = 0;
*pResult |= CDRF_NOTIFYPOSTPAINT;
*pResult |= CDRF_NOTIFYITEMDRAW;
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
}

現(xiàn)在,我們來測(cè)試新控件。要進(jìn)行此操作,您只需使用 CListCtrlWithCustomDraw 類將列表視圖控件放在對(duì)話框中,并對(duì)其進(jìn)行子類派生。下面是完成該操作的步驟。
-
在 Resource 視圖中,打開應(yīng)用程序的主對(duì)話框 (IDD_LISTCTRLCOLOR_DIALOG)。
-
從 Toolbox 中,將一個(gè) List Control 拖放到該對(duì)話框。
-
右鍵單擊列表控件,并選擇 Properties 上下文菜單選項(xiàng)。
-
將 View 屬性設(shè)置為 Report。
-
右鍵單擊控件,并選擇 Add Variable 上下文菜單選項(xiàng)。
-
出現(xiàn) Add Member Variable Wizard 對(duì)話框時(shí),指定 m_lstBooks 的 Variable name,并單擊 Finish 按鈕。
-
這時(shí),您就有了一個(gè) CListCtrl 派生類 (m_lstBooks),它將對(duì)話框上的列表視圖控件進(jìn)行子類派生。然而,m_lstBooks 需要從最新創(chuàng)建的 CListCtrlWithCustomDraw 派生,以便于調(diào)用您的繪制代碼。因此,打開對(duì)話框的標(biāo)題文件 (ListCtrlColorDlg.h),將 m_lstBooks 更改為 CListCtrlWithCustomDraw 類型。
-
在 CListCtrlColorDlg 類開始之前,添加以下指令。
#include "ListCtrlWithCustomDraw.h"
-
將下面的代碼添加到對(duì)話框的 OnInitDialog 成員函數(shù),這樣我們就能夠看到一些列表視圖行。
// Insert the columns
m_lstBooks.InsertColumn(0, _T("Author"));
m_lstBooks.InsertColumn(1, _T("Book"));

// Define the data
static struct


{
TCHAR m_szAuthor[50];
TCHAR m_szTitle[100];

} BOOK_INFO[] =
{
_T("Tom Archer"), _T("Visual C++.NET Bible"),
_T("Tom Archer"), _T("Extending MFC with the .NET Framework"),
_T("Brian Johnson"), _T("XBox 360 For Dummies")
};

// Insert the data
int idx;
for (int i = 0; i < sizeof BOOK_INFO / sizeof BOOK_INFO[0]; i++)


{
idx = m_lstBooks.InsertItem(i, BOOK_INFO[i].m_szAuthor);
m_lstBooks.SetItemText(i, 1, BOOK_INFO[i].m_szTitle);
}

現(xiàn)在,建立并運(yùn)行應(yīng)用程序。圖 1 為應(yīng)用程序外觀的一個(gè)示例。
圖 1. 自定義繪制示例應(yīng)用程序
小結(jié)
當(dāng) Windows 首次作為“下一代”操作系統(tǒng)引入到應(yīng)用程序開發(fā)之中時(shí),它作為新圖形用戶界面的一個(gè)主要論據(jù)就是其一致性。該論據(jù)的要點(diǎn)所在是其具有一個(gè)通用的外觀:統(tǒng)一的菜單項(xiàng)、通用控件等。這一通用性的感覺可能會(huì)一直延續(xù),直到有第二家公司想設(shè)計(jì)其自己的應(yīng)用程序。簡(jiǎn)單說,提供外觀與其他應(yīng)用程序雷同的應(yīng)用程序,任何公司都不會(huì)逃離這一怪圈。
要建立一個(gè)唯一的且讓人過目難忘的用戶界面,其中一種方式是為應(yīng)用程序設(shè)計(jì)并開發(fā)自定義的控件。希望本文能對(duì)您有所幫助,現(xiàn)在,您了解到一種非常強(qiáng)大的技術(shù),它使您的應(yīng)用程序能從眾多競(jìng)爭(zhēng)對(duì)手的應(yīng)用程序中脫穎而出。