1 MFC對話框之上的動態(tài)控件的創(chuàng)建
在對話框上的控件是MFC類的一個具體對象,其對應(yīng)的變量內(nèi)包含了類的數(shù)據(jù)成員和函數(shù)成員。當在對話框之上使用靜態(tài)控件時,可以根據(jù)類向?qū)頌槊總€控件添加消息、響應(yīng)函數(shù)以及變量。當需要在對話框中動態(tài)的創(chuàng)建某個控件時,就需要手動為動態(tài)控件添加消息、響應(yīng)函數(shù)及變量,即是手動來代替類向?qū)А?br>
動態(tài)創(chuàng)建控件時,可按照以下步驟進行:
(1) 明確控件所屬于的類
每一個控件都對應(yīng)著一個類,如按鈕Button所屬于的類為CButton。在程序中我們需要用CButton類創(chuàng)建一個具體的按鈕對象,并用函數(shù)指示它在對話框之上的位置及大小。由于指針的眾多好處,可用一個CButton *類型的變量來管理所創(chuàng)建的按鈕。但要謹慎使用指針變量,防止內(nèi)存泄露,野指針。
(2) 確定控件的ID號
在對話框中的每一個控件都有一個獨一無二的ID號。當用控件類來創(chuàng)建具體的控件對象時也需要這個ID來作為標識。ID號其實是一個宏,為了控件ID的有序性,可以到VS2012“資源管理器”下的String Table下為每一個控件定義ID值。這些ID號會自動的被保存到Resource.h文件中形成宏。
(3) 動態(tài)創(chuàng)建控件的一般流程
在明確了控件類和其ID號之后,就可以在合適的函數(shù)內(nèi)編寫動態(tài)創(chuàng)建控件的代碼。動態(tài)生成按鈕(Button)、文本框(Staic Text)、編輯框(Edit Control)、聯(lián)合框(Combo Box)等控件的流程可表述如下(以創(chuàng)建文本框為例筆記):
-
- CStatic *CMFCDialogDlg::CreateOneStatic(LPCTSTR str, CRect Coord, UINT IDC)
- {
- CStatic *pStatic = NULL;
-
- pStatic = new CStatic;
- ASSERT_VALID(pStatic);
- pStatic->Create(str, WS_CHILD|WS_VISIBLE|SS_CENTER, Coord, this, IDC);
-
- return pStatic;
- }
以上是創(chuàng)建一個文本框的函數(shù)。首先明確文本框類為CStatic,然后用C++的動態(tài)分配函數(shù)分配一個文本框?qū)ο?,最后利用文本此對象的Create函數(shù)將對象按照指定風(fēng)格(標題str,文本框顯示外表,坐標,ID號)顯示在對話框之上。最后將創(chuàng)建的控件地址返回給調(diào)用函數(shù)以管理。動態(tài)創(chuàng)建控件的核心就是每個控件類的對象中的create函數(shù),不同的控件類的create函數(shù)需要的參數(shù)可能不同。當需要釋放創(chuàng)建的動態(tài)按鈕時,用delete語句釋放動態(tài)按鈕的地址即可(這也屬于new-delete動態(tài)分配必須的搭配),在對畫框之上創(chuàng)建的控件也會隨之消失。
(4) 動態(tài)控件大小隨對話框比例變化
利用控件內(nèi)的Create函數(shù)動態(tài)創(chuàng)建控件到對話框上時,可以不要將坐標都用常值。因為對話框窗口可以跟隨用戶的需要發(fā)生變化。MFC中指定了對話框大小發(fā)生變化的消息ON_WM_SIZE(),只要在ON_WM_SIZE()消息對應(yīng)的響應(yīng)函數(shù)OnSize()中獲取到大小變化后的對話框的尺寸大小,那么就能夠按照動態(tài)控件與對話框的比例來決定當前控件的大小了。這樣,動態(tài)控件也能夠跟隨對話框成比例的變化了。
2 Picture Control控件顯示圖片
在MFC中,CImage類中包含了載入圖片、繪制圖片到某區(qū)域的成員函數(shù)。而Picture Control控件正是為CImage對象提供了一個平臺。也就是說經(jīng)CImage對象載入到內(nèi)存中的圖片可以在Picture Control控件之上繪制出來。所以,CImage類和Picture Control控件類可以搭配使用。
(1) 準備Picture Control控件
直接切換到對話框文件下,往對話框中拖入一個PictureControl控件。記住其ID號。
(2) Picture Control控件顯示圖片的代碼
只從顯示圖片這個角度上說。Picture Control控件只是為圖片顯示提供了一個平臺,載入圖片及繪制圖片的操作都是由CImage對象的成員函數(shù)完成的,另外還會用到一些其它的常用函數(shù)。
- int cx, cy;
- CImage image;
- CRect rect;
-
-
- image.Load(_T("E:\\MyLibrayPhotoShop\\log.jpg"));
-
- cx = image.GetWidth();
- cy = image.GetHeight();
-
-
- GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect);
-
- ScreenToClient(&rect);
-
- GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left, rect.top, cx, cy, TRUE);
- CWnd *pWnd = NULL;
- pWnd = GetDlgItem(IDC_PICTURE);
- pWnd->GetClientRect(&rect);
-
- CDC *pDc = NULL;
- pDc = pWnd->GetDC();
-
- image.Draw(pDc->m_hDC, rect);
-
- ReleaseDC(pDc);
讀這段代碼。
[1] CImage內(nèi)的Load方法將指定路徑下的圖片載入,然后在利用其內(nèi)的GetWidth和GetHeight方法獲取到圖片的寬度和高度。
[2] GetDlgItem通過PictureControl控件的ID獲取到它的句柄后調(diào)用Picture Control中的GetWindRect方法來獲取它本身在對話框中所占用的范圍。然后利用ScreenToClient方法將客戶區(qū)轉(zhuǎn)到Picture Control內(nèi),目的是利用Picture Control內(nèi)的MoveWindow方法重新設(shè)置Picture Control控件在對話框上所占的位置,是它適應(yīng)圖片的大小。
[3] 再重新設(shè)獲取picture Control在對話框中占用的面積。用pDc來管理Picture Control中的DC。然后CImage的Draw方法就可以利用獲取的參數(shù)在rect區(qū)域繪制圖片了。
程序運行如下:
如果程序需要多次運行以上代碼時才能夠準確的顯示圖片,那么可以先一次性(如在OnInitDialog()函數(shù)中)載入圖片。然后在OnPaint()函數(shù)中編寫繪制圖片的函數(shù),讓它得到多次運行。
MFC Note Over.