MessageBox的几点用法

关于MessageBox可以说是最简单的API函数

以下测试数据于VS2008进行

 

第一个:MessageBox(hwnd, "hello world", "", MB_OK);

这是在一般的视频教程的示例程序,但是我们编译时,编译器会报错:

“MessageBoxW”: 不能将参数 2 从“const char [6]”转换为“LPCWSTR”

 

 错误原因找到:原来是MessageBox的第二三参数为:LPCWSTR,那么什么是LPCWSTR呢,LPCWSTR就是WCHAR *,也就是说宽字符。。。。所以不能通过简单的字符串就行了,,但是在VC6.0貌似得行,但是为了安全起见,我们还是不要用这一种方法。

 

那么怎么办呢?

 

于是,我想到了强制转换MessageBox(hwnd,(LPCWSTR)"hello world",(LPCWSTR)"",MB_OK);运行,成功!!但是,我们发现里面是乱码,所以我们不能通过简单的转换就能实现。

 

MS提供了一种方法就是TEXT宏:MessageBox(hwnd,TEXT("hello world"), TEXT(""), MB_OK);现在终于成功了,我们通过编译器的转到定义发现:#define EXT(quote) L##quote      // r_winnt

所以也可以写成MessageBox(hwnd, L"hello world", L"", MB_OK);当然,这是一种简便方法。

 

第二个:

有了上面的经验,于是我们继续:

char str[80];

sprintf(str, "hello %s", "world");

MessageBox(NULL, TEXT(str), TEXT(""), MB_OK);

但是我们运行,会发现Lstr未定义,这个很容易理解,因为TEXT是简单的宏替换,所以会出现该问题。。。。

那么,遇到这样的问题我们怎样解决呢?

因为MessageBox的参数是宽字符指针,那么我们就定义成WCHAR型吧!!!这样连TEXT都不用要了!!!!

WCHAR str[80];

sprintf(str, "hello %s", "world");

MessageBox(NULL, str, TEXT(""), MB_OK);

我们再次运行,但是仍然有错

那是因为sprintf的第一参数是char *型的,所以。。。。

 

有问题,那么也就一定有解决的方法,,,

wsprintf就是针对宽字符型的

WCHAR str[80];

wsprintf(str, TEXT("hello %s", L"world");

MessageBox(NULL, str, TEXT(""), 0);

 

至此,所有问题解决

你可能感兴趣的:(api,测试,ext,null,编译器)