关于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);
至此,所有问题解决