第1章,[標簽 Win32] :第一個 WIn32 程序,MessageBox 函數

專欄導航

上一篇:第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;
}

然后呢,我們重新生成代碼,然后去運行代碼。結果呢,就是下面的樣子。

圖1

(二)修改按鈕類型

我們嘗試著來修改一下按鈕類型,也就是修改第四個參數。假定,我們想要顯示的按鈕為【是】,【否】和取消。所以呢,我們需要將按鈕類型設定為?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;
}

運行結果如下。

圖2

(三)修改圖標類型

在這里,我們來嘗試去修改圖標類型。第一分節的代碼中,沒有包含圖標類型。

我們可以嘗試著修改第四個參數,將其替換為?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;
}

運行結果如下。

圖3

我們將代碼修改為如下的樣子。

#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;
}

重新編譯,運行,結果如下。

圖4

我們將代碼修改為如下的樣子。

#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;
}

重新編譯,運行,結果如下。

圖5

我們將代碼修改為如下的樣子。

#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;
}

重新編譯,運行,結果如下。

圖6

到了這里,四種圖標類型,我們就算是都看了一遍。

(四)按鈕類型與圖標類型的組合

我們將代碼修改為如下的樣子。

#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;
}

重新編譯,運行,結果如下。

圖7

我想,到了這里,本節內容,也就算是差不多講完了。

MessageBox 函數,它算是 Windows 程序設計的一個基礎的知識了。希望能夠學好它。

結束語

到了這里,其實,第一章的內容,也就算是差不多講完了。

有空的話,我還想要補充講解一下命令行的知識,讓大家對于命令行,多少有一個簡單的入門,至少能夠了解關于路徑的知識。

我想,關于命令行的一點知識,我就放在第二章來講解著了。

下一節,我們來講第二章。

專欄導航

上一篇:第1章,[標簽 Win32] :第一個 WIn32 程序,程序入口

回到目錄

下一篇:無

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84427.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

求助帖:學Java開發方向還是網絡安全方向前景好

最近網絡安全被一個培訓機構吹得天花亂墜&#xff0c;雖然他家既有網安又有java和UI&#xff0c;我也是學軟件工程的&#xff08;山西某211&#xff0c;此機構是每年和我們學校合作的校企公司&#xff09;&#xff0c;但那里的老師仍然大力推薦我學網絡安全&#xff08;滲透、代…

OpenCV 圖像仿射變換之旋轉

一、知識點 1、void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags INTER_LINEAR, int borderMode BORDER_CONSTANT, …

HCIP-數據通信基礎

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xff1a;…

C語言基本數據類型與變量詳解

# C語言基本數據類型與變量詳解 ## 數據類型概述 在C語言中&#xff0c;數據類型決定了變量在內存中的存儲方式和大小&#xff0c;以及可以對其執行的操作。合理選擇數據類型能夠提高程序的效率和準確性&#xff0c;避免內存浪費和數據溢出等問題。 C語言的基本數據類型主要包括…

Babylon.js學習之路《十、高級幾何體:自定義模型與復雜形狀生成》

文章目錄 1. 引言&#xff1a;高級幾何體的應用場景2. 參數化建模&#xff1a;Babylon.MeshBuilder2.1 擴展幾何體類型2.2 自定義多邊形&#xff08;ExtrudePolygon&#xff09; 3. 頂點級建模&#xff1a;自定義VertexData3.1 手動定義頂點數據3.2 動態生成地形&#xff08;高…

【趙渝強老師】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下認證、鑒權和準入控制三個階段組成。這三個階段的關系如下圖所示。 視頻講解如下 【趙渝強老師】Kubernetes的安全框架 認證&#xff08;Authentication&#xff09; 當客戶端與Kubernetes集群建立HTTP通信時&#xff0c;首先HTTP請求會進…

CDN與靜態資源優化

CDN與靜態資源優化 在現代Web系統和AI應用中&#xff0c;隨著用戶訪問量的不斷攀升&#xff0c;靜態資源&#xff08;如HTML、CSS、JavaScript、圖片、音視頻、模型文件等&#xff09;帶來的負載日益沉重。尤其在大模型推理、前端渲染、廣告投放等場景中&#xff0c;靜態資源的…

如何填寫“appium inspector”內容?

1. 確認已經開啟appium的服務&#xff0c;運行appium 參考內容&#xff1a;{"appium:platformName": "Android", # 系統名稱"appium:platformVersion": "9", # 安卓版本&#xff0c;看設備"appium:deviceName": "3d…

mysql server層做了什么

服務器處理客戶端請求 服務器程序在處理來自客戶端的查詢請求時&#xff0c;大致需要分為3部分&#xff1a;連接管理、解析與優化、存儲引擎。 連接管理 每當有一個客戶端進程連接到服務器進程時&#xff0c;服務器進程都會創建一個線程專門處理與這個客戶端的交互&#xff…

