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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章