專欄導航
上一篇:第1章,[標簽 Win32] :第一個 WIn32 程序,程序入口
回到目錄
下一篇:無
本節前言
本節的學習,需要前兩節的內容作為先修知識。如果還沒有去看本專欄的前兩節,請你先去學習它們。
前兩節內容的文章鏈接如下。
第1章,[標簽 Win32] :第一個 WIn32 程序,頭文件-CSDN博客
第1章,[標簽 Win32] :第一個 WIn32 程序,程序入口-CSDN博客
在你學習過了上面的兩篇文章教程的基礎上,再來學習本節內容。
本節所采用的解決方案,是下面的文章鏈接所用的解決方案。
第1章,[標簽 Win32] :第一個 WIn32 程序,頭文件-CSDN博客
本節,我們要去講解的,是 MessageBox 函數。
一.? ? 本節代碼
首先呢,我們還是將本節的代碼給貼出來。
#include <Windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, TEXT("這是一個 Windows SDK 程序"),TEXT("WIndows SDK"), 0);return 0;
}
需要說明的是,本分節所給出的代碼,只是解決方案里面添加的原始的代碼。在本篇文章里面,大家隨時需要根據本節教程的提示,修改其中的某些參數,以此來學習 MessageBox 函數。
二.? ? MessageBox 函數簡介
MessageBox 所顯示的小窗口,實際上是一個對話框。它的作用,主要是用來顯示簡短的信息。平時,我們自己去編寫程序的時候,也可以將它用作一種調試手段。
在本專欄里面,我們將 MessageBox 所形成的對話框,稱作消息對話框,或者簡稱消息框。
MessageBox 函數的第一個參數,通常是一個窗口句柄。在本章里面,我們暫且不展開對此參數的討論。此處只要知道,我們可以將第一個參數設置為 NULL 。事實上,本篇文章的第一分節里面,給出的代碼中,MessageBox 函數的第一個參數,正是 NULL 。
第二個參數,是將要在信息框里出現的文本字符串。
第三個參數,是將要在標題欄里面顯示的文本字符串。
在這里,第二個參數和第三個參數所用到的文本字符串,我們都是將其打包在了 TEXT 宏代碼里面。假定,我們想要讓信息框顯示的內容為【你好啊,學習者】。那么,我們給第二個參數傳遞的內容,不是【"你好啊,學習者"】,而是【TEXT("你好啊,學習者")】。
在基礎的 C 語言學習里面,字符串都是直接包含在一對英文雙引號里面的。而在 Windows 程序里面,我們通常不推薦這么做,而是選擇將原本的 C 字符串包含在 TEXT 宏代碼里,或者 _T 宏代碼,或者 __T 宏代碼里。也就是,將 C 字符串【"你好啊,學習者"】寫作【TEXT("你好啊,學習者")】,或者寫作【_T("你好啊,學習者")】,或者寫作【__T("你好啊,學習者")】。
究竟是采用哪種宏代碼,看你的習慣了。
佩措爾德先生的教材里面,使用的,主要是 TEXT 宏代碼。而在 Jeff Prosise 的 MFC Windows 程序設計教材里面,主要采用的是 _T 宏代碼。個人覺得,_T 宏代碼,算是更為簡潔一些。不過,本專欄里面,很有可能,會是既使用 TEXT 宏代碼,也使用 _T 宏代碼。
需要注意的是,如果你使用的是 TEXT 宏代碼,則程序開頭只需要包含 Windows.h 頭文件。如果你使用的是 _T 或者 __T 宏代碼,則除了 Windows.h 頭文件之外,你還需要包含 Tchar.h 頭文件。
而在大家自己去編程的時候,我推薦大家使用的是 _T 宏代碼。因為,使用這種形式的話,下劃線,大寫字母 T,括號,雙引號,都是一氣呵成,比較快捷一些。而 TEXT 宏代碼,輸入起來就需要多一些的字母了。
我們接著看第四個參數。
MessageBox 函數的第四個參數,是以 MB_ 打頭的一些常量的組合。在 Winuser.h 頭文件中,定義了這些相關常量。
這些常量從用途上看,可以大致分為兩類。第一類是用來決定,在消息框里面顯示哪些按鈕。第二類是用來決定,在消息框里面顯示哪些圖標。
首先呢,我們來看第一類,顯示按鈕的常量。
(一)按鈕類型
MB_ABOUTRETRYIGNORE :表示含有【關于】,【重試】,【忽略】按鈕。
MB_OK :表示含有【確定】按鈕。
MB_OKCANCEL :表示含有【確定】,【取消】按鈕。
MB_RETRYCANCEL :表示含有【重試】,【取消】按鈕。
MB_YESNO :表示含有【是】,【否】按鈕。
MB_YESNOCANCEL :表示含有【是】,【否】,【取消】按鈕。
WinUser.h 頭文件中還給出了以下的宏定義代碼。
#define MB_OK 0x00000000L
#define MB_OKCANCEL 0x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
#define MB_YESNO 0x00000004L
#define MB_RETRYCANCEL 0x00000005L
某一個整數常量,后面加上大寫的 L 后綴,表示此整數常量是一個 long 型整數。
由上面的代碼塊的內容可以知道,MB_OK 被定義為 0 。所以呢,在本節的代碼里,將第四個參數設置為 0,就表示說,此消息框中含有確定按鈕。
需要注意的是,上面的幾個用來表示按鈕的 MB_ 打頭的整數常量,僅能夠使用一個,不可以將兩個或兩個以上的按鈕常量,用位或運算符【|】組合在一起。
但是呢,你可以使用 C/C++ 里面的位或運算符 【|】來把上面的其中一個按鈕,跟下列常量組合起來,來描述哪個按鈕為默認按鈕。
#define MB_DEFBUTTON1 0x00000000L
#define MB_DEFBUTTON2 0x00000100L
#define MB_DEFBUTTON3 0x00000200L
#define MB_DEFBUTTON4 0x00000300L
到這里為止,用來表示按鈕的 MB_ 常量我們就算是講完了。
(二)圖標類型
MB_ICONHAND, MB_ICONSTOP, MB_ICONERROR :三個宏常量,均表示叉號圖標,用哪個都可以。
MB_ICONQUESTION :表示問號圖標
MB_ICONEXCLAMATION, MB_ICONWARNING :兩個宏常量,均表示感嘆號圖標,用哪個都可以。
MB_ASTERISK, MB_ICONINFORMATION :兩個宏常量,均表示信息提示圖標,用哪個都可以。
需要注意的是,上面的幾個用來表示圖標的 MB_ 打頭的整數常量,僅能夠使用一個,不可以將兩個或兩個以上的圖標常量,用位或運算符【|】組合在一起。
以下是表示各個圖標的宏常量的宏定義代碼。
#define MB_ICONHAND 0x00000010L
#define MB_ICONQUESTION 0x00000020L
#define MB_ICONEXCLAMATION 0x00000030L
#define MB_ICONASTERISK 0x00000040L
(三)組合按鈕類型與圖標類型宏常量
在使用 MessageBox 函數的時候,對于第四個參數,你可以組合使用按鈕常量與圖標常量,用位或運算符【|】來將它們組合起來。注意,只可以是按鈕常量中的某一個與圖標常量中的某一個組合起來。
比如,可以是【MB_OKCANCEL | MB_ICONHAND】,也可以是【MB_OKCANCEL | MB_ICONWARNING】。
但是,不可以是【MB_OKCANCEL | MB_ICONHAND | MB_ICONWARNING】,不可以是【MB_OKCANCEL | MB_OK】,也不可以是【MB_ICONHAND | MB_ICONWARNING】。
也就是說,可以將按鈕常量中的一個,與圖標常量中的一個,用位或運算符【|】來組合在一起。但是呢,不可以用位或運算符【|】組合兩個按鈕常量,也不可以用位或運算符【|】組合兩個圖標常量。
(四)MessageBox 的返回值
返回值,與我們所點擊的按鈕有關。
假定,你的 MessageBox 函數里面,按鈕類型為 MB_OK,且你點擊了【確定】按鈕,則返回的,會是 IDOK,IDOK 的值為 1 。
假定,你的 MessageBox 函數里面,按鈕類型為 MB_OKCANCEL,且你點擊了【取消】按鈕,則返回的,會是 IDCANCEL 。
假定,你的 MessageBox 函數里面,按鈕類型為?MB_YESNOCANCEL 。那么,如果你點擊的按鈕為【是】,則返回值為 ISYES 。如果你點擊的按鈕為【否】,則返回值為 ISNO 。如果你點擊的按鈕為【取消】,則返回值為?IDCANCEL 。
假定,你的 MessageBox 函數里面,按鈕類型為?MB_ABOUTRETRYIGNORE 。那么,如果你點擊的按鈕為【關于】,則返回值為 IDABOUT?。如果你點擊的按鈕為【重試】,則返回值為 IDRETRY?。如果你點擊的按鈕為【忽略】,則返回值為?IDIGNORE?。
三.? ? 案例
(一)修改信息文本與對話框標題文本
首先呢,我們修改一下第一分節的案例代碼里面,MessageBox 函數的第二個參數和第三個參數。
第二個參數,它所控制的,是對話框所顯示的信息文本。第三個參數,它所控制的,是對話框標題的文本。
假定,我們想要令信息文本為【天門中斷楚江開】,令對話框標題為【蘇軾】。那么,我們將第一分節中的 MessageBox 函數調用改為下面的樣子。
MessageBox(NULL, _T("天門中斷楚江開"), _T("蘇軾"), 0);
另外,由于使用了 _T 宏代碼,所以呢,我們還需要在程序開頭部分包含 Tchar.h 頭文件。
這樣一來,整個 WinMain.cpp 中的代碼,就成了下面的樣子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("天門中斷楚江開"),_T("蘇軾"), 0);return 0;
}
然后呢,我們重新生成代碼,然后去運行代碼。結果呢,就是下面的樣子。

