程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> API入門系列之六 -自己完成MessageBox

API入門系列之六 -自己完成MessageBox

編輯:VB.NET

API入門系列之六 -自己完成MessageBox。本站提示廣大學習愛好者:(API入門系列之六 -自己完成MessageBox)文章只能為提供參考,不一定能成為您想要的結果。以下是API入門系列之六 -自己完成MessageBox正文


我在第四篇文章:一個相當復雜的SDK順序中講到了經過調用MessageBoxAPI函數來彈出一個對話框,那你有沒有想過,我們一句復雜的代碼面前所隱藏的細節是怎樣的呢,那時分讓你理解這些不免還早了些,不過如今機遇到了,經過一些根本的API函數調用來完成一個自己的對話框其實也不是很難,那麼 這一篇文章就是這個目的。並順帶引見一些根本API的使用,由於後面五篇文章的鋪墊,我置信你對SDK 的順序的大致構造和相關字符處置都有所理解了,所以在這篇文章中的這些知識點,我就不再多說,以 免有些人覺得我真實太過啰嗦。真實疑惑的,可以參看後面的文章。

首先我先大約的列出我們為完成這個義務所要用到的一些API函數他

SetWindowText    設置窗口的標題

GetClientRect 失掉窗口客戶區的大小信息

GetWindowLongPtr 經過窗口句柄失掉和窗口的相關聯信息

CreateWindowEx 創立窗口

BeginPaint 失掉窗口的設備句柄

EndPaint 釋放窗口的設備句柄

DrawText 經過設備句柄在窗口上畫出文字

好了,就這些函數,我們就能自己完成有一個確定按鈕並在確定按鈕正上方顯示提示信息的簡易的對 話框了,不過這個對話框可是我們一句一句代碼自己完成的喲~~還是比擬有成就感吧~

順序的大體框架呢還是我們上一篇文章中的框架,注冊窗口類,創立一個主窗口,音訊循環,窗口消 息處置函數。不過要我們需求在窗口音訊處置函數中添加一些代碼來完成我們需求的功用。在什麼中央 添加呢?  上個順序,我們只處置WM_DESTROY這個音訊。關於這個音訊我不再做解說,不懂的或許遺忘 了的可以自己MSDN或許看上一篇文章,這裡我們要添加對兩個音訊的處置代碼,首先是WM_CREATE,這個 音訊會在一個窗口被創立的時分被發送到窗口音訊處置函數,假如一些事情需求在一個窗口剛被創立的 時分執行,那麼經過處置WM_CREATE最適宜不過啦,代碼如下:

case WM_CREATE:

{

RECT rctClient; //用來寄存主窗口客戶區大小信息

const int buttonWidth = 80; //按鈕的寬

const int buttonHeight = 25; /按鈕的高

GetClientRect( hwnd, &rctClient ); //失掉主窗口客戶區的大小信息

HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr( hwnd, GWLP_HINSTANCE );

HWND hButton = CreateWindowEx( 0L, _T("button"), _T("確定"),  WS_VISIBLE |  WS_CHILD , rctClient.right/2-buttonWidth/2, rctClient.bottom/2- buttonHeight/2, buttonWidth,  buttonHeight, hwnd, (HMENU)2, hInst, NULL );

SetWindowText( hwnd, _T("自定義對話框") );

break;

}

在WM_CREATE音訊的處置中,我們就用到了GetClientRect,它的第一個參數是窗口的句柄,你想要獲 取哪個窗口的客戶區大小,你就將傳遞哪個窗口的句柄,第二個參數是一個RECT構造的指針,我下面定 義了一個rctClient變量,然後這裡把這個變量的地址傳遞給GetClientRect的第二個參數,讓它將所得 到的窗口的大小信息保管到這個變量外面。這個函數的詳細用法,讀者冤家們還可以自己參考MSDN,如 果函數調用成功,那麼rctClient這個構造體變量中就寄存了這個窗口的大小信息了。

然後,我定義了兩個整形常量buttonWidth, buttonHeight用來保管我們需求創立的按鈕的寬和高。

