• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            使用自繪控件詳細步驟

            Posted on 2010-12-03 01:24 Tinpont 閱讀(1566) 評論(0)  編輯 收藏 引用 所屬分類: C++/MFC
            本文的焦點更多地偏重于控件繪制技術(shù)而非高級的繪制技術(shù),我們將演練一個簡單的示例,其中列表視圖控件是一個自定義的繪制,因此項的文本將在創(chuàng)建拼接外觀的交替單元中顯示為不同的顏色。

          1. 創(chuàng)建一個基于 Visual C++ 2005 對話框的項目,名為 ListCtrlColor

          2. Class View 中選擇 Project 菜單選項,并單擊 Add Class 調(diào)用 Add Class 對話框。

          3. 從分類列表中選擇 MFC,然后從模板列表中選擇 MFC Class

          4. 單擊 Add 按鈕,調(diào)用 MFC Class Wizard 對話框。

          5. 對于 Class name,鍵入值 CListCtrlWithCustomDraw 并選擇 CListCtrlBase class

          6. 單擊 Finish 按鈕,生成類的標(biāo)頭和執(zhí)行文件。

          7. 對于 Class View,右鍵單擊 CListCtrlWithCustomDraw 類,并選擇 Properties 上下文菜單選項。

          8. 顯示 Properties 窗口時,單擊頂部的 Messages 按鈕,顯示一個兩列的消息列表,您可以為其實現(xiàn)處理程序。

          9. 在消息列表中單擊 NM_CUSTOMDRAW 項,然后下拉第二列的組合框箭頭,并選擇值 OnNMCustomdraw

          10. 現(xiàn)在,處理繪制代碼。這里,我們只簡單處理項和子項預(yù)繪制階段,指定基于當(dāng)前行(項)和列(子項)的文本和背景色。要進行此操作,按如下所示修改 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;

                
            defaultbreak;    
              }


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



            現(xiàn)在,我們來測試新控件。要進行此操作,您只需使用 CListCtrlWithCustomDraw 類將列表視圖控件放在對話框中,并對其進行子類派生。下面是完成該操作的步驟。

            • Resource 視圖中,打開應(yīng)用程序的主對話框 (IDD_LISTCTRLCOLOR_DIALOG)。

            • Toolbox 中,將一個 List Control 拖放到該對話框。

            • 右鍵單擊列表控件,并選擇 Properties 上下文菜單選項。

            • View 屬性設(shè)置為 Report

            • 右鍵單擊控件,并選擇 Add Variable 上下文菜單選項。

            • 出現(xiàn) Add Member Variable Wizard 對話框時,指定 m_lstBooksVariable name,并單擊 Finish 按鈕。

            • 這時,您就有了一個 CListCtrl 派生類 (m_lstBooks),它將對話框上的列表視圖控件進行子類派生。然而,m_lstBooks 需要從最新創(chuàng)建的 CListCtrlWithCustomDraw 派生,以便于調(diào)用您的繪制代碼。因此,打開對話框的標(biāo)題文件 (ListCtrlColorDlg.h),將 m_lstBooks 更改為 CListCtrlWithCustomDraw 類型。

            • CListCtrlColorDlg 類開始之前,添加以下指令。

              #include "ListCtrlWithCustomDraw.h"
                  
            • 將下面的代碼添加到對話框的 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);
            }


             

          11. 現(xiàn)在,建立并運行應(yīng)用程序。圖 1 為應(yīng)用程序外觀的一個示例。

            圖 1. 自定義繪制示例應(yīng)用程序

            小結(jié)

            當(dāng) Windows 首次作為“下一代”操作系統(tǒng)引入到應(yīng)用程序開發(fā)之中時,它作為新圖形用戶界面的一個主要論據(jù)就是其一致性。該論據(jù)的要點所在是其具有一個通用的外觀:統(tǒng)一的菜單項、通用控件等。這一通用性的感覺可能會一直延續(xù),直到有第二家公司想設(shè)計其自己的應(yīng)用程序。簡單說,提供外觀與其他應(yīng)用程序雷同的應(yīng)用程序,任何公司都不會逃離這一怪圈。

            要建立一個唯一的且讓人過目難忘的用戶界面,其中一種方式是為應(yīng)用程序設(shè)計并開發(fā)自定義的控件。希望本文能對您有所幫助,現(xiàn)在,您了解到一種非常強大的技術(shù),它使您的應(yīng)用程序能從眾多競爭對手的應(yīng)用程序中脫穎而出。

          12. 亚洲国产精品高清久久久| 国产亚洲综合久久系列| 久久国产成人午夜aⅴ影院| 久久性生大片免费观看性| 久久精品免费一区二区| 一级做a爱片久久毛片| 久久天天躁狠狠躁夜夜2020一| 国产精品久久久久国产A级| 国产精品免费久久久久电影网| 亚洲午夜无码久久久久| 99久久国产亚洲高清观看2024| 久久成人国产精品免费软件| 精品国产热久久久福利| 国产V亚洲V天堂无码久久久| 国产精品乱码久久久久久软件| 久久综合综合久久97色| 久久天天躁狠狠躁夜夜96流白浆| 久久99精品国产99久久6| 久久这里只精品国产99热| 久久婷婷人人澡人人爽人人爱| 国产午夜电影久久| 一本久久a久久精品综合夜夜| 久久久亚洲欧洲日产国码二区| 亚洲欧洲久久av| 国产69精品久久久久观看软件| 99久久久久| 成人a毛片久久免费播放| 中文精品久久久久国产网址| 99久久精品费精品国产一区二区| AV无码久久久久不卡蜜桃| 亚洲中文精品久久久久久不卡| 亚洲另类欧美综合久久图片区| 久久久人妻精品无码一区| 日本加勒比久久精品| 久久久久这里只有精品| 欧美成人免费观看久久| 国产aⅴ激情无码久久| 国产美女久久精品香蕉69| 久久777国产线看观看精品| 91亚洲国产成人久久精品网址| 久久成人国产精品二三区|