【发布时间】:2017-12-29 12:16:26
【问题描述】:
我有一个简单的聊天程序。我对输入框使用“CreateWindow”功能:
chat_handle_11 = CreateWindow("EDIT", "", WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_EX_CONTROLPARENT, 226, 447, 424, 23, hWnd, NULL, NULL, NULL);
SendMessage(chat_handle_11, EM_LIMITTEXT, ChatTextLimitInBox, 0L);
当我粘贴任何包含换行符的文本时(使用鼠标右键单击或 ctrl+v),例如:
Test line 1 text
Test line 2 text
Test line 3 text
只有第一行被粘贴到输入窗口:
Test line 1 text
我想更改粘贴时的文本,以忽略换行符:
Test line 1 text Test line 2 text Test line 3 text
我尝试处理 WM_PASTE 消息,不幸的是它不起作用:
switch (message)
{
case WM_PASTE:
{
MessageBox(NULL, "pasting", "pasting", MB_YESNO | MB_ICONQUESTION);
break;
}
...
MessageBox 从未显示。在这种情况下,WM_PASTE 是正确的消息吗?
另外,我尝试将“ES_MULTILINE”添加到CreateWindow,但是当我尝试粘贴包含多行的文本时,根本没有粘贴任何文本,我只能听到“哔”的声音。
我知道我可以通过检测剪贴板更改来删除新行,然后覆盖它,但是这个解决方案会“侵入”用户剪贴板,所以我不想使用它。
我将非常感谢任何帮助。
【问题讨论】:
-
ES_MULTILINE必须是如果你想要多行。WS_EX_CONTROLPARENT也必须是扩展样式,而不是样式 -
是的,但是粘贴多行根本不起作用。我实际上想要在打字窗口中有一行。我现在能找到的最好的例子是谷歌浏览器地址栏。当我们将任何多行文本粘贴到其中时,它会被转换为单行并删除了换行符。
-
WM_PASTE- 你的子类编辑控件? -
是的,
WM_PASTE得到了完全编辑控件到您尝试粘贴文本的位置,但不是它的父项 -
在什么问题上自己在
WM_PASTE上获取剪贴板的上下文,自己处理文本(最简单的方法将'\r'和'\n'都替换为空格,但可以做任何事情。最后你自己发送EM_SETSEL+EM_REPLACESEL并且不调用编辑原始处理程序
标签: c++ winapi editcontrol