• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

        用VC++完成自繪按鈕控制

        用VC++完成自繪按鈕控制

        更新時(shí)間:2022-05-07 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

        四川 曾 志

        Microsoft Windows以其豐富一致的圖形用戶界面,簡(jiǎn)單靈便的操
        作,被廣大用戶所接受。對(duì)話框就是其中一個(gè)非常重要的界面形式,
        并且Windows為其應(yīng)用程序的開發(fā)者提供了相當(dāng)豐富的界面資源,許多
        控制可以方便地加入對(duì)話框中。但當(dāng)我們需要編寫一個(gè)商業(yè)應(yīng)用,需
        要一個(gè)更友好的圖形用戶界面時(shí),就會(huì)發(fā)現(xiàn)資源的貧乏。
        Visual C++提供了一個(gè)CBitmap Button類在一定程序上緩解了
        增加新資源的要求。但當(dāng)我們要求在程序中能動(dòng)態(tài)地改變圖形時(shí),我
        們就不得不考慮放棄CBitmapButton類,而坐下來(lái)自己做一點(diǎn)工作了。
        一個(gè)可行的辦法就是重載CButton類(即按鈕控制)。這樣對(duì)這塊區(qū)域
        的大小、位置和ID號(hào)都可以通過(guò)AppStadio方便地制作。當(dāng)然這樣作最
        大的好處還是在于充分利用C++的特性把繪制控制的代碼封裝了起來(lái)
        ,既避免了重復(fù)性開發(fā),又使程序變得更簡(jiǎn)潔,增強(qiáng)了代碼的可讀性

        現(xiàn)在我們就通過(guò)創(chuàng)建一個(gè)名叫CColorButton的類來(lái)學(xué)習(xí)這種方法
        。雖然這是一個(gè)功能非常簡(jiǎn)單的類,通過(guò)調(diào)用成員函數(shù)ChangeColor可
        改變其顏色,鼠標(biāo)點(diǎn)中時(shí)則高亮邊框表示選中。但利用這種思路我們
        只需添加幾個(gè)數(shù)據(jù)成員和重載一個(gè)函數(shù)就可以方便地實(shí)現(xiàn)你所需要的
        功能。
        在創(chuàng)建這個(gè)類之前,我們必須先了解WM_DRAWITEM消息。當(dāng)按鈕
        、組合框、列表框或菜單的某一視覺狀況發(fā)生變化時(shí),系統(tǒng)就會(huì)發(fā)送
        一條WM_DRAWITEM消息給這些控制的擁有者窗口。這個(gè)消息的wParam
        指出這個(gè)控制的 id 號(hào),而IParam則是一個(gè)指向DRAWITEMSTRUCT結(jié)構(gòu)
        的指針,該結(jié)構(gòu)存放有關(guān)要繪制的項(xiàng)的信息以及繪制所需的類型。DR
        AWITEMSTRUCT結(jié)構(gòu)具有如下格式。
        typedef struct tagDRAWITEMSTRUCT{
        UINT CtlType; // 控制類型
        UINT CtlID;// 控制的ID號(hào)
        UNIT itemID;//菜單項(xiàng)的索引
        UINT itemAction;// 說(shuō)明需要的繪圖操作
        UINT itemState; // 指明繪圖后的可見狀態(tài)
        HWND hwndItem; // 控制的窗口句柄
        HDC hDC; // 相關(guān)的設(shè)備環(huán)境
        RECT rcItem;//被畫控制的邊框
        DWORD itemData;// 指定與菜單項(xiàng)相聯(lián)系的應(yīng)用程序定義的
        32位值
        }DRAWITEMSTRUCT;
        其中itemAction 和 itemState決定了需要的繪圖操作。itemAct
        ion 說(shuō)明需要的繪圖操作,可為下列值中的一個(gè)或多個(gè);
        值 含 義
        ODA_DRAWENTIRE 需要重來(lái)全部控制時(shí)
        ODA_FOCUS 獲得或失去輸入焦點(diǎn)
        ODA_SELECT 選擇狀態(tài)改變
        itemState指明當(dāng)前繪圖動(dòng)作發(fā)生之后,項(xiàng)的可見狀態(tài)。下面是狀
        態(tài)標(biāo)志:
        值 含 義
        ODS_CHECKD 只用于菜單中
        ODS_DISABLE 該項(xiàng)被屏蔽
        ODS_FOCUS 該項(xiàng)具有輸入焦點(diǎn)
        ODS_GRAYED 只用于菜單中
        ODS_SELECT 該項(xiàng)處于被選中狀態(tài)
        (上) □成都 曾志
        用VC++實(shí)現(xiàn)自繪按鈕控制
        利用VC++編程會(huì)發(fā)現(xiàn),當(dāng)按鈕控制接收到WM-DRMAWITEM消息時(shí)
        會(huì)調(diào)用Cbotton類的DrawItem函數(shù)。因此我們要做的就是利用C++的
        多態(tài)性通過(guò)重載CButton類的Drawitem函數(shù)來(lái)響應(yīng)MW-DRAWITEM消息。
        下面我們就實(shí)際構(gòu)造一個(gè)CColorButton類。
        class ccolorButton:public CButton
        { private:
        COLORREF m-color:
        public:
        CColorButton():CButton(),m-color(0){}; //構(gòu)
        造函數(shù)
        void ChangeColor(COLORREF color); //改變顏色
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct
        );//重載的函數(shù)
        };
        //重載的虛函數(shù)
        void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawIt
        emtruct)

        CDC dc;
        dc.Attach(lpDrawItemStruct->hDC); //得到繪制的設(shè)
        備環(huán)境CDC
        VERIFY( lpDrawItemStruct->CtlType==ODT-BUTTON);
        if (lpDrawItemStruct->itemAction & ODA-DRAWENTIRE)

        //重繪整個(gè)控制
        CBrush brush(m-Color);
        dc.FillRect(&(lpDrawItemstruct->reItem),&brush)

        } if ((lpDrawItemStruct->itemstate & ODS-SELECTED
        ) &&
        (lpDrawItemStruct->itemAction &
        (ODA-SELECT | ODA-DRAWENTIRE))) { //選中了本控
        制===>高亮邊框
        COLORREF fc=RGB(255-GetRvalue(m-color), 255-GetG
        Value(m-color), 255-GetBValue(m-color));
        CBrush brush(fc);
        dc.FrameRect(&(lpDrawItemStruct->rcItem),&brush
        );
        } if (!(lpDrawItemStruct->itemState & ODS-SELECT
        ED) &&
        (lpDrawItemStruct->itemAction & ODA-SELECT)){
        //控制的選中狀態(tài)結(jié)束===>去掉邊框
        CBrush brush(m-color);
        dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);
        } dc.Detach();
        } //用于改變顏色的成員函數(shù)
        void CColorButton::ChangeColor(COLORREF color) { CR
        ect rect;
        m-color=color;
        GetClientRect(&rect);

        m-colorChangeColor(COLORREF color)color,WM-DRAWITEM
        上面代碼中數(shù)據(jù)成員m-color和來(lái)保存按鈕的顏色。ChangeColo
        r(COLORREF color)函數(shù)負(fù)責(zé)改變按鈕顏色值為color,然后通過(guò)使
        控制的客戶區(qū)無(wú)效而激發(fā)WM-DRAWITEM消息。現(xiàn)在這個(gè)按鈕控制類就
        算搭好了。下面我們把它加入到對(duì)話框中來(lái)試驗(yàn)一下(中)
        用VC++實(shí)現(xiàn)自繪按鈕控制
        1.首先通過(guò)AppWizard創(chuàng)建一個(gè)單文檔的應(yīng)用。
        2.緊接著啟動(dòng)AppStadio創(chuàng)建一個(gè)對(duì)話框。添加一個(gè)按鈕控制,
        并將其ID設(shè)置為 IDC-COLORBUTTON。最后一定要記住將push Button
        Properties對(duì)話框中的Owner Draw檢查框置上檢查標(biāo)志。
        3.在AppStadio內(nèi)運(yùn)行ClassWizzand來(lái)產(chǎn)生CTestDialog類。然
        后在CTestdialog類中加入數(shù)據(jù)成員,在CTestDialog類說(shuō)明加入如下
        的private型數(shù)據(jù)成員:
        private:
        ccolorButton m-ColorButton;
        4.現(xiàn)在剩下的問題是到底要怎樣才能使m-ColorButton的DrawI
        tem函數(shù)能響應(yīng)系統(tǒng)發(fā)往ID值為IDC-COLORBUTTON的按鈕控制的WM-D
        RAWITEM消息。這時(shí)就要用到CWnd類的成員函數(shù)BOOL CWnd::Subcla
        ssDlgItem(UINT nID,CWnd *pParent)。通過(guò)調(diào)用這個(gè)函數(shù),我們
        可以動(dòng)態(tài)地接管從對(duì)話框模板產(chǎn)生的控制,并把它隸屬于CWnd對(duì)象。
        即用當(dāng)前的CWnd對(duì)象接管發(fā)向隸屬于pParent的ID號(hào)為nID的控制的一
        切消息。對(duì)于按鈕控制而言,它把當(dāng)前的按鈕控制的位置和大小也清
        成和nID對(duì)應(yīng)的按鈕控制一樣。于是我們對(duì)CTestDialog的源文件進(jìn)行
        如下的編輯:
        BOOL CTestDialog::OnInitDialog()
        { CDialog::OnInitDialog();
        //TODO:Add extra initialization here
        m-ColorButton.SubclassDlgtem(IDC-COLORBUTTON,this)
        ;//接管消息
        m-ColorButton.ChangeColor(RGB(255,0,0);//設(shè)置為
        紅色(可設(shè)為任何顏色)
        return(TRUE);

        接著通過(guò)ClassWizzard在CTestDialog中加入一個(gè)響應(yīng)鼠標(biāo)點(diǎn)擊I
        DC-COLORBUTTON按鈕的消息的函數(shù):
        void CTestDialog::OnColerbutton()
        { //TODO:Add your control notification handler code
        here
        int r=int(((float)rand()/RAND-MAX)*255
        int g=int(((float)rand()/RAND-MAX)*255
        int b=int(((float)rand()/RAND-MAX)*255
        m-ColorButton.ChangeColor(RGB(r,g,b));

        5.最后,利用ClassWizzard為View加入一個(gè)響應(yīng)WM-LBUTTONDO
        WN的函數(shù),以便激活對(duì)話框。請(qǐng)按如下代碼對(duì)其進(jìn)行編輯。
        void CTestView::OnLButtonDown(UINT nflags,POINT po
        int)
        { CTestDialog dlg;
        dlg.Domodal();

        6.編譯并測(cè)試該程序。當(dāng)鼠標(biāo)在落視窗中時(shí),按下鼠標(biāo)左鍵應(yīng)能
        彈出一個(gè)對(duì)話框。在對(duì)話框中的紅色矩形區(qū)域內(nèi)按下鼠標(biāo)左鍵就會(huì)使
        其邊框變成高亮狀態(tài),若在這塊區(qū)域內(nèi)釋放左鍵則這城區(qū)域就會(huì)改變
        顏色且顏色是隨機(jī)的。
        只需更改DrawItem函數(shù)中的重繪代碼,就可以得到自己的需要圖
        形按鈕。 

        溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲色无码专区一区| 免费二级毛片免费完整视频| 国产成A人亚洲精V品无码| 一区二区三区免费精品视频 | 亚洲乱亚洲乱少妇无码| 国产亚洲漂亮白嫩美女在线| 日本不卡免费新一二三区| 亚洲国产成人久久一区二区三区| 午夜免费福利网站| 亚洲av日韩精品久久久久久a| 破了亲妺妺的处免费视频国产| 鲁死你资源站亚洲av| 亚洲国产精品激情在线观看 | 日木av无码专区亚洲av毛片| 午夜老司机永久免费看片| 亚洲一区二区三区夜色| 亚洲免费在线观看视频| 亚洲卡一卡2卡三卡4麻豆| 大陆一级毛片免费视频观看 | 亚洲成?Ⅴ人在线观看无码| av成人免费电影| 婷婷亚洲久悠悠色悠在线播放| 中文字幕在线观看免费视频| 亚洲人成影院午夜网站| 国产精品自在自线免费观看| h片在线播放免费高清| 亚洲国产成人私人影院| 男人的好看免费观看在线视频| 青青青亚洲精品国产| 亚洲va无码va在线va天堂| 在线天堂免费观看.WWW| 无人视频免费观看免费视频| 无码专区—VA亚洲V天堂| 成人免费777777| 99久久免费国产精品热| 亚洲国产综合在线| 亚洲精品无码专区2| 日本片免费观看一区二区| 国产亚洲精品91| 亚洲成年人电影在线观看| 亚洲国产精品一区二区第四页|