1. 程式人生 > >C++實現第一個Windows程式設計Hello World

C++實現第一個Windows程式設計Hello World

C++實現第一個Windows程式設計

目錄結構:

控制檯的”Hello World”

先回顧一下C語言控制檯通過標準輸入輸出函式輸出"Hello world"

#include <stdio.h>
int main(){
printf("Hello World");
return 0;
}

Windows版的”Hello World”

再來看一下Windows版的Hello World!

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance,PSTR szCmdLine,int
iCmdShow ){ MessageBox(NULL,TEXT("Hello World"),TEXT("MessageBox"),0); return 0; }

在VS上編譯該程式碼:開啟 解決方案資源管理器 ,右鍵專案,選擇除錯->啟動新例項,經過編譯執行就可得到一個對話方塊了。

標題是MessageBox,內容為Hello World。一切都是那麼的美好。

WinMain函式的引數

1>. WinMain的第一個引數 HINSTANCE hInstance, 用書上的解釋為”例項控制代碼”, 由於第一次接觸C語言Windows程式設計, 對這個控制代碼的概念也不是很瞭解, 去百科了下, 控制代碼的解釋為:

一個控制代碼是指使用的一個唯一的整數值,即一個四位元組長的數值,來標誌應用程式中的不同物件和同類物件中的不同的例項,諸如,一個視窗,按鈕,圖示,滾動條,輸出裝置,控制元件或者檔案等。"——引用自百度百科->控制代碼。

筆者是這樣對控制代碼進行理解的, 在一個應用程式中, 通常建立了很多的視窗、按鈕、標籤, 或者使用了一個檔案等, 在程式的任何地方, 只要能夠獲得這個被稱為控制代碼的東西, 就能夠找到該控制元件或者視窗在記憶體中的位置, 從而對其進行操作。感覺有點像帶引數的main函式, 只是這裡的主函式引數為一個控制代碼。

2>. WinMain函式的第二個引數, 同樣是個例項控制代碼, 但書上又進一步解釋說在32位的Windows程式設計中, WinMain函式的例項控制代碼概念已不再採用, 因此WinMain的第二個引數通常總是NULL。

3>. WinMain的第三個引數是用來執行程式的命令列, PSTR: 用來指向一個字串的指標型別, szCmdLine, sz:表示以0結尾的字串; 目的是通過命令列方式執行程式並向主函式中傳入引數, 應該就像給main函式傳入引數一樣;

4>. WinMain的第四個引數是一個int型引數, 用來指明程式(視窗)最初如何被顯示, 例如最小化?最大化?全屏?

筆者的見解: 應該很有用, 經常見一些遊戲一啟動就是全屏的, 但是這個引數也是操心繫統傳給程式的麼?因為從平時執行Windows程式時都是直接雙擊, 並沒有通過命令列給它傳入引數, 在程式設計時應該對程式啟動時的顯示方式有交代才對, 這樣系統再執行時再把這個交代的引數傳入給程式告訴程式啟動時應該如何顯示.

(在”筆者的見解”部分的觀點均為筆者個人的見解, 如果有誤肯定指正, 我會及時更正, 避免誤導其他讀者。)

WinMain函式函式體的MessageBox函式

MessageBox(), 名如其”人”, 不用猜也知道這個就是顯示一個對話方塊的函式, 開啟API文件,MSDN Library通過索引找到MessageBox函式, 發現其宣告如下:

int MessageBox(
  HWND hWnd,          // handle of owner window, 視窗的一個控制代碼
  LPCTSTR lpText,     // address of text in message box, 一個文字(字串)的指標
  LPCTSTR lpCaption,  // address of title of message box, 標題字串的指標
  UINT uType          // style of message box, 對話方塊的風格
);

在上面示例中對MessageBox函式的呼叫如下:

MessageBox( NULL, TEXT("Hello,world!"), TEXT("MessageBox"), 0 );

第一個引數視窗的控制代碼的實參為NULL, 意思為不屬於任何視窗.
第二個引數為對話方塊的內容, 第三個引數為對話方塊的標題, 但是這兩個引數都使用了一個TEXT()的函式, 書上講使用TEXT()的目的是將這些字串打包到TEXT巨集程式碼裡面, 筆者嘗試了不用這個TEXT()函式而直接像這樣:

MessageBox( NULL, "Hello,world!", "MessageBox", 0 );

呼叫並沒有出現警告或者報錯資訊, 具體使用TEXT()函式的詳細原因還不太清楚, 暫時先在這裡畫個圈。

第四個引數為對話方塊的風格, 一些以MB_開頭的一些常量的組合, 可以使用OR(|)運算進行組合, 這些常量定義在WINUSER.H中, 例如常用的有:

1>.對話方塊按鈕型別:

    #define MB_OK                       0x00000000L            //僅有一個"確定"按鈕
    #define MB_OKCANCEL                 0x00000001L            //"確定" + "取消"
    #define MB_ABORTRETRYIGNORE         0x00000002L            //"終止" + "重試" + "忽略"
    #define MB_YESNOCANCEL              0x00000003L            //"是" + "否" + "取消"
    #define MB_YESNO                    0x00000004L            //"是" + "否"
    #define MB_RETRYCANCEL              0x00000005L            //"重試" + "取消"

2>.對話方塊中的圖示型別:

#define MB_ICONHAND                 0x00000010L            //一個紅X的錯誤/停止圖示
#define MB_ICONQUESTION             0x00000020L            //一個問號的詢問圖示
#define MB_ICONEXCLAMATION          0x00000030L            //一個黃色感嘆號的警告圖示
#define MB_ICONASTERISK             0x00000040L            //一個帶有i的資訊提示圖示

同時, 在這些圖示中有的還可以用其他名稱代替, 這些別名在WINUSER.H的定義如下:


#define MB_ICONWARNING              MB_ICONEXCLAMATION         //警告
#define MB_ICONERROR                MB_ICONHAND                //錯誤
#define MB_ICONINFORMATION          MB_ICONASTERISK            //資訊
#define MB_ICONSTOP                 MB_ICONHAND                //停止

博主:Now大牛
QQ : 201309512
釋出日期:2017-08-15