API入門系列之七 -完善MessageBox。本站提示廣大學習愛好者:(API入門系列之七 -完善MessageBox)文章只能為提供參考,不一定能成為您想要的結果。以下是API入門系列之七 -完善MessageBox正文
各位不好意思,前幾天有些事很忙,昨天賦稍稍有時間閒暇上去,所以我將我的API入門系列文章持續下去,上一篇《自己完成MessageBox》中我們根本曾經完成了一個對話框了,可以在地方顯示自己的文字,並且顯示一個確定按鈕,可是,上一篇完的時分我留下了一個問題,那就是那個確定按鈕並不會依據窗口的大小的改動而改動。那麼我們怎樣來處理這個問題呢?
我給出了提示可以經過處置WM_SIZE來完成這個目的。那麼明天我們就來完成這一遺留的問題。所要運用到的新的API函數也不多,就兩個,要處置的音訊也就兩個WM_SIZE和WM_COMMAND
GetDlgItem
MoveWindow
這麼兩個,至於其他的API函數,都是我們以前接觸過的,假如你遺忘了,可以自己溫習一下運用方 法。
首先,我們先看WM_SIZE音訊處置函數是怎樣寫的
case WM_SIZE:
{
const int buttonWidth = 80;
const int buttonHeight = 25;
int buttonx, buttony;
RECT rctClient;
GetClientRect( hwnd, &rctClient );
buttonx = rctClient.right/2 - buttonWidth/2;
buttony = rctClient.bottom/2 - buttonHeight/2;
HWND hButton = GetDlgItem( hwnd, 2 );
MoveWindow( hButton, buttonx, buttony, buttonWidth, buttonHeight, TRUE );
}
break;
由於這篇文章內容比擬少,那麼我就可以詳細的引見一下WM_SIZE這個音訊處置函數中完成按鈕一直 堅持居中的代碼。WM_SIZE這個音訊是當一個窗口的size也就是大小被改動後而被發送到該窗口的音訊處 理函數的。我們在這裡經過截獲WM_SIZE就可以在每次窗口大小被改動的時分停止一些處置,我們這裡的 處置就是將該窗口上的一個子窗口,也就是那個確定按鈕挪動到地方。
首先,我們還是老規矩,定義buttonWidth,和buttonHeight兩個常整形來寄存確定按鈕的長和高。然 後定義了兩個整形變量buttonx,和buttony用來寄存前面經過計算失掉確實定按鈕的左上角的坐標地位 。
然後定義了一個RECT構造體用來保管前面經過GetClientRect API函數獲取的窗口的長寬,其中 rctClient中right就保管了窗口的長,bottom就保管了窗口的高。我們為了讓按鈕堅持在主窗口的地方 ,那麼我們就需求讓按鈕的左上角的x坐標地位在主窗口的長的一半再減去按鈕的長的一半的地位。高也 是一樣的原理。所以 buttonx = rctClient.right/2 - buttonWidth/2; buttony = rctClient.bottom/2 - buttonHeight/2; 這兩句就是依據以後主窗口的長和高計算按鈕應該在的位 置。
計算完成後,我們就只需求挪動按鈕就可以了。可是挪動按鈕之前,我們需求取得按鈕的句柄,這個 句柄怎樣取得呢,有很多中辦法,這裡我就用GeDlgItem這個API函數來獲取,它需求兩個參數,第一個 參數是一個主窗口的句柄,這裡我們就傳遞按鈕的主窗口的句柄hwnd,第二個參數是按鈕的一個標識符 ,由於我們在前一篇文章中用CreateWindowEx創立子窗口的時分給按鈕指定的標識符是2,所以這裡我們 就傳遞2,那麼這樣GetDlgItem前往的就是這個按鈕的句柄了。
失掉了句柄後,我們就需求用MoveWindow來挪動這個子窗口按鈕,到我們需求的地位了。第一個參數 是這個字窗口的句柄,也就是我們下面取得的句柄,第二個參數和第三個參數是挪動到的x,y坐標。這 裡我們傳遞buttonx和buttony,第四個和第五個是挪動的窗口的長和高,假如同時還需求改動窗口的長 和高,那麼這裡也可以傳遞改動後的長和高的值,我們這裡只挪動地位,不改動大小,所以就傳遞 buttonWidth和buttonHeight。最後一個參數是一個BOOL型的,指示能否需求重繪,這裡傳遞TRUE,也就 是讓它在挪動後停止重繪。
好了,如今,當你改動主窗口的大小的時分,外面確實定按鈕也會跟著改動地位而到達一直堅持在主 窗體的地方。
可是還有一個問題就是,當我們點擊按鈕的時分,順序沒有任何的反映,MessageBox確實定按鈕被點 擊的時分普通都會封閉以後對話框,所以我們這裡也需求完成當用戶點擊確定按鈕的時分,將我們的主 窗體封閉。那麼怎樣來完成呢。
在完成之前,我首先要講一講,子窗體是怎樣告訴他們的父窗體的,比方說按鈕被點擊的時分是怎樣 告訴他們的父窗體的。其實普通就是經過WM_COMMAND來告訴的,例如我點擊這個確定按鈕,那麼在這個 確定按鈕的窗口音訊處置函數中就會向它的父窗體的窗口音訊處置函數發送一條WM_COMMAND音訊,並且 WM_COMMAND音訊的wParam參數的低16包括的就是一個標識符,指示是哪個子窗體發送的這條音訊。至於 wParam的高16和lParam包括的是些什麼信息,就請各位自己查閱MSDN了,這裡我們不會用到,也就不做 解說了。
所以我們要處置在子窗體上發作的事情,就需求在父窗體的音訊處置函數中截獲WM_COMMAND音訊,並 停止處置。那麼這裡的WM_COMMAND音訊處置也很復雜,如下
case WM_COMMAND:
{
if( LOWORD(wParam)==2 )
{
DestroyWindow( hwnd );
}
}
break;
就是用LOWORD這個宏來取出wParam的低16位,並且判別是不是2,也就是判別是不是確定按鈕的標識 符,假如是,就表示確定按鈕上發作了事情,詳細的事情我們就沒做過細的判別了,普通來說都是指被 點擊。所以我們就停止處置,調用DestroyWindow這個API來銷毀主窗體。就到達了我們的目的了。
怎樣樣,比擬復雜吧~
經過7篇API入門系列文章的引見,我想你對WIN32 API編程的普通流程還是有了一個大約的理解了吧 。以及關於windows的數據類型,字符編碼方面。API的運用方面,音訊的處置方面,由於都不會生疏了 吧·
所以我前面的文章,關於細節就不會這麼細了,關於一個API函數,假如參數不是很復雜,我也不會 做過多的解釋了。而只是闡明一下它的作用。至於細節,各位就應該養成MSDN的習氣了。