vs2008之MessageBox函数的用法

来源:互联网 发布:java web项目开发书籍 编辑:程序博客网 时间:2024/05/02 04:37
 

MessageBox这个函数可以在VC里面显示一个标准对话框,是比较常用的一个信息对话框,其不仅能够定义显示的信息内容、信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框。

函数原型及参数
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT, uType);
参数含义:
HWND hWnd —— 父窗口的句柄。(在使用的时候发现在CView类里面不要填这一项,但是如果是再其他的类中,就要填写)
LPCTSTR lpText —— 对话框的内容
LPCTSTR lpCaption —— 对话框的标题
UINT uType ——对话框类型常量(窗口的风格)

该函数的返回值为整数,用于对话框按钮的识别。

 

对于Messagebox("hello");,它在vc6.0中运行是没有问题的,但在vs2005里编译却遇到了以下的错误:

d:\my documents\visual studio 2005\projects\mfccc\mfc\dlg.cpp(48) : error C2664: 'CWnd::MessageBoxW' : cannot convert parameter 1 from 'const char [6]' to 'LPCTSTR'
原因是这样的:在VS2005中默认的类型是Unicode,而"hello"是ASCII,而非Unicode,因此会出错。

解决方式:Messagebox(_T("hello"));或者Messagebox(TEXT("hello"));或MessageBox(L"hello");

注:_T("hello")在宽字符集的工程里等于L"hello";_T("hello")在ASCII的工程里等于"hello"。

 

 

在宽字符集的工程里,表达的意思一样,在ascii的工程里,不同。
_T("hello, world")在宽字符集的工程里等于L"hello, world"
_T("hello, world")在ascii的工程里等于"hello, world"
是通过条件编译实现的。
#ifdef unicode
#define _T(x) Lx


 

因为你的程序在UNICODE(宽字节)字符集下运行,如果调用了MessageBox ,实际上调用的是 MessageBoxW 函数; 如果你的程序在 ANSI 字符集运行,调用MessageBox ,就相当于调用 MessageBoxA; 其中 MessageBoxW 支持 UNICODE; MessageBoxA 支持ANSI; 

UNICODE与ANSI 有什么区别呢?简单的说,UNICODE版的字符比ANSI 的内存占用大,比如: 
Win32程式中出现的标准定义 char 占一个字节,而 char 的UNICODE版被定义成这样:typedef unsigned short wchar_t ;占2个字节。 

所以有字符做参数的函数相应也用两个版本了。 

宽字节版函数中带有字符参数的都应该用宽字节版的字符参数,将字符串转换成宽字节很容易: 
比如将 "Application Error" 转换成UNICODE版,只需在它前面使用一个定义了的宏,如下: 
L"Application Error" ,或者TEXT("Application Error" )都可以 

所以你应将 MessageBox(NULL,Temp,"Application Error",MB_ICONSTOP);

改为:        MessageBox(NULL,Temp,L"Application Error",MB_ICONSTOP);