APISIX 簡介:云原生 API 網關的架構與實踐

文章目錄 引言&#xff1a;APISIX 概述基于Nginx構建的原因基于etcd構建的原因 架構圖示架構分層解析管理層&#xff1a;人機交互與配置入口控制層&#xff1a;配置管理與集群協調數據面&#xff1a;請求處理與流量轉發說明&#xff1a;關于OpenRestry 引言&#xff1a;APISIX …

【AI作畫】第3章 LORA加載器

目錄 LORA加載器 管道信息 ?編輯 ?編輯 ?編輯 lora模型的串接 作品集 LORA加載器 前面我們已經分析過節點目錄了&#xff0c;現在我們來看一下LORA加載器。我們進行圖片渲染&#xff0c;一般都需要LORA模型的。 首先&#xff0c;我們“鼠標右鍵——添加節點——…

Xilinx XC7A12T?1CPG238I Artix?7 FPGA

XC7A12T?1CPG238I 以其獨特的性能與封裝組合&#xff0c;成為諸多工程師的首選方案。下面&#xff0c;我們從多個維度對這款芯片做深入剖析。 一、產品定位與封裝特點 XC7A12T?1CPG238I 屬于賽靈思&#xff08;Xilinx&#xff09;28?nm Artix?7 系列中的入門級型號&#x…

如何利用 Java 爬蟲獲得微店商品詳情:實戰指南

在電商領域&#xff0c;微店作為眾多商家的線上銷售渠道之一&#xff0c;其商品詳情數據對于市場分析、競品研究和商業決策具有重要價值。Java 爬蟲技術可以幫助我們高效地獲取這些數據。本文將詳細介紹如何使用 Java 編寫爬蟲&#xff0c;獲取微店商品詳情。 一、準備工作 &…

【Bug】MAUI自定義彈窗在IOS有異常背景

文章目錄 問題問題代碼原因解決處理Bug的具體步驟 問題 自定義彈窗有異常背景 問題代碼 <mct:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/xaml"xmlns:converters"clr-names…

C語言酒店管理系統:完整源碼與深度解析

酒店管理系統通過自動化流程提升酒店運營效率。本系統采用C語言開發&#xff0c;基于模塊化設計思想&#xff0c;包含以下核心功能&#xff1a; ?房間管理?&#xff1a;初始化房間信息、查看房間狀態?預訂管理?&#xff1a;按時間段預訂房間、查詢預訂記錄?入住管理?&am…

基于Gold-YOLO的聚合-分發機制改進YOLOv8教程

1. 引言 本文將詳細介紹如何將Gold-YOLO的核心創新——聚合-分發(Gather-and-Distribute, GD)機制集成到YOLOv8架構中。Gold-YOLO是一種創新的目標檢測架構,通過獨特的信息融合策略實現了低延遲和高準確性的理想平衡。 1.1 Gold-YOLO核心特性 Gold-YOLO的主要創新點包括…

blob 的使用 文件下載 圖片預覽 大文件分片上傳

1. 文件下載 function downloadFile(content, filename, type) {const blob new Blob([content], { type });const url URL.createObjectURL(blob);const a document.createElement(a);a.href url;a.download filename;a.click();URL.revokeObjectURL(url); }// 使用示例…

FlinkCDC-Hudi數據實時入湖原理篇

1.Hudi應用場景 面對海量數據開發場景&#xff0c;一種支持存儲多種原始數據格式、多種計算引擎、高效的元數據統一管理的存儲方式能極大的提高開發效率。所以在選擇技術選型的時候&#xff0c;這種存儲方式有以下幾個特點&#xff1a; 存儲原始數據&#xff0c;這些原始數據來…

sqldeveloper 創建新用戶并訪問其他空間特定表和視圖

創建用戶 右鍵選擇創建用戶 1.給用戶取一個名字 VIEW_TEST 2.設置密碼 123456&#xff08;建議用其他&#xff09; 3.選擇表空間和臨時空間 選擇角色 CONNECT 連接角色 選擇系統權限 然后點擊應用就可以了 然后在用戶哪里就能看到這個用戶了 登錄用戶 出現成功就說明可以…

家用電器3d掃描逆向建模中科米堆手持式藍光三維掃描儀數字建模

從廚房里的冰箱、微波爐&#xff0c;到客廳中的電視、空調&#xff0c;再到臥室的加濕器、空氣凈化器等&#xff0c;家用電器極大地提升了我們的生活品質。 家電市場的競爭日益激烈&#xff0c;產品更新換代速度加快&#xff0c;如何快速、精準地獲取現有家電產品的三維數據&a…