是否有指南或文档指定如果我有时需要调用 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);
...我有我的 è 角色。太棒了!
您可以组合 API 调用,但这只会导致操作系统进行字符串转换。进行 Unicode API 调用不会启用 ANSI 窗口来存储 Unicode 内容。
窗口的字符集由使用
函数确定。如果窗口类是用 ANSI 版本的RegisterClass
(RegisterClass
) 注册的,则窗口的字符集是 ANSI。如果窗口类是使用 Unicode 版本的RegisterClassA
(RegisterClass
) 注册的,则窗口的字符集是 Unicode。RegisterClassW
系统对窗口消息进行自动双向转换(Unicode 到 ANSI)。例如,如果将 ANSI 窗口消息发送到使用 Unicode 字符集的窗口,系统会在调用窗口过程之前将该消息转换为 Unicode 消息。系统调用
来决定是否翻译消息。IsWindowUnicode
IsWindowUnicode
的文档
请注意,类
"EDIT"
应该由系统注册为 Unicode 类...所有编辑控件都应支持 Unicode,无论是由 CreateWindowA
还是 CreateWindowW
创建。