標籤:target 出現 區別 介面 and inf dial 執行 引用
自學《Windows程式設計》(第五版 珍藏版),內容為學習筆記。
1 基礎
Windows是搶佔式、多任務、多線程圖形作業系統。Windows具有一個圖形化使用者介面(Graphical User Interface, GUI),有時亦稱為“虛介面”或“圖形介面”。所有的GUI都用位元影像(bitmap)視頻顯示器顯示圖形。圖形能夠提高螢幕資源的利用率,提供一個以視覺傳遞資訊的便利環境,並可使用 WYSIWYG(所見即所得 (WYSIWYG))來顯示為列印檔案而準備的圖形及格式化文本。
Windows環境中啟動並執行程式可以共用儲存在所謂動態連結程式庫(Dynamic-Link Libraries, DLL)檔案中的常式。Windows提供了在運行時把程式和動態連結程式庫中的常式連結起來的機制。其實Windows本身基本上就是一套動態連結程式庫。
Windows是一個圖形介面,Windows程式可以在視頻顯示器或印表機上充分利用圖形和格式化文本。圖形介面不僅僅看上去更酷、更引人注目,而且能夠在更高層次上與使用者交流資訊。
針對Windows環境編寫的程式用不著直接存取螢幕或印表機之類的圖形顯示硬體。Windows自己帶有一種圖形程式設計語言,稱作圖形裝置介面(Graphical Device Interface, GDI),用來方便地顯示圖形和格式化文本。Windows把顯示硬體虛擬化。這樣只要配有合適的Windows裝置驅動程式,針對Windows環境編寫的程式就可以在任何顯卡或印表機上運行。應用程式本身並不需要知道系統到底配備了什麼類型的裝置。
Windows工作原理的中心思想就是“動態連結”概念。Windows自身帶有一大套函數,應用程式就是通過調用這些函數來實現它的使用者介面和在螢幕上顯示文本與圖形的。這些函數都是在動態連結程式庫裡實現的。這些檔案的名稱都帶有尾碼.DLL,或有時帶有尾碼.EXE。Win10系統中,這些檔案通常放在C:\Windows\System32子目錄下。
在Windows程式中,調用Windows函數與調用C語言的庫函數(如Strlen),沒什麼兩樣。最主要的區別就是C語言庫函數的機器代碼會直接連結到你的程式碼中,而Windows函數則是放在你的程式之外的DLL裡。
當Windows程式運行時,它通過一個叫做“動態串連”(dynamic linking)的進程與Windows介面。每個Windows的EXE檔案包含它所要用的各個動態連結程式庫以及庫中的函數的引用地址(reference)。當一個Windows程式被裝入記憶體之後,程式中的函數調用都被解析成DLL函數入口的指標,同時這些被調用的函數也被裝入記憶體。
當連結Windows程式以產生執行檔案時,一定得連結你的編程環境所提供的特殊的“匯入庫”(import library)。這些匯入庫包含所有Windows函數調用要碰到的動態連結程式庫的名字及引用資訊。連結程式利用這些資訊構建EXE檔案中的表格,當裝入程式的時候,Windows要靠這些表格來解析Windows函數調用。
2 配置Visual Studio 2017
讓Visual Studio 2017帶上Windows API文檔,即擷取MSDN,具體參考http://blog.csdn.net/qq_33369475/article/details/74931006
3 第一個Windows程式
/*----------------------------------------------------------HelloMsg.C -- Displays "Hello, Win10!" in a message box ----------------------------------------------------------*/#include<Windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){MessageBox(NULL, TEXT("Hello, Win10!"), TEXT("HelloMsg"), 0);return 0;}
3.1 標頭檔
WINDOWS.H是一個最重要的包含檔案,它囊括了若干其他Windows檔案,其中的某些標頭檔又包含另外一些標頭檔。下列幾個是最要也是最基本的標頭檔:
- WINDEF.H 基礎資料型別 (Elementary Data Type)定義
- WINNT.H 支援Unicode的類型定義
- WINBASE.H 核心功能
- WINUSER.H 使用者介面函數
- WINGDI.H 圖形裝置介面函數
3.2 程式入口
正像main是C程式的入口一樣,Windows程式的入口是WinMain。將游標移到WinMain處,按F1開啟協助。
WinMain entry point--The user-provided entry point for a graphical Windows-based application.
看看文法:
int CALLBACK WinMain( _In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow);
CALLBACK宏和WINAPI本質都是一樣的,在WINDEF.H中定義如下:
#define CALLBACK __stdcall#define WINAPI __stdcall
這是一種函數呼叫慣例,表明如何產生在堆棧中放置函數調用參數的機器代碼。絕大多數Windows函數調用都定義成WINAPI。
_In_宏告訴我們這是個輸入參數,同時還有_Out_,表示輸出參數。這對宏並不參與編譯和計算(空宏),但對API使用者起到提示作用。
參數類型的定義細節先不要細究,感興趣可以Alt+F12瀏覽。
第一個參數叫“執行個體控制代碼”。在Windows程式中,控制代碼就是一個數值,程式裡用它來標識某些東西。比如在該程式中,這個控制代碼唯一標識了這個程式。
早期的Windows版本中需要hPrevInstance(原因見p15),在32位Windows中已經不再需要。因此第二個參數總是NULL。
第三個參數類型改為了PSTR,LPSTR和PSTR在WINNT.H中都聲明為指向字串的指標。LP是16位的產物。該參數是用來運行程式的命令列。有些Windows程式在啟動時用它來把檔案裝入記憶體。
第四個參數用來指明程式最初如何顯示:或正常顯示,或最大化到全屏,或最小化顯示在工作列上。
統一說命名,絕大部分Windows程式在變數命名上都採用所謂“匈牙利標記法”(Hungarian Notation)。在這一系統中,變數名前都有一個短首碼,用以表明改變數的資料類型。這裡,i表示int,sz表示“以零結尾的字串”(String Terminated with a Zero),考慮本質,故更改了後兩個參數的名字。
3.3 MessageBox函數
老辦法,移入游標,按F1。
MessageBox function--Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. The message box returns an integer value that indicates which button the user clicked.
int WINAPI MessageBox( _In_opt_ HWND hWnd, _In_opt_ LPCTSTR lpText, _In_opt_ LPCTSTR lpCaption, _In_ UINT uType);
_In_opt_表示參數是可選的,就是可以為NULL。
第一個參數通常是視窗控制代碼。
第二個參數是將要在資訊框裡出現的文本字串。
第三個參數是將要在標題列上顯示的文本字串。這些文本串都被打包在TEXT宏代碼(Macro)裡。一般來說,並不需要把所有的字串都打包到TEXT中,之所以這樣做是因為這樣把程式轉換成Unicode時會方便很多。
第四個參數是以首碼MB_打頭的一些常量的組合。WINUSER.H中定義了這些相關常量。主要用於控製圖標、按鈕等樣式。MSDN中也可以仔細查看。
傳回值和按鈕有關,即按下不同按鈕會返回不同的值。
Windows程式設計1 起步