(二)修改按鈕類型
我們嘗試著來修改一下按鈕類型,也就是修改第四個參數。假定,我們想要顯示的按鈕為【是】,【否】和取消。所以呢,我們需要將按鈕類型設定為?MB_YESNOCANCEL 。
我們將 MessageBox 函數修改為如下的樣子。
MessageBox(NULL, _T("今天去吃火鍋嗎?"), _T("吃貨"), MB_YESNOCANCEL);
另外,由于使用了 _T 宏代碼,所以呢,我們還需要在程序開頭部分包含 Tchar.h 頭文件。
這樣一來,整個 WinMain.cpp 中的代碼,就成了下面的樣子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("今天去吃火鍋嗎?"),_T("吃貨"), MB_YESNOCANCEL);return 0;
}
運行結果如下。

(三)修改圖標類型
在這里,我們來嘗試去修改圖標類型。第一分節的代碼中,沒有包含圖標類型。
我們可以嘗試著修改第四個參數,將其替換為?MB_ICONINFORMATION 。
整個的代碼如下面所示。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 編程很有趣"),_T("學習"), MB_ICONINFORMATION);return 0;
}
運行結果如下。

我們將代碼修改為如下的樣子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 編程很有趣"),_T("學習"), MB_ICONHAND);return 0;
}
重新編譯,運行,結果如下。

