1、 在Windows程序设计中遇到错误:
(1)IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
(2)IntelliSense: 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体
#include
#include
// 过程函数的定义
LRESULT CALLBACK WinSunProc(
HWND hwnd, //窗口句柄
UINT uMsg, //消息常量标识符
WPARAM wParam, //特定附加消息
LPARAM lParam //特定附加消息
)
{
switch (uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf_s(szChar, "char code is %d", wParam);
MessageBox(hwnd, szChar, "char", 0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "mouse clicked", "message", 0);
HDC hdc;
hdc = GetDC(hwnd); //不能在响应WM_PAINT消息时调用
TextOut(hdc, 0, 50, "你好", strlen("你好"));
//ReleaseDC(hwnd);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps); //只能在WM_PAINT消息时调用
TextOut(hDC, 0, 0, "www.baidu.com", strlen("www.baid.com"));
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, "是否结束?", "message", MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
// 主函数入口
int WINAPI WinMain(
HINSTANCE hInstance, //当前实例句柄
HINSTANCE hPrevInstance, //当前实例前一个实例句柄
LPSTR lpCmdLine, //命令行
int nCmdShow //显示方式
)
{
// 设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0; //附加内存空间
wndcls.cbWndExtra = 0; //附加内存空间
wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //背景色
wndcls.hCursor = LoadCursor(NULL, IDC_CROSS); //光标
wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); //图标
wndcls.hInstance = hInstance; //当前实例句柄
wndcls.lpfnWndProc = WinSunProc; //消息处理函数
wndcls.lpszClassName = "baidu"; //**窗口类名称**//
wndcls.lpszMenuName = NULL; //菜单名
wndcls.style = CS_HREDRAW | CS_VREDRAW; //窗口长/宽改变时重绘
RegisterClass(&wndcls); //注册窗口类
// 创建窗口,定义一个变量来保存创建窗口后返回的句柄
HWND hwnd;
hwnd = CreateWindow("baidu", "标题", //**窗口标题**//
WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);
// 显示及刷新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
// 定义消息结构体,开始消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //将消息回传给系统
}
return msg.wParam; //返回特定附加标识
}
其中bug
(1)
wndcls.lpszClassName = "baidu";
错误提示:IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
(2)
hwnd = CreateWindow("baidu", "标题", //**窗口标题**//
WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);
错误提示:IntelliSense: 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体
2、原因分析:
这是由于字符编码问题引起的。
VC6 默认使用的 MBCS(多字节字符集) 编码,而 VS2013 及高版本 VS默认使用的 Unicode编码。
3、三种编码格式
所有的string类都是以C-style字符串为基础的。C-style字符串是字符数组。字符类型有三种编码格式:
(1)第一种是单字节字符集(singlebyte character set or SBCS)。
在这种编码格式下,所有字符都只用一个字节表示,ASCII码就是单字节字符。用"0"来表示一个字节的结束。
(2)第二种编码格式是多字节字符集(multi-bytecharacter set or MBCS)。
即:支持多字节的字符集。
多字节字符集 (MBCS) 是一种旧的方式以支持无法用单字节表示的字符集(如日文和中文)的方法。 如果执行新开发,对于所有的文本字符串应该使用Unicode,除非最终用户没有看到系统字符串。 MBCS 是传统技术,不建议用于新开发中。
最常见的 MBCS 实现是双字节字符集(DBCS)。在Windows里的MBCS包含两种字符类型:单字节字符(singlebyte characters )和双字节字符(doublebyte characters)。
由于Windows 里使用的多字节字符绝大部分是两个字节长,MBCS常被DBCS(double-byte character set)代替。
一般来说,VisualC++(尤其是 MFC)完全支持 DBCS。
(3)第三种编码格式是Unicode。
最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符。显然,这样要表示各种语言中所有的字符是远远不够的。Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符。
Unicode只是一个编码规范,目前实际实现的unicode编码只有三种:UTF-8,UCS-2和UTF-16,三种unicode字符集之间可以按照规范进行转换。
4、解决:
在工程中右击属性——>配置属性——>常规——>字符集——>使用多字节字符集