我有一个Win32编辑窗口(即CreateWindow,其类名为“EDIT”)。
每次我在控件上添加一行时,我都附加'\ r \ n'(即新行)。
但是,当我调用WM_GETTEXT获取EDIT窗口的文本时,它总是缺少最后一个'\ n'。
如果我在WM_GETTEXTLENGTH的结果中加1,则返回正确的字符数,因此WM_GETTEXT返回最后的'\ n'。
MSDN说这是关于WM_GETTEXTLENGTH:当WM_GETTEXTLENGTH消息是 发送,DefWindowProc函数 返回字符的长度 文本。在某些条件下, DefWindowProc函数返回一个 值大于实际值 文字的长度。发生这种情况 ANSI和Unicode的某些混合, 并且是由于系统允许的 可能存在双字节 字符集(DBCS)中的字符 文本。但是,返回值 总是至少和。一样大 文本的实际长度;您可以 因此总是用它来引导缓冲区 分配。可能会发生此行为 当应用程序同时使用ANSI时 功能和常用对话框 使用Unicode。
......但这并不能解释一下这个难题。
为什么会发生这种情况,并且我可以安全地将未解释的1添加到文本长度?
修改的
禁用unicode编译后,我可以使用ASCII构建,但是,我想使用UNICODE构建,也许EDIT窗口控件在UNICODE中表现不佳?
答案 0 :(得分:0)
尝试为您的编辑控件设置ES_MULTILINE
和ES_WANTRETURN
样式。
答案 1 :(得分:0)
\r
和\n
映射到字节构造,在编译ASCII时可以正常工作。
由于\r
,\n
无法保证代表回车,换行(例如都可以映射到换行符),因此最好在构建字符串时使用十六进制代码点。 (你可能会使用TCHAR函数。)
Compile for ASCII - sprintf(dest, "%s\x0D\x0A", str);
Compile for UNICODE - wsprintf(dest, "%s\0x000D\x000A", str);
当您调用WM_GETTEXT来检索文本时,您可能需要调用WideCharToMultiByte将其转换为某个代码页或字符集(如ASCII或UTF8),以便将其保存到文件中。
答案 2 :(得分:0)
WM_GETTEXT
的文档说明提供的缓冲区必须足够大才能包含空终止符。 WM_GETTEXTLENGTH
的文档说返回值不包括空终止符。因此,在分配接收文本的缓冲区时,您必须为额外字符添加空间。
答案 3 :(得分:0)
您必须为字符串终止符\0
字符添加一个字符。