我們將代碼修改為如下的樣子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 編程很有趣"),_T("學習"), MB_ICONQUESTION);return 0;
}
重新編譯,運行,結果如下。

我們將代碼修改為如下的樣子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 編程很有趣"),_T("學習"), MB_ICONEXCLAMATION);return 0;
}
重新編譯,運行,結果如下。

到了這里,四種圖標類型,我們就算是都看了一遍。
(四)按鈕類型與圖標類型的組合
我們將代碼修改為如下的樣子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("紀曉嵐是漢朝的嗎?"),_T("歷史"), MB_YESNO | MB_ICONQUESTION);return 0;
}
重新編譯,運行,結果如下。

我想,到了這里,本節內容,也就算是差不多講完了。
MessageBox 函數,它算是 Windows 程序設計的一個基礎的知識了。希望能夠學好它。
結束語
到了這里,其實,第一章的內容,也就算是差不多講完了。
有空的話,我還想要補充講解一下命令行的知識,讓大家對于命令行,多少有一個簡單的入門,至少能夠了解關于路徑的知識。
我想,關于命令行的一點知識,我就放在第二章來講解著了。
下一節,我們來講第二章。
專欄導航
上一篇:第1章,[標簽 Win32] :第一個 WIn32 程序,程序入口
回到目錄
下一篇:無