控件是Unicode还是ANSI是什么意思?

2 unicode winapi ansi

Windows控件可以是Unicode或ANSI,我的问题是控件是否属于这两个类别之一?

它是以下(如果我假设控件是Unicode):

  • 控件的缓冲区是Unicode.
  • WM_CHAR消息以Unicode形式发送(例如,'A'发送为0x0041而不是0x41).

ten*_*our 7

这意味着发送到窗口过程的窗口消息将是ANSI或Unicode版本.例如一个Unicode窗口将收到CREATESTRUCTWWM_CREATE,而ANSI窗口将收到一个CREATESTRUCTA.

这几乎适用于包含字符串数据的每个窗口消息.

Windows将在内部对数据进行相应的编组.例如,如果将ANSI调用SendMessageA(WM_SETTEXT, ...)到Unicode窗口,则窗口将WM_SETTEXT使用Unicode字符串进行接收.

窗口将是Unicode或ANSI,具体取决于其类是否已注册RegisterClassExARegisterClassExW.您可以通过调用来测试窗口是否为Unicode IsWindowUnicode.


有关常见控件的一些信息,因为这似乎就是你所说的.

首先,ANSI窗口是Unicode窗口的父窗口没有问题.还要记住,"控件"只是窗口.

常用控件始终是 Unicode.他们收到的消息将采用本机Unicode格式.当然你不会看到它,因为它都是操作系统内部的(例外:如果你是一个公共控件的子类).

您通常处理的消息将以WM_COMMAND或的形式发送到您的窗口WM_NOTIFY.这些消息从公共控件发送到其父窗口(您的窗口).他们会尊重您的窗口是Unicode或ANSI,如下所示:

  1. 首先,他们会向您的窗口发送一条WM_NOTIFYFORMAT消息,询问您是否希望以ANSI或Unicode格式接收消息(尽管您的窗口是Unicode或ANSI).
  2. 如果您不处理WM_NOTIFYFORMAT,则控件将调用IsWindowUnicode以确定.
  3. 然后控件将相应地发送消息.

所以基本上,你永远不需要知道一个公共控件是否是Unicode,因为1)它始终是,2)这个问题仅作为处理消息的问题,这是Windows内部的,而不是你的责任.

您的责任是处理来自常用控件的通知您自己的窗口.在这种情况下,您自己的窗口的Unicode/ANSI-ness是最重要的.