l 我習慣了VB那樣的Form編程,無(wú)法適應MFC怎么辦?
一個(gè)小的程序一般不必利用MFC的文檔/視圖結構,那樣實(shí)在是很麻煩。其實(shí)MFC編程也可以基于對話(huà)框的。VC++里面的對話(huà)框資源設計器是VB程序員最熟悉的東西了,你可以任意拖一些控件到對話(huà)框面板上,然后按回車(chē)鍵就可以編輯它的屬性,雙擊一個(gè)按鈕就可以創(chuàng )建一個(gè)事件響應,再次雙擊就可以編寫(xiě)響應的代碼,這倒是挺爽的。對,編寫(xiě)小應用程序就不妨使用基于對話(huà)框的MFC.把對話(huà)框理解為Form就行了。接下來(lái)找一些不同之處:
n 文本和圖片拖進(jìn)去就統統成了IDC_STATIC,無(wú)法創(chuàng )建響應事件。不要急,把IDC_STATIC改成別的就行了,比如ID_PIC,然后用ClassWizard賦予它控制變量,再雙擊看看:)。然后你就可以在程序里任意改變它的屬性,比如SetWindowText(),SetBitmap()等等。
n 控件放多了總是互相遮蓋,設計器沒(méi)有做好層次的管理問(wèn)題,所以調來(lái)調去效果總是不盡人意。其實(shí)這是因為設計器總是把先放在面板上的控件排在最高層,后方上去的排在最底層,和通常使用習慣相反。按照這個(gè)思路可以做一些創(chuàng )建先后順序的調整。也用記事本可以打開(kāi)資源文件(xxxx.RC),手工調整控件的排列層次順序。
l 怎樣在任意函數內在屏幕上畫(huà)圖?
在屏幕上畫(huà)圖需要獲取CDC指針。在文檔/視圖結構程序中,視圖類(lèi)里有OnDraw函數,由系統傳遞了CDC* pDC參數,所以可以直接用。在其他函數內想要在屏幕上畫(huà)圖就需要獲取CDC指針。代碼如下:
CDC* pDC=GetDC();
也可以不聲明指針,直接在需要的地方使用GetDC(),如:
GetDC()->SetTextColor(RGB(0,0,0));
l 只有CDC指針時(shí),怎樣獲取HDC結構指針?
比如使用函數
TransparentImage(pDC,left, top, bmpInfo.bmWidth, bmpInfo.bmHeight, dcMemory, 0,0,bmpInfo.bmWidth, bmpInfo.bmHeight, crTransparent);
編譯會(huì )出現這樣的錯誤:
Error C2664: 'TransparentImage' : cannot convert parameter 1 from 'class CDC *' to 'struct HDC__ *'
只需要把參數pDC改為pDC->m_hDC即可。
l 怎樣在客戶(hù)區創(chuàng )建位圖按鈕?
MSDN里只講了這些:
To create a bitmap-button control in a window’s client area
Create one to four bitmap images for the button.
Construct the CBitmapButton object.
Call the Create function to create the Windows button control and attach it to the CBitmapButton object.
Call the LoadBitmaps method to load the bitmap resources after the bitmap button is constructed.
還給出了例子,如下:
CBitmapButton myButton;
// Create the bitmap button (must include the BS_OWNERDRAW style).
myButton.Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,
CRect(10,10,100,100), pParentWnd, 1);
// Load the bitmaps for this button.
myButton.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);
用ClassWizard建立View的Create事件,把它放進(jìn)去就行了。
接下來(lái)需要編制該按鈕的響應事件,在.h文件的DECLARE_MESSAGE_MAP() 前面加上相應函數的聲明,例如:
afx_msg void OnBtnMenu();
在.cpp文件中BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間加入ON_BN_CLICKED(IDC_BTN_MENU, OnBtnMenu)
其中IDC_BTN_MENU是按鈕的ID,因為是自己創(chuàng )建的,需要在資源中加入它得字符串ID,系統會(huì )自動(dòng)分配一個(gè)數字給它,這個(gè)數字我們不必關(guān)心,只要知道IDC_BTN_MENU就代表這個(gè)按鈕就行了;OnBtnMenu是響應事件的函數名,在后面添加這個(gè)函數就行了,當然也不要忘了聲明這個(gè)函數。
創(chuàng )建普通按鈕同理,其實(shí)更加簡(jiǎn)單。不過(guò)千萬(wàn)不要使用BS_OWNERDRAW屬性,否則系統不會(huì )自動(dòng)畫(huà)出它的。
l 怎樣在對話(huà)框創(chuàng )建位圖按鈕?
上面講了怎樣在客戶(hù)區創(chuàng )建位圖按鈕,可是我更喜歡用對話(huà)框,所以希望在對話(huà)框上放置位圖按鈕。
很簡(jiǎn)單,使用資源創(chuàng )建器來(lái)創(chuàng )建一個(gè)普通按鈕,用ClassWizard賦予它控制變量,在頭文件里把它的類(lèi)型改為CBitmapButton,它就變成位圖按鈕了。然后把它的屬性Owner Draw選上。接下來(lái)在OnInitDialog中使用LoadBitmaps函數就成功了,比如:
myButton.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);
雙擊它也可以產(chǎn)生響應函數設置,和普通按鈕一樣使用。
l 怎樣隱藏一個(gè)控件?
很簡(jiǎn)單,用ClassWizard賦予控件一個(gè)控制變量,注意,一定是CControl型的!然后調用它的ShowWindow(SW_HIDE)即可,想再顯示出來(lái)就調用ShowWindow(SW_SHOW)。
聯(lián)系客服