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

时间:2014-11-11 15:37:01

标签: winapi unicode ansi

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

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

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

1 个答案:

答案 0 :(得分:6)

这意味着发送到窗口过程的窗口消息将是ANSI或Unicode版本。例如,Unicode窗口将在WM_CREATE中收到CREATESTRUCTW,而ANSI窗口将收到CREATESTRUCTA

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

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

窗口将是Unicode或ANSI,具体取决于其类是使用RegisterClassExA还是RegisterClassExW注册的。您可以通过调用IsWindowUnicode来测试窗口是否为Unicode。


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

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

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

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

  1. 首先,他们会向您的窗口发送WM_NOTIFYFORMAT消息,询问您是希望以ANSI或Unicode格式接收消息(尽管您的窗口是Unicode或ANSI)。
  2. 如果您不处理WM_NOTIFYFORMAT,则控件将调用IsWindowUnicode来确定。
  3. 然后控件将相应地发送消息。
  4. 所以基本上,你永远不需要知道一个公共控件是否是Unicode,因为1)它总是,2)这个问题只与处理消息有关,这是Windows内部的,而不是你的责任。

    您的责任是处理公共控件您自己的窗口的通知。在这种情况下,您自己窗口的Unicode / ANSI-ness非常重要。