再然後我調用GetWindowLongPtr這個函數獲取和窗口有關的信息,這裡獲取的是窗口所屬的使用順序 實例的句柄,也就是WinMain函數所傳遞出去的第一個參數。在失掉這些需求的信息之後,我們就開端著 手子窗體的創立了,這裡我們要創立的是一個按鈕,按鈕也是一個窗體,所以也需求窗口類,我們並沒 有寫按鈕的窗口類停止注冊,那麼這個窗口類由誰來注冊呢? 其實是有零碎創立並注冊了按鈕的窗口類 ,窗口類的名字是button,所以我們這裡盡管用這個窗口類來創立窗口就是了,我們創立主窗口是用的 WS_OVERLAPPEDWINDOW這個窗口款式,假如是創立一個子窗口,那麼我們需求指定WS_CHILD ,假如我們 需求創立的窗口能顯示出來,那麼需求指定WS_VISIBLE這個窗口款式,並且還需求指定創立的窗口所屬 的父窗口的句柄,如上代碼所示。其中第五個參數到第八個參數是該按鈕的坐標地位和寬度高度的信息 ,由於我們需求將該按鈕創立在主窗口的地方,所以有一系列的計算,詳細是怎樣計算的,就請各位自 己細心依據下面的代碼停止考慮了,假如還是有些疑惑,請與我討論或許參加SDK編程(81543028)群進 行討論交流。

創立完了按鈕子窗口,我們還需求將我們的主窗口的標題設置為我們想要的,可以經過 SetWindowText這個API函數來完成,第一個參數就是要設置的窗口的句柄,這裡為主窗口,所以是我們 窗口音訊處置函數傳遞出去的第一個參數hwnd, 第二個參數就是一個字符串指針,指向一個以零開頭 的字符串。這裡我們就直接將一個字符串常量的首地址傳遞給它。就完成了主窗口的標題設置。

經過下面這些步驟,我們曾經在主窗體的地方顯示了一個按鈕了,並且把主窗口的標題設置為我們自己需求 的,但是還要一個問題需求處理,那就是在按鈕的正上方顯示一串提示文本,怎樣來完成呢,這就是我 們上面要講的。

要在主窗口的按鈕的正上方顯示提示文本信息,就需求失掉主窗口的設備句柄,然後經過該設備句柄 調用GDI函數DrawText來完成。由於該提示文本需求在每次窗口停止更新的時分繪出,所以我們需求處置 WM_PAINT音訊來到達這個目的。上面還是先看代碼:

case WM_PAINT:

{

const int buttonWidth = 80;

const int buttonHeight = 25;

const int textHeight = 25;

PAINTSTRUCT ps;

HDC hdc = BeginPaint( hwnd, &ps );

RECT rctClient,rctText;

GetClientRect( hwnd, &rctClient );

rctText.left = rctClient.left;

rctText.right = rctClient.right;

rctText.top = rctClient.bottom/2 - buttonHeight -textHeight;

rctText.bottom = rctClient.bottom/2 - buttonHeight;

DrawText( hdc, _T("Beyondcode"), _tcslen( _T("Beyondcode")),  &rctText, DT_CENTER  | DT_SINGLELINE | DT_VCENTER );

首先定義了三個整形常 量 buttonWidth,buttonHeight指示方才創立的按鈕的大小,textHeight指示要顯示在文本的矩形框的 高度,矩形框的寬度和主窗口的寬度不斷,所以就沒定義了,然後PAINTSTRUCT 是BeginPaint和 EndPaint這兩個函數會用到的一個構造體類型,用它定義了一個構造體變量ps,並在調用BeginPaint和 EndPaint的時分將它的地址傳遞給他們的第二個參數。獲取一些相關和繪圖有關的信息。不過我們這裡 不會用到,所以就不做詳細解釋,可以檢查MSDN。

留意,BeginPatin這個函數會前往一個設備句柄,然後我們就可以經過這個設備句柄停止繪圖,顯示 文字也是一種繪圖,在繪圖終了後,我們需求調用EndPaint這個函數釋放方才失掉的哪個設備句柄,也 就是是方才哪個設備句柄有效。而一切的繪圖操作,都必需在BeginPaint和EndPatin這兩個函數之間完 成。如下面,經過參數hdc調用DrawText這個函數,由於獲取的hdc是經過hwnd這個窗口句柄的,所以這 裡一切的繪圖都會顯示在hwnd這個句柄所代表的窗口上,也就是主窗口。rctText是顯示文本的矩形的信 息,它的大小和地位是經過按鈕的大小和以後主窗口的大小信息計算出來的,詳細的計算代碼中曾經寫 的很清楚了,如有疑惑的可以和我交流交流。 然後還要說的一個就是DT_CENTER 和DT_VCENTER這兩個 標志表示在方才那個矩形框中的程度地方和垂直地方顯示我們的文本,DT_SINGLELINE就是指示單行顯示 。

最後留給大家一個問題,以供大家考慮,下面的順序中,當你改動窗口的大小的時分,就會呈現問題 ,按鈕就不會再位於主窗口的地方了,怎樣處理呢? 我提示一下吧,處置WM_SIZE這個音訊。好了,留下 這個義務給大家,試試吧~~讓按鈕隨時隨位置於主窗口的地方。

出處:http://blog.csdn.net/beyondcode

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved