欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      MFC繪制自定義按鈕大全

      時間:2019-05-15 10:52:53下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關的《MFC繪制自定義按鈕大全》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《MFC繪制自定義按鈕大全》。

      第一篇:MFC繪制自定義按鈕大全

      VC++ MFC界面技巧--按鈕

      ★ 5--2--1 圖標按鈕

      圖標按鈕可謂是按鈕控件使用圖像最簡單的方式,除此之外圖標按鈕的優(yōu)點還在于顯示在按鈕上的圖標能夠使用透明色,因而不必再去為處理非矩形圖像在按鈕顏色發(fā)生變化時邊緣顏色的處理而費心。不過也正是使用圖標導致了圖標按鈕的天生弱點。圖標太小了,僅僅才 32×32 像素大小,在有的場合僅靠使用這么小的圖像就有些顯得力不從心了。

      在講圖標按鈕如何使用之前,先得告訴讀者句柄的概念。句柄是什么?很多教科書上都這樣定義:句柄是一個用于代表對象的 32 位整型值。不過這對于很多初學者而言,并不是太好理解。其實也可以將未賦值的句柄理解為一個指向“空白”(void *)的指針,事實上也如此,在 Winnt.h 中,句柄就是如此被聲明的:typedef void *HANDLE;當句柄被賦值之后,它就成為指向某個特定位置的指針,即代表了某個特定的對象。之所以在現(xiàn)在提及句柄,是因為句柄是 Windows 編程中的一個關鍵性概念。盡管在前面除第三章外的內(nèi)容中很少涉及它,不過在下面的學習中我們將會很頻繁的使用到句柄。

      技術概要:

      使用圖標按鈕很簡單,大的步驟僅僅就三步:

      ①.從外部導入一個圖標或自己創(chuàng)建一個圖標作為資源。②.從資源中載入所要使用的圖標。③.在要使用圖標的按鈕上設置圖標。

      具體實現(xiàn):

      ■第一步導入圖標沒有什么特別之處,同前面 2.2 節(jié)中使用靜態(tài)圖像控件導入位圖是非常類似的。無非就是使用 Insert 菜單上的 Resource 命令,導入或創(chuàng)建一個圖標即可。

      ■第二步載入圖標就涉及到一些細節(jié)問題了。使用函數(shù) LoadIcon()載入圖標。因為LoadIcon()是類 CWinApp 的成員函數(shù),同時函數(shù) LoadIcon()返回所載入圖標的句柄。所以我們采用以下方法來調(diào)用函數(shù) LoadIcon(): h_Icon = AfxGetApp()-> LoadIcon(IDI_Icon);當然,在該語句之前還必須要有對圖標句柄 h_Icon 的定義: HICON h_Icon;

      ■第三步為按鈕設置圖標了,這通過調(diào)用函數(shù) SetIcon()來實現(xiàn)。同時不要忘記,還須在使用圖標的按鈕的 Properties 設置中設置 Icon 屬性,指明該按鈕是一個圖標按鈕。因為函數(shù) SetIcon()為類 CButton 的成員函數(shù),可以通過兩種方法來調(diào)用該函數(shù)。一是通過 CButton 類對象來調(diào)用 SetIcon(),如下面代碼:

      m_BtonIcon.SetIcon(h_Icon);// m_BtonIcon 為一個 CButton 類對象。

      二是先由函數(shù) GetDlgItem()獲得一個指向 CWnd 對象的指針,再通過強制類型轉(zhuǎn)換將該指針轉(zhuǎn)換為一個指向 CButton 類對象的指針。進而通過該指針來調(diào)用函數(shù) SetIcon()。具體實現(xiàn)代碼如下:

      CWnd *pWnd = GetDlgItem(IDC_RADIO2);

      CButton *pBton =(CButton *)pWnd;pBton-> SetIcon(h_Icon2);既然有第一種較為簡便的方法為按鈕設置圖標,為何還要提及第二種方法呢?因為并不是在任何情況下都會有 CButton 類對象的,例如對于一組單選按鈕。只能為它們定義一個 CButton 類對象,如果使用該對象來調(diào)用函數(shù) SetIcon(),則只能在設置了 Group 屬性的那個單選按鈕上設置圖標。所以要達到在一組單選按鈕中分別設置不同圖標的目的,就只有使用第二種方法。

      盡管在現(xiàn)在的 Windows 編程中,資源句柄數(shù)多得相對于我們而言幾乎是無限的,但最好在使用完資源句柄后及時的把它們刪除掉。上面所講述的方法不僅適用于 Push Button,而且同樣適用于 Radio Button、Check Box 和 Group Box。

      ★ 5--2--2 位圖按鈕

      圖標按鈕雖有著種種優(yōu)點,但它能顯示的圖像實在是太小了。在有的場合顯然就不適用了。位圖按鈕可以在按鈕表面顯示一幅位圖而不再是一個小小的圖標。但是因為在位圖中不能使用透明色,因而當顯示的位圖不為矩形時,就得為位圖中非矩形部分的背景色動一番腦筋了。因為存在著用戶改變按鈕表面顏色,也就是位圖背景色的可能性??梢杂猛该魑粓D的技術來解決這一難題,這將在后面 5.7 實現(xiàn)具有透明性的位圖中講述。

      技術概要:

      位圖按鈕的使用的大致步驟同圖標按鈕基本相似,也是以下三個步驟: ① 從外部導入一個位圖或自己創(chuàng)建一個位圖作為資源。② 從資源中載入所要使用的位圖。③ 在要使用位圖的按鈕上設置位圖。

      具體實現(xiàn):

      ■第一步從外部導入一個位圖作為資源同使用圖標按鈕時是完全一致的,在此就不詳細講述了。

      ■第二步中,利用函數(shù) LoadBitmap()從資源中載入位圖。函數(shù) LoadBitmap()為一個 API 函數(shù),定義如下: HBITMAP LoadBitmap(HINSTANCE hInstance, // handle of application instance LPCTSTR lpBitmapName // address of bitmap resource name);所以,為達到載入位圖的目的,不僅要定義一個位圖句柄 hBitmap: HBITMAP hBitmap;而且還要定義一個應用程序?qū)嵗浔?hInstance;: HINSTANCE hInstance;并調(diào)用函數(shù) AfxGetInstanceHandle()以獲得當前的應用程序?qū)嵗浔a如下: hInstance = ::AfxGetInstanceHandle();只有在聲明并獲得了當前的應用程序句柄后,才能使用以下語句載入位圖: hBitmap = ::LoadBitmap(hInstance,“BMP1”);注意,在函數(shù) LoadBitmap()中的第二個參數(shù)為資源名,而非資源 ID。因為資源名是一個字符串,而資源 ID 則是一個整型量。所以在創(chuàng)建或?qū)胛粓D后,為該位圖資源命名時要加上雙引號以表示這是一個資源名。如右圖 5-2:

      ■在第三步中,為要使用位

      圖的按鈕設置位圖,方法與圖標按鈕完全相同。首先是要在使用位圖的按鈕的 Properties 設置中設置 Bitmap 屬性,指明該按鈕是一個位圖按鈕。然后再調(diào)用 CButton 類函數(shù) SetBitmap()為按鈕設置位圖。代碼如下:

      // m_BtonBmp 為一個 CButton 類對象。m_BtonBmp.SetBitmap(hBitmap);或

      pWnd = GetDlgItem(IDC_Check);pBton =(CButton *)pWnd;pBton-> SetBitmap(hBitmap);

      同圖標按鈕一樣,使用位圖不局限于 Push Button,而且同樣適用于 Radio Button、Check Box 和 Group Box。同時,最好在使用完位圖句柄后及時的將它刪除掉。

      ★ 5--2--3 CBitmapButton 類位圖按鈕

      前面所講述的圖標及位圖按鈕最大的不足在于,無論當按鈕控件處于何種狀態(tài),按鈕上所顯示的圖案總是一成不變的,相比之下那些隨著操作而實時改變圖案的按鈕就具有更加生動的效果。MFC 庫為我們捉供了一個這樣的類 CBitmapButton。利用這個類,我們可以為一個按鈕設計四幅不同位圖、分別用于正常狀態(tài)、按下狀態(tài)、獲得輸入焦點和無效時。這樣,隨著按鈕狀態(tài)的改變,位圖也隨之切換,這樣就使按鈕呈現(xiàn)出很強的動感效果。令人高興的是,類 CBitmapButton 將很多操作的細節(jié)都封裝了起來,因而我們能夠很方便的達到上述目的。由于以上原因,CBitmapButton 類位圖按鈕有著比圖標按鈕和位圖按鈕更為廣闊的使用范圍。在一般情況下,都將 CBitmapButton 類位圖按鈕稱作是位圖按鈕,而將真正的位圖按鈕給忽略了。

      CBitmapButton 類位圖按鈕的缺點同位圖按鈕是一致的,都是在對透明色的處理上。還有一個比較嚴重的問題是 CBitmapButton 類位圖按鈕是將位圖按原始大小繪制在按鈕上,而不是隨按鈕大小而縮放位圖。這在平時不會導致任何問題,但若是在 Windows 中更改了顯示字體的大小,則對話框及上面的按鈕控件大小也隨之改變,但位圖按鈕上的位圖卻保持原有大小不變,這樣就會在外觀上造成嚴重的問題。盡管有以上問題的存在,CBitmapButton 類位圖按鈕還是具有很大的實用價值,因為付出很少的代碼就可以得到生動形象的圖形效果。、下面就講述 CBitmapButton 類位圖按鈕的使用方法(以下均簡稱為位圖按鈕)。絕大數(shù)情況下,使用位圖按鈕只需四個步驟:

      ● 第一步:在要使用位圖的按鈕的 Properties 設置中設置 Owner Draw 屬性

      ● 第二步:創(chuàng)建或從外部導入至少一幅至多四幅位圖。位圖按鈕所使用的位圖顏色最多可達 256 色,但對于 256 色的位圖不能通過剪貼的的方式來創(chuàng)建。而必須使用導入的方式來創(chuàng)建。若該按鈕控件的 Caption(標題)為 BmpBton,則將這四幅位圖的 ID 分別設定為 “BMPBTONU”、“BMPBTOND”、“BMPBTONF”、“BMPBTONX

      ”分別對應于按鈕的正常狀態(tài)、按下狀態(tài)、獲得輸入焦點狀態(tài)和無效狀態(tài)。注意,只有在正常狀態(tài)顯示的位圖是必須的,其它狀態(tài)的位圖都是可選的;還有就是代表位圖的 ID 都必須加上雙引號并且大寫(如下圖 5-3)。實際上,加上雙引號就表示該資源是以字符串常量來標識。

      ● 第三步:在使用位圖按鈕的類的類定義文件中聲明 CBitmapButton 類對象:CBitmapButton m_BtonSet;

      ● 第四步:在對話框的 OnInitDialog()函數(shù)中通過 CBitmapButton 類對象調(diào)用函數(shù) AutoLoad()自動加載位圖: m_BtonSet.AutoLoad(IDC_BtonSet,this);

      經(jīng)過以上四個步驟,一個位圖按鈕就創(chuàng)建好了。在運行中,CBitmapButton 類會自動根據(jù)按鈕的狀態(tài)顯示對應的位圖。利用位圖按鈕技術,再加上一點鼠標感應技術,就很容易做出像網(wǎng)頁按鈕那樣的在鼠標經(jīng)過時加亮的動態(tài)效果。也能輕易的實現(xiàn)像 Word 中那樣的平面按鈕。這些將在后面的章節(jié)中講述。

      需要說明的是,CBitmapButton 類位圖按鈕僅限于在 Push Button 使用。在默寫情況下,我們可能需要動態(tài)創(chuàng)建位圖按鈕,在動態(tài)創(chuàng)建位圖按鈕時,不能使用函數(shù) AutoLoad()加載位圖,而要使用函數(shù) LoadBitmaps()來加載位圖。動態(tài)創(chuàng)建位圖按鈕主要有以下幾個步驟: ●第一步:為要創(chuàng)建的控件分配一個 ID 值?!竦诙剑憾x一個 CBitmapButton 類對象。

      ●第三步:由該對象調(diào)用函數(shù) Create()創(chuàng)建位圖按鈕,并調(diào)用函數(shù) LoadBitmap()加載位圖。在調(diào)用函數(shù) SizeToContent()調(diào)整按鈕控件的大小以適應位圖?!?第四步:加入對新創(chuàng)建按鈕的消息處理。第三步實現(xiàn)代碼如下:

      m_BmpBtonExit.Create(“EXIT”,BS_PUSHBUTTON|WS_VISIBLE|BS_OWNERDRAW, rcBtonExit,this,IDOK);m_BmpBtonExit.LoadBitmaps(“EXITU”,“EXITD”);

      ★ 5--2--4 按鈕的自繪制

      前面講述的三種在按鈕上顯示圖像的方法或多或少的存在著不足之處,圖標按鈕太小,位圖按鈕無法設置透明色,CBitmapButton 類位圖按鈕位圖大小不能隨按鈕控件變化。使用按鈕的自繪制技術是解決以上問題的最佳途徑。當然,按鈕的自繪制技術的作用不僅僅局限于按鈕表面顯示圖像,利用它可以充分發(fā)揮自己的創(chuàng)造力從而創(chuàng)建出各式各樣的按鈕控件。例如動畫按鈕等。如果說利用按鈕自繪制技術在按鈕上顯示圖像唯一有一點不足的話,那就是實現(xiàn)略為復雜了一些。但利用按鈕自繪制技術,在配合以 DIB 文件讀取技術,就完全能夠?qū)崿F(xiàn)象 Winamp 中那樣的 Skin 技術。

      概念解釋:

      先解釋一下什么叫做按鈕的自繪制,準確的說應該是控件的自繪制技術。Windows 能夠向控件的父窗口發(fā)送消息以讓父窗口定制控件的外觀和行為。MFC 則更近了一步,它能夠譯解

      自繪制參數(shù)并將消息發(fā)回控件本身。因為繪制控件的代碼實在控件類中實現(xiàn),而不是在擁有控件的窗口中,因而稱為“自繪制”。除按鈕控件可以自繪制外,列表框、組合框以及菜單都支持自繪制。

      在基于對話框的應用程序框架的基礎上創(chuàng)建一個自繪制的按鈕,主要有以下步驟: ■ 第一步:

      在對話框上放置一個按鈕,并在其 Properties 中設置 Owner Draw 屬性?!?第二步:

      用 ClassWizard 從 CButton 類中派生出一個新類。進入 ClassWizard,點擊 Message Maps 標簽下的 New 按鈕,在彈出的菜單中選擇 New 命令進入 New Class 對話框。在 New Class 對話框中填入新創(chuàng)建類的名稱 CownerDrawBton,以及選擇所創(chuàng)建類的父類為 CButton(如下圖 5-4):

      ■ 第三步:

      為新創(chuàng)建的 COwnerDrawBton 類增加一個成員函數(shù) DrawItem()。在 WorkSpace 窗口中的 Class View 標簽下,右鍵單擊類 COwnerDrawBton,在隨后的菜單中選擇 Add Virtual Funtion?命令(如左下圖 5-5)進入 New Virtual Override for class COwnerDrawBton 對話框(如右下圖 5-6),在該對話框的 New Virtual Function 欄中選擇函數(shù) DrawItem,再點擊 Add and Edit 按鈕就超越了函數(shù) DrawItem,并進入其內(nèi)部處于待編輯狀態(tài)。

      概念解釋:

      函數(shù) DrawItem():該函數(shù)在當自繪制按鈕的外觀需要重繪時調(diào)用。其定義如下: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);參數(shù) lpDrawItemStruct 為指向結(jié)構(gòu) DRAWITEMSTRUCT 的一個長指針。結(jié)構(gòu)DRAWITEMSTRUCT 定義如下:

      typedef struct tagDRAWITEMSTRUCT { UINT CtlType;UINT CtlID;UINT itemID;UINT itemAction;UINT itemState;HWND hwndItem;HDC hDC;RECT rcItem;DWORD itemData;} DRAWITEMSTRUCT;該結(jié)構(gòu)中部分成員變量作用如下:

      CtlType:表示控件類型,當為常量 ODT_BUTTON 表示為自繪制按鈕。CtlID :表示控件的 ID。ItemAction:繪制動作。

      ItemState:在當前繪制動作完成后,確定控件所處狀態(tài)。HwndItem:控件窗口的句柄。HDC:設備環(huán)境句柄。

      RcItem:確定自繪制控件大小的矩形。

      通過DRAWITEMSTRUCT結(jié)構(gòu)中的各成員變量,就可以為控件的自繪制提供必要的條件。

      ■ 第四步:

      利用 ClassWizard 中定義一個 COwnerDrawBton 類對象 m_BtonOD(如下圖 5-7):注意在 VC++ 中,必須采用這種方式來定義對象 m_BtonOD,如果是在類定義文件中手工定義該對象的話,則不會執(zhí)行超越的虛函數(shù) DrawItem()。同樣,如果是不定義該對象的話,則不會執(zhí)行函數(shù)DrawItem()。

      ■ 第五步:

      向函數(shù) DrawItem()中加入以下代碼:

      void COwnerDrawBton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ // TODO: Add your code to draw the specified item CDC *pDC;CRect rcBton;CDC dcMem;

      BITMAP s_

      Bmp;CBitmap m_Bitmap;CBitmap *pOldBitmap;

      pDC = CDC::FromHandle(lpDrawItemStruct-> hDC);// 將設備環(huán)境句柄轉(zhuǎn)換為指向設備環(huán)境的指針

      rcBton = lpDrawItemStruct-> rcItem;// 獲取按鈕控件大小

      m_Bitmap.LoadBitmap(IDB_Bmp);// 載入位圖

      dcMem.CreateCompatibleDC(pDC);// 創(chuàng)建于內(nèi)存設備環(huán)境相兼容的設備環(huán)境

      pOldBitmap = dcMem.SelectObject(&m_Bitmap);// 將位圖對象選入到內(nèi)存設備環(huán)境中

      m_Bitmap.GetBitmap(&s_Bmp);// 獲取位圖信息

      pDC-> StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(), &dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);// 將位圖從內(nèi)存設備環(huán)境拷貝到顯示設備環(huán)境

      dcMem.SelectObject(pOldBitmap);// 刪除剛才選入到內(nèi)存設備環(huán)境的位圖對象 }

      在上面的代碼只是為了說明如何進行按鈕控件的自繪制,它距實用要求還有一段距離。因為在對話框上每個自繪制的按鈕控件都會調(diào)用 DrawItem()函數(shù)。所以在 DrawItem()函數(shù)內(nèi)部,還必須根據(jù)結(jié)構(gòu) DRAWITEMSTRUCT 的成員變量 CtlID 來區(qū)分不同的按鈕控件,進而再采取不同的操作。同時還需根據(jù)按鈕控件的不同狀態(tài),進行不同的操作。

      在上一節(jié)中講述的 CBitmapButton 類實際上也是通過對按鈕控件進行自繪制而實現(xiàn)的。但是在向按鈕上繪制圖像時它是采用函數(shù) BitBlt(),而不是使用函數(shù) StretchBlt(),因而造成 CBitmapButton 類位圖按鈕上的位圖大小不會隨控件大小改變而改變。根據(jù)這一原理,我們自己創(chuàng)建一個與 CBitmapButton 作用和使用方法相似類 CBmpBton,它也可以使用四幅不同的位圖來表示按鈕不同的狀態(tài),位圖的命名原則同 CBitmapButton 完全一致。不同的是,它無需使用諸如 AutoLoad()一類的函數(shù)來加載位圖。的其他部分同上面的 COwnerDrawBton 完全一致,只不過是函數(shù) DrawItem()的實現(xiàn)不同,下面就是類 CBmpBton 的 DrawItem()函數(shù)的實現(xiàn)代碼:

      void CBmpBton::DrawItem(LPDRAWITEMSTRUCT lpDIS){ CRect rcBton;CDC *pDC;

      UINT action;UINT CtrID;CString strCaption;

      CBitmap m_Bitmap;CBitmap *pOldBitmap;CDC dcMem;BITMAP s_Bmp;

      rcBton.CopyRect(&lpDIS-> rcItem);pDC = CDC::FromHandle(lpDIS-> hDC);state = lpDIS-> itemState;action = lpDIS-> itemAction;CtrID = lpDIS-> CtlID;

      GetWindowText(strCaption);// GetDlgItemText(CtrID,strCaption);

      dcMem.CreateCompatibleDC(pDC);

      if(state == 16){ if(m_Bitmap.LoadBitmap(strCaption + _T(“F”))){ pOldBitmap = dcMem.SelectObject(&m_Bitmap);m_Bitmap.GetBitmap(&s_Bmp);pDC-> StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(), &dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);} else { if(m_Bitmap.LoadBitmap(strCaption + _T(“U”))){ pOldBitmap = dcMem.SelectObject(&m_Bitmap);m_Bitmap.GetBitmap(&s_Bmp);pDC->StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(), &dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);} else { TRACE(“必須載入一副位圖”);} } } else if(state == 4){ if(m_Bitmap.LoadBitmap(strCaption + _T(“X”))){ pOldBitmap = dcMem.SelectObject(&m_Bitmap);m_Bitmap.GetBitmap(&s_Bmp);pDC-> StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(), &dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);} } else if(state & ODS_SELECTED){ if(m_Bitmap.LoadBitmap(strCaption + _T(“D”))){ pOldBitmap = dcMem.SelectObject(&m_Bitmap);m_Bitmap.GetBitmap(&s_Bmp);pDC-> StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(), &dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);} } else { if(m_Bitmap.LoadBitmap(strCaption + _T(“U”))){ pOldBitmap = dcMem.SelectObject(&m_Bitmap);m_Bitmap.GetBitmap(&s_Bmp);pDC-> StretchBlt(rcBton.left,rcBton.top,rcBton.Width(),rcBton.Height(), &dcMem,0,0,s_Bmp.bmWidth,s_Bmp.bmHeight,SRCCOPY);} else { TRACE(“必須載入一副位圖 U”);} }

      dcMem.SelectObject(pOldBitmap);} ★ 5--4--1 在對話框上使用圖像

      本節(jié)的知識,在前面的內(nèi)容中其實已基本涉及到了,現(xiàn)就總結(jié)歸納一下。在對話框上使用圖像,可采用以下幾種方法:

      ① 使用靜態(tài)圖像控件。采用這種方式時,既可以在對話框上顯示小幅圖像作為裝飾,又可在必要時顯示整幅圖像作為對話框的背景。但在設計對話框時要首先象對話框上加入靜態(tài)圖像控件,否則其它控件就會被所顯示的圖形遮擋。這是在對話框上使用圖像最簡單的方法。② 使用 CBitmapButton 類位圖按鈕在對話框上顯示圖像。一般很少采用這種方式來顯示圖案。但在某些特殊情況下時,例如要求對鼠標指針的移動具有感應功能時,這是最簡單易行的方法。示例可見 P112 5—2—3 CBitmapButton 類位圖按鈕。③ 重載對話框的 OnPaint()函數(shù)。在 OnPaint()函數(shù)中進行所需的繪圖操作。這通常是在對話框上顯示作為背景的位圖的最好方式,不會出現(xiàn)背景圖案將對話框上的其它控件遮擋住的情況。同使用 CBitmapButton 類位圖按鈕一樣,利用這種方法能夠?qū)崿F(xiàn)像“金山詞霸”那樣有限的 Skin 效果。示例可見 P108 5—5—1 從資源中讀取位圖。

      ④ 使用 Microsoft Forms 2.0 Image ActiveX 控件。這是在對話框上顯示真彩色圖像最簡單的方式。但也不要認為這種方法盡善盡美,使用該方法有可能在這臺機器上顯示的圖像精美絕倫,而在那臺機器上就一塌糊涂。

      在上述的方法中,只有最后兩種具有顯示真彩色圖像的能力,使用方法④并不是太可靠;使用方法③因為涉及到 DIB 文件的讀取又顯得略為復雜。實際上,并不是只有采用真彩色圖像才能取得華麗的界面效果,而且大量的采用真彩色圖像會導致程序過于龐大。一種很好解決方法是使用經(jīng)過色彩抖動的 256 色圖像來代替真彩色圖像。作為對讀者的一個建議,抓圖工具 HyperSnap-DX 其實是進行色彩抖動及圖像縮放的一個極好工具。

      第二篇:MFC實踐總結(jié)

      mfc編程實驗總結(jié)報告 知識總結(jié)+個人心得 2011年暑期mfc編程實驗報告 mfc編程實驗個人總結(jié)報告

      一、mfc類、函數(shù)等知識小結(jié):

      1、settimer(1, m_intlevel, null);在mfc程序中settimer被封裝在cwnd類中,調(diào)用就不用指定窗口句柄了于是settimer函數(shù)的原型變?yōu)椋? uint settimer(uint nidevent,uint nelapse,void(callback export *lpfntimer)(hwnd,uint ,yint ,dword))當使用settimer函數(shù)的時候,就會生成一個計時器。函數(shù)中nidevent指的是計時器的標識,也就是名字。nelapse指的是時間間隔,也就是每隔多長時間觸發(fā)一次事件。第三個參數(shù)是一個回調(diào)函數(shù),在這個函數(shù)里,放入你想要做的事情的代碼,你可以將它設定為null,也就是使用系統(tǒng)默認的回調(diào)函數(shù),系統(tǒng)默認認的是ontime函數(shù)。這個函數(shù)怎么生成的呢?你需要在需要計時器的類的生成ontime函數(shù):在classwizard里,選擇需要計時器的類,添加wm_time消息映射,就自動生成ontime函數(shù)了。然后在函數(shù)里添加代碼,讓代碼實現(xiàn)功能。每隔一段時間就會自動執(zhí)行一次。例: settimer(1,1000,null);1:計時器的名稱;

      1000:時間間隔,單位是毫秒; null:使用ontime函數(shù)。

      當不需要計時器的時候調(diào)用killtimer(nidevent);例如:killtimer(1);killtimer(1);

      2、typedef struct{};(1)struct{ int x;int y;}test1;好,定義了 結(jié)構(gòu) test1,test1.x 和 test1.y 可以在語句里用了。(2)struct test {int x;int y;}test1;定義了結(jié)構(gòu) test1,test1.x 和 test1.y 可以在語句里用了。

      與(1)比,省寫 了 test(3)typedef struct test {int x;int y;}text1,text2;此處時說了這種結(jié)構(gòu)體(類型)別名 叫 text1 或叫 text2,而不是定義了結(jié)構(gòu)體變量.真正在語句里用,還要寫: text1 test1;//定義結(jié)構(gòu)體變量

      然后好用 test1.x test1.y 或?qū)?text2 test1;//定義結(jié)構(gòu)體變量

      然后好用 test1.x test1.y

      3、invalidate();//讓客戶區(qū)無效,即時重新繪制客戶區(qū) void invalidate(bool berase = true);該函數(shù)的作用是使整個窗口客戶區(qū)無效。窗口的客戶區(qū)無效意味著需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前臺窗口,那么原來被遮住的部分就是無效的,需要重繪。這時windows會在應用程序的消息隊列中放置wm_paint消息。mfc為窗口類提供了wm_paint的消息處理函數(shù)onpaint,onpaint負責重繪窗口。視圖類有一些例外,在視圖類的onpaint函數(shù)中調(diào)用了ondraw函數(shù),實際的重繪工作由ondraw來完成。參數(shù)berase為true時,重繪區(qū)域內(nèi)的背景將被擦除,否則,背景將保持不變。

      4、cdc::rectangle(左上x,左上y,右下x,右下y);使用該函數(shù)畫一個矩形,可以用當前的畫筆畫矩形輪廓,用當前畫刷進行填充。

      函數(shù)原型:bool rectangle(hdc hdc, int nleftrect, int ntoprect, int nrightrect, int nbottomrect);

      hdc:設備環(huán)境句柄。

      nleftrect:指定矩形左上角的邏輯x坐標。ntoprect:指定矩形左上角的邏輯y坐標。nrightrect:指定矩形右下角的邏輯x坐標。nbottomrect:指定矩形右下角的邏輯y坐標。

      5、cbrush:: cbrush//畫刷類 eg:cbrush brushstick(rgb(127, 127, 127));四種構(gòu)造函數(shù): cbrush();cbrush(colorref crcolor);cbrush(int nindex, colorref crcolor);cbrush(cbitmap* pbitmap);參數(shù)說明: crcolor指定畫刷的前景色(rgb方式)。如果畫刷是陰影線型的,則指定陰影線的顏色。nindex指定畫刷陰影線采用的風格,取值如下: hs_bdiagonal45度的向下影線(從左到右)hs_cross水平和垂直方向以網(wǎng)格線作出陰影 hs_diagcross 45度的網(wǎng)格線陰影 hs_fdiagonal 45度的向上陰影線(從左到右)

      hs_horizontal 水平的陰影線 hs_vertical 垂直的陰影線 pbitmap指向cbitmap對象的指針,該對象指定了畫刷要繪制的位

      圖。

      構(gòu)造函數(shù)說明:

      6、messagebox(game over!);messagebox(null,text,title,button);參數(shù)title:string類型,指定消息對話框的標題。text:指定消息對話框中顯示的消息,該參數(shù)可以是數(shù)值數(shù)據(jù)類型、字符串或boolean值。icon:icon枚舉類型,可選項,指定要在該對話框左側(cè)顯示的圖標。button:button枚舉類型,可選項,指定顯示在該對話框底部的按鈕。default:數(shù)值型,可選項,指定作為缺省按鈕的按鈕編號,按鈕編號自左向右依次計數(shù),缺省值為1,如果該參數(shù)指定的編號超過了顯示的按鈕個數(shù),那么messagebox()函數(shù)將使用缺省值返回值integer。函數(shù)執(zhí)行成功時返回用戶選擇的按鈕編號(例如1、2、3等),發(fā)生錯誤時返回-1。如果任何參數(shù)的值為null,messagebox()函數(shù)返回null。

      函數(shù)原型:

      messagebox.show(text,title,messageboxbuttons,messageboxicon ,messageboxdefaultbuttons)參數(shù)說明:

      (1)text:必選項,消息框的正文。

      (2)title:可選項,消息框的標題。(3)messageboxbuttons:可選項,消息框的按鈕設置,默認只顯示【確定】按鈕。ok――確定 okcancel――確定和取消 abortretryignore――終止、重試和忽略 yesnocancel――是、否和取消 yesno――是和否 retrycancel――重試和取消

      (4)messageboxicon:對話框中顯示的圖標樣式,默認不顯示任何圖標。

      question――問號 information、asterisk――i號 error、stop、hand――錯誤號 warning、exclamation――!號 none――不顯示任何圖標

      (5)messageboxdefaultbuttons:可選項,對話框中默認選中的按鈕設置。

      defaultbutton1――第1個button是默認按鈕 defaultbutton2――第2個button是默認按鈕 defaultbutton3――第3個button是默認按鈕

      7、memcpy(拷貝目的地,拷貝對象,拷貝長度);包含在頭文件#include

      函數(shù)原型:

      extern void *memcpy(void *destin, void *source, unsigned n);功能:

      由source指向地址為起始地址的連續(xù)n個字節(jié)的數(shù)據(jù)復制到以destin指向地址為起始地址的空間內(nèi)。eg: int a=5,b=9;memcpy(a,b,sizeof(a));//將b按位拷給a;說明:

      1.source和destin所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向destin的指針。2.與strcpy相比,memcpy并不是遇到