Win32编辑控件 - GetText不返回final \ n

时间:2010-10-15 20:31:26

标签: winapi unicode controls edit

我有一个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中表现不佳?

4 个答案:

答案 0 :(得分:0)

尝试为您的编辑控件设置ES_MULTILINEES_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),以便将其保存到文件中。

http://msdn.microsoft.com/en-us/library/aa450989.aspx

答案 2 :(得分:0)

WM_GETTEXT的文档说明提供的缓冲区必须足够大才能包含空终止符。 WM_GETTEXTLENGTH的文档说返回值不包括空终止符。因此,在分配接收文本的缓冲区时,您必须为额外字符添加空间。

答案 3 :(得分:0)

您必须为字符串终止符\0字符添加一个字符。