恩,開始寫Windows API編程第二節吧。
上次介紹了幾個關於Windows API編程最基本的概念,但是如果只是看這些概念,估計還是對Windows API不是很了解。這節我們就使用Windows API 讓大家來了解下Windows API的用法。
第一個介紹的Windows API 當然是最經典的MessageBox,這個API 的作用就是在電腦上顯示一個對話框,我們先來看看這個API的定義吧:
int
WINAPI MessageBox(
HWND
hWnd,
LPCTSTR
lpText,
LPCTSTR
lpCaption,
UINT
uType);
恩,你現在肯定會覺得這是什么啊? 怎么好像除了int剩下的一個也不認識。以后我們會解釋。但在解釋之前我們必須了解一個Windows API 編程的常識,就是在Windows編程中,它為了方便記憶和使用,給原來咱們知道的基本類型定義了大量的宏定義或者使用結構體定義了大量新的數據結構。 比如這個
LPCTSTR
你一定會說,這是什么數據類型啊? 原來從來沒見過。但是其實它的本質就是一個指針,它是一個指向字符串的指針。 而UINT其實就是 unsigned int 也就是無符整型,在Windows API 編程中會遇到很多很多這樣新的類型,每次遇到去上網查下就行。你只要知道這些新的類型本質還是咱們學過的那些 int,char,指針就行。 現在讓我們使用一下這個API:
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
MessageBox(NULL, "你好", "我的第一個窗口程序", MB_OK);
return 0;
}
在編譯器下運行這段代碼就會的到下面的運行結果,是不是覺得這就是平時我們見到的那些對話框:
這下我們來仔細解釋下這段代碼具體是什么意思(可能現在有些解釋看不懂,但還是都看下,以后就會慢慢理解的)
1. #include<windows.h>
這個就是Windows API 編程必須需要的頭文件,如果你學過C語言,你就會知道,在頭文件中聲明了大量的函數供我們使用,這個MessageBox 在這個頭文件有聲明,我們在使用API的時候,必須要包含這個頭文件,否則編譯器不會識別API。
2. int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nShowCmd)
這個函數是一個32位應用程序的入口點,它會被系統自動調用,是不是感覺和C語言中的main函數很相似,只是這個Winmain函數怎么有那么多的參數?還有那個WINAPI是什么意思 呢? 現在我們來解釋下,WINAPI 是__stdcall 的宏定義,它的作用是定義函數參數入棧順序的。而WinMain函數那四個參數,我們來解釋下,這里面有些解釋比較抽象,不懂先放下,以后編寫的程序多了就會自然而然理解的。解釋中有個句柄這個術語估計大家比較陌生,其實可以這樣理解,這就是Windows給系統中運行中每一個程序或資源起了一個互不相同的名字,只是官方叫法叫句柄(HANDLE)。以下就是WinMain函數參數的解釋:
hInstance:應用程序當前實例的句柄。
hPrevlnstance:應用程序的先前實例的句柄。對於同一個程序打開兩次,出現兩個窗口第一次打開的窗口就是先前實例的窗口。對於一個32位程序,該參數總為NULL。
lpCmdLine:指向應用程序命令行的字符串的指針,不包括執行文件名。
nCmdShow:指明窗口如何顯示(是隱藏還是顯示,有沒有最大化按鈕之類的),具體取值可以自己搜索。
3. MessageBox(NULL, "你好", "我的第一個窗口程序", MB_OK);
這個API函數就是顯示一個模態對話框,這個函數的定義是:int
WINAPI MessageBox(
HWND
hWnd,
LPCTSTR
lpText,
LPCTSTR
lpCaption,
UINT
uType);
以下就是MessageBox函數參數解釋:
hWnd:消息框的擁有窗口。如果此參數為NULL,則消息框沒有擁有窗口。
lpText:消息框的內容。
lpCaption:消息框的標題。
uType:指定一個決定對話框的內容和行為的位標志集(就是對話框顯示的具體樣式,比如有一個感嘆號,或者有一個確定鍵),具體取值可以自己搜索。
恩,這就是簡單的Windows API 的一個應用,現在是不是覺得API編程也不是那么神秘了。