MFC中的SetWindowTextA与SetWindowTextW

在看吕鑫老师的MFC的视频中,在VS2012上做的一个小示例,即在对话框标题处显示鼠标滑过的x,y坐标的数值。原本是鼠标按下的函数,如下:
case WM_LBUTTONDOWN:
           {
               int x = LOWORD(lParam);
               int y = HIWORD(lParam);
               char s[200];
               sprintf_s(s,"x=%d,y=%d",x,y);
               MessageBoxA(hwndDlg,s,"提示X,Y位置",0);
           }

这样运行的结果是检测鼠标按下的时候新弹出一个窗口显示x,y数值。

第二段小程序
case WM_MOUSEMOVE:
{
int x = LOWORD(lParam);
int y = HIWORD(lParam);
char s[200];
sprintf_s(s,”x=%d,y=%d”,x,y);
SetWindowText(hwndDlg,s);
}
鼠标滑过客户区的时候,在对话框的标题处实时显示x,y的数值。
这个时候在VS2012的unicode情况下编译提示:
error C2664: “SetWindowTextW”: 不能将参数 2 从“char [200]”转换为“LPCWSTR”。 鼠标放到SetWindowText内的s时提示“char*”类型的实参与“LPCWSTR”类型的形参不兼容。

然而并没什么暖用。
尝试过写成SetWindowText(hwndDlg,_T(“s”));
这样的结果就是在对话框标题处始终显示s
尝试SetWindowTextW(hwndDlg,s);也不行
经过多种尝试,
改成SetWindowTextA(hwndDlg,s);才成功实时显示。
转到两个的定义中去看了看:

WINAPI
SetWindowTextA(
In HWND hWnd,
In_opt LPCSTR lpString);
WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
In HWND hWnd,
In_opt LPCWSTR lpString);

那LPCSTR和LPCWSTR有什么区别呢?
LPCSTR: 32-bit指针 指向一个常字符串,每个字符占1字节。 相当于 const char *
LPCWSTR:32-bit指针, 指向一个unicode字符串常量的指针,每个字符占2字节。

也有网上说:
SetWindowTextW表示设置的字符串是WCHAR (双字节字符 )
SetWindowTextA表示设置的字符串是CHAR (单字节字符 )
SetWindowText表示设置的字符串是自动匹配当前项目的字符环境是单字节还是双字节字符

SetWindowTextA和SetWindowTextW功能是一样的,只是传参数的时候一个是ANSI字符串,一个是UNICODE字符串。
SetWindowTextA(hwnd, “Hello”);
SetWindowTextW(hwnd, L”Hello”);
这两个效果完全一样。
而在这个显示鼠标指针轨迹坐标的地方,
SetWindowTextA(hwndDlg,s);
SetWindowTextA(hwndDlg,”x=%d,y=%d”);
这两个达到的效果是不一样的。可以试试。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值