我可以在处理控件时组合 A(nsi) 和 W(ide char) Win32 API 调用吗?

问题描述 投票:0回答:1

是否有指南或文档指定如果我有时需要调用 Ansi 版本的 SetWindowTextA() 和后来的 SetWindowTextW() 可以做什么。如果我想用SetWindowTextW()设置文本内容,是否需要用CreateWindowW()创建一个编辑框?

我问这个问题是因为某些事情似乎有效,而另一些则无效。

例如,使用 SetWindowTextW() 设置文本会丢失某些重音字符。我刚刚发现,例如字母“è”会转换为“e”,即使我使用 SetWindowTextW() 设置它。

我看过这篇文章:SetWindowTextW in an ANSI project

我已经尝试了那里的所有答案,但所有答案都将我的控件留空,它们无法设置文本。这段代码什么也没做:

savedWndProc = (WNDPROC)GetWindowLong (ctlHwnd, GWL_WNDPROC);
  
SetWindowLongPtrW (ctlHwnd, GWLP_WNDPROC, (LONG_PTR)DefWindowProcW);  // or SetWindowLong (ctlHwnd, GWL_WNDPROC, (long)DefWindowProcW);
result = SetWindowTextW (ctlHwnd, buffPtr);
SetWindowLong (ctlHwnd, GWL_WNDPROC, (long)savedWndProc);

字段留空。这可能是一个原因:

if (GetWindowLong(ctlHwnd, GWL_WNDPROC) == DefWindowProc)...

...永远不会评估为 true。

那么,编辑控件有没有可能有自己的默认窗口过程,与DefWindowProc不同,有些DefEditWindowProc?

编辑 - 最后我用 CreateWindowW() 创建了一个不可见的编辑,只是为了抓取它的窗口过程,当我调用它时:

CallWindowProcW (origEditProcW, ctlHwnd, WM_SETTEXT, 0L, (long)buffPtr);

...我有我的 è 角色。太棒了!

c winapi wchar
1个回答
1
投票

您可以组合 API 调用,但这只会导致操作系统进行字符串转换。进行 Unicode API 调用不会启用 ANSI 窗口来存储 Unicode 内容。

窗口的字符集由使用

RegisterClass
函数确定。如果窗口类是用 ANSI 版本的
RegisterClass
(
RegisterClassA
) 注册的,则窗口的字符集是 ANSI。如果窗口类是使用 Unicode 版本的
RegisterClass
(
RegisterClassW
) 注册的,则窗口的字符集是 Unicode。

系统对窗口消息进行自动双向转换(Unicode 到 ANSI)。例如,如果将 ANSI 窗口消息发送到使用 Unicode 字符集的窗口,系统会在调用窗口过程之前将该消息转换为 Unicode 消息。系统调用

IsWindowUnicode
来决定是否翻译消息。

来自

IsWindowUnicode

的文档

请注意,类

"EDIT"
应该由系统注册为 Unicode 类...所有编辑控件都应支持 Unicode,无论是由
CreateWindowA
还是
CreateWindowW
创建。

© www.soinside.com 2019 - 2024. All rights reserved.