C++ MessageBox MessageBoxA MessageBoxW AfxMessageBox

本文详细介绍了C语言中MessageBox函数的使用方法,包括不同版本的函数原型、参数解释、宏定义及返回值说明,并通过实例展示了如何正确调用该函数。

 转自:http://blog.sina.com.cn/s/blog_5059be880100whu3.html

C语言的MessageBox
MessageBoxA(
    HWND hWnd ,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT uType);

MessageBoxW(
    HWND hWnd ,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType);

#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif

例:MessageBox(NULL,TEXT("世界你好!"),TEXT("问好"),MB_YESNO|MB_ICONEXCLAMATION);

其中按钮宏有:
#define MB_OK                       0x00000000L
#define MB_OKCANCEL                 0x00000001L
#define MB_ABORTRETRYIGNORE         0x00000002L
#define MB_YESNOCANCEL              0x00000003L
#define MB_YESNO                    0x00000004L
#define MB_RETRYCANCEL              0x00000005L

图标宏有:
#define MB_ICONHAND                 0x00000010L
#define MB_ICONQUESTION             0x00000020L
#define MB_ICONEXCLAMATION          0x00000030L
#define MB_ICONASTERISK             0x00000040L

MessageBox的返回值宏有:
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7

 

转自:http://hi.baidu.com/necrohan/item/8c60a2f7a1f1e64a922af253

关于MessageBox

编译错误:"MessageBoxA" : function does not take 3 parameters

程序里面写的是MessageBox(str),但为什么编译时提示出错时MessageBoxA呢?
MessageBox实际上有2个原形:MessageBoxA和MessageBoxW
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE
原因是:
一个参数的函数MessageBox(CString str)是MFC下调用的,如果你程序没有用到MFC,例如你只是一个Windows Console工程,因为没有窗口,所以MessageBox获取不到窗口句柄,那么这样用肯定错误。只有用4个参数的MessageBox,指定窗口句柄,可以用NULL,那么就是属于桌面的了。
AfxMessageBox()一般应用于窗体之中, 没有窗体,或者是全局函数,不能使用该函数;不是从CWnd类继承的类中使用最好使用AfxMessageBox。
MessageBox()可以应用于没有窗体和有窗体的两种情况
(1)在有窗体的情况下使用方法完全与AfxMessageBox一样,只要一个参数。但是AfxMessageBox的弹出的标题默认是当前工程的名字,不像MessageBox可以指定弹出框的标题。
(2)在没有窗体或者全局函数中,必须传入一个窗体句柄才能执行,如果没有,用NULL代替也可,但是此时该消息框属于桌面,可能达不到我们所需要的目的,所以一般要传入一个窗口句柄。
第二种情况下须给出函数的四个参数

int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
例:::MessageBox(NULL, "asdfasdf", NULL, MB_OK);

API形式的MessageBox是4个参数, MFC的MessaegBox是3个参数。
使用域操作符::MessageBox(),则使用API的4个参数形式。

 

mfc工程实际应用中:

AfxMessageBox("hehehe");//原来可以用AfxMessageBox啊啊啊!!!
 MessageBox(TEXT("世界你好!"),TEXT("问好"),MB_YESNO|MB_ICONEXCLAMATION);
 MessageBox(TEXT("世界你好!"),NULL,NULL);

在代码中使用 `#define MessageBox MessageBoxA` 是一个预处理指令,其含义、作用及相关情况如下: ### 含义 `#define` 是 C 和 C++ 中的预处理指令,用于创建宏定义。`#define MessageBox MessageBoxA` 这行代码定义了一个宏 `MessageBox`,当在代码中使用 `MessageBox` 时,预处理器会在编译前将其替换为 `MessageBoxA`。 ### 作用 `MessageBoxA` 和 `MessageBoxW` 是 Windows API 提供的用于显示消息框的函数。`MessageBoxA` 是 ANSI 版本,它使用单字节字符集(SBCS)或多字节字符集(MBCS)来处理字符串;`MessageBoxW` 是 Unicode 版本,使用宽字符集(UTF-16)来处理字符串 [^1][^4][^5]。 通过 `#ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif` 这样的条件编译指令,可以根据项目的字符集设置来选择使用哪个版本的 `MessageBox` 函数。当定义了 `UNICODE` 宏时,`MessageBox` 会被替换为 `MessageBoxW`;否则,会被替换为 `MessageBoxA`。因此,`#define MessageBox MessageBoxA` 明确指定了使用 `MessageBox` 时调用的是 ANSI 版本的 `MessageBoxA` 函数。 ### 相关说明 - **兼容性**:在旧的 Windows 应用程序中,由于可能需要支持使用单字节或多字节字符集的系统,使用 `MessageBoxA` 可以确保兼容性。但在现代应用程序中,推荐使用 Unicode 版本的 `MessageBoxW`,因为它可以处理全球范围内的各种语言字符。 - **字符串处理**:`MessageBoxA` 接受 `LPCSTR` 类型的字符串参数,即指向以 null 结尾的单字节或多字节字符数组的指针;而 `MessageBoxW` 接受 `LPCWSTR` 类型的字符串参数,即指向以 null 结尾的宽字符数组的指针。 - **代码示例**: ```cpp #include <windows.h> // 这里明确使用 MessageBoxA #define MessageBox MessageBoxA int main() { MessageBox(NULL, "Hello, World!", "Message", MB_OK); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值