{
MessageBox("你已经提交成功。");
// TODO: 在此添加控件通知处理程序代码
}
错误 1 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR” d:/我的文档/visual studio 2005/projects/test/test/testdlg.cpp 155
很多人不知道原因。现在给出这个错误的解决办法。
方法一:由于VS2010默认使用的是UNICODE字符集,在新建项目时,把使用UNICODE字符集取消,如下图:
方法二:在使用的函数前加“_T”如:
void CtestDlg::OnBnClickedButton1()
{
MessageBox(_T("你已经提交成功。"));
// TODO: 在此添加控件通知处理程序代码
}
方法三:
如需要更改已经建立的项目字符集,则选择“项目”-》“XXX项目属性”-》“配置属性”-》“常规”选项中,把“字符集”改为“使用多字节字符集”,然后确定。如下图:
OK了。
或者:
<1> Cstring str;
str.Format("a = %d",a);
<2> ::MessageBox(head,_T("content"),_T("tile"),MB_ok);
<3>AfxMessageBox(nstringID,MB_YESNO|MB_ICONSTOP);
<4>CWnd::MessageBox();
<5>MessageBox((LPTSTR)(LPTSTR)str);
MessageBox释疑
消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。
1.
MessageBox(_T("这是一个最简单的消息框!"));
2.
MessageBox(_T("这是一个有标题的消息框!"),_T("标题"));
3.
MessageBox(_T("这是一个确定 取消的消息框!"),_T("标题"), MB_OKCANCEL );
4.
MessageBox(_T("这是一个警告的消息框!"),_T("标题"), MB_ICONEXCLAMATION );
5.
MessageBox(_T("这是一个两种属性的消息框!"),_T("标题"), MB_ICONEXCLAMATION|MB_OKCANCEL );
6.
if(MessageBox(_T("一种常用的应用"),_T("标题"),MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)
return;
附其它常用属性
系统默认图标,可在消息框上显示
X错误 MB_ICONHAND, MB_ICONSTOP, and MB_ICONERROR
?询问 MB_ICONQUESTION
!警告 MB_ICONEXCLAMATION and MB_ICONWARNING
i信息 MB_ICONASTERISK and MB_ICONINFORMATION
按钮的形式
MB_OK 默认
MB_OKCANCEL 确定取消
MB_YESNO 是否
MB_YESNOCANCEL 是否取消
返回值
IDCANCEL 取消被选
IDNO 否被选
IDOK 确定被选
IDYES 是被选
补充:
以上消息框的用法是在CWnd的子类中的应用,如果不是,则要MessageBox(NULL,"ddd","ddd",MB_OK); 或MessageBox(hWnd,"ddd","ddd",MB_OK); hWnd为某窗口的句柄,或者直接用AfxMessageBox。
这里所列出的属性只是一些常用属性,在MSDN中还有更多的属性
_T释疑
定义
_T("")是一个宏,定义于tchar.h下。
#define __T(x) L ## x
#define _T(x) __T(x)
作用
他的作用是让你的程序支持Unicode编码,
因为Windows使用两种字符集ANSI和UNICODE,
前者就是通常使用的单字节方式,
但这种方式处理象中文这样的双字节字符不方便,
容易出现半个汉字的情况。
而后者是双字节方式,方便处理双字节字符。
Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。
如果你编译一个程序为ANSI方式,
_T实际不起任何作用。
而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。
LPSTR:32bit指针指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义
L是表示字符串资源为Unicode的。
比如
wchar_tStr[] = L"Hello World!";
这个就是双字节存储字符了。
_T是一个适配的宏~
当
#ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。
比如
LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上两句使得无论是在UNICODE编译条件下还是在ANSI编译条件下都是正确编译的。
而且MS推荐你使用相匹配的字符串函数。
比如处理LPTSTR或者LPCTSTR的时候,不要用strlen ,而是要用_tcslen
否则在UNICODE的编译条件下,strlen不能处理wchar_t*的字符串。
T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定