qq_53896844 2022-11-29 23:53 采纳率: 100%
浏览 17
已结题

MessageBox中文显示原理?

一. 问题

想问一下MessageBox的原理,主要是关于字符方面的原理。
当我使用MessageBox的时候,其内容和标题参数使用wchar_t类型,可以正常显示中文;
当我使用wprintf时,输出的就是几个问号,必须使用setlocale将代码页设置为终端代码页才行。

注:

  1. 我知道wprintf是因为文件的字符集和终端的字符集不同导致的,所以我想问的是MessageBox为什么能够正常显示中文,或者说更普遍的推广到所有Windows API函数为什么可以正常显示中文。
  2. 下面两个程序文件的字符集都是Unicode

二. 代码和输出

1. wprintf

>> 未本地化

  • 代码
#include <stdio.h>
#include <wchar.h>
int main(void)
{
    wchar_t msg[] = L"你好,世界!";
    wprintf(L"%s\n", msg);

    return 0;
}
  • 输出

img

>> 本地化后

  • 代码
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
    wchar_t msg[] = L"你好,世界!";
    setlocale(LC_CTYPE, ".936");
    wprintf(L"%s\n", msg);

    return 0;
}
  • 输出

img

2. MessageBox

  • 代码
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    wchar_t title[] = L"标题";
    wchar_t msg[] = L"你好,Windows 11!";
    MessageBox(NULL, msg, title, MB_OKCANCEL | MB_ICONASTERISK | MB_DEFBUTTON1 | MB_APPLMODAL | MB_TOPMOST);

    return 0;
}
  • 输出

img

三. 总结

可以看到,MessageBox没有本地化操作,但是仍然能够正常显示中文,但是wprintf却是需要本地化之后才能正常显示。
总之,问题还是上面那个,恳请各位能够指点一下!

  • 写回答

1条回答 默认 最新

  • qq_53896844 2022-11-30 00:23
    关注

    还有一点就是当我不使用宽字符,而使用char和printf的时候,不用本地化也能正常显示中文,这又是为什么呢?

    评论

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 修改了问题 12月1日
  • 修改了问题 11月29日
  • 创建了问题 11月29日

悬赏问题

  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