当前位置:C++技术网 > 资讯 > 为什么用CreateWindow函数创建出来的窗口的标题只有一个字符?

为什么用CreateWindow函数创建出来的窗口的标题只有一个字符?

更新时间:2019-04-10 11:15:12浏览次数:1+次

为什么用CreateWindow函数创建出来的窗口的标题只有一个字符?

代码如下:

CreateWindowW(L"WindowsKanKan", L"123123", WS_OVERLAPPEDWINDOW, 1, 2, 1000, 1000, nullptr, nullptr, hInstance, nullptr);

窗口标题只有一个字符1,如图:

C++技术网会员解答:

    在Unicode字符集下,需要使用CreateWindowW版本创建窗口,传入的窗口标题是Unicode字符集,即宽字符。不能用CreateWindowA创建窗口。我们可以使用WCHAR数组或者LPCWSTR常量字符串来传递标题字符串。如:

LPCWSTR pName = L"123456";
WCHAR Name[100]={0};

    在多字节字符集下,要用CreateWindowA创建窗口,而不能用CreateWindowW。传入的标题字符串是多字节字符集的。如:

LPCSTR pName = "123456";
CHAR Name[100]={0};

    字符集的作用是:通知编译器使用指定的字符集,帮助解决本地化问题。不同的字符集环境需要使用不同的版本的函数来执行,否则会出现乱码或者被截断。

    为了自动区分字符集,我们可以使用通用的版本。创建窗口用CreateWindow,此函数会自动识别字符集,进而转换为CreateWindowA或CreateWindowW版本。那么函数对应的字符串参数也需要通用的版本。字符串可以使用宏TEXT("")或_T("")来将字符串包起来,从而摆脱字符集变化产生的字符串显示乱码或截断的问题。如:

LPCTSTR pName1 = TEXT("123456");
LPCTSTR pName2 = _T("123456");
TCHAR Name[100] = _T("123456");

    之所以产生乱码或截断,是因为不同的字符集的内部表示不一样,Unicode是两个字节表示一个字符,如果英文键盘上的字符使用Unicode字符集,那么第二个字节为空字符,如果用多字节字符集去解释,那么就只读取了两个字节,即一个字节字符和一个字节空字符,产生了截断现象。而如果用Unicode字符集去解释多字节字符集的字符,那么本来一个字符可能由一个字节组成或者两个字节组成,而Unicode统一用两个字节来解释,就会导致乱码。另外两种字符集编码本身就有差异,就可能更对不上号,所以也会出现乱码。

    总之,一个字符集环境用一个对应的字符编码。Unicode字符集用宽字符(Unicode编码,通常两个字节表示的字符即UTF-16编码,其他的还有UTF-8、UTF-32,UTF后的数字表示字符所占的比特位数,比特位数除以8即字节数),多字节字符集用窄字符(ASCII编码)。