为什么在RichEdit窗口中添加文本会冻结它?

时间:2013-01-24 21:35:02

标签: c++ winapi richedit

在我用鼠标触摸richedit窗口之前,它的内容是实时更新的,但将鼠标悬停在它上方会将箭头转换为沙漏光标。然后窗口不响应三个或四个后续尝试通过标题栏移动它。当它最终对鼠标拖动做出反应时,它会正常移动但停止刷新其内容并且标题栏变为空。当我尝试单击窗口的客户区时,效果类似。这次没有任何反应窗口点击几次也停止更新,其标题栏变为(没有响应)

当循环最终停止时,程序返回窗口更新并返回'活着'。如何在客户区更新时操作窗口(并查看更新内容)该怎么办?

#include <windows.h>
#include <sstream>

int main() {
  using namespace std;
  LoadLibrary("Msftedit.dll");
  HWND richeditWindow = CreateWindowExW (
    WS_EX_TOPMOST,
    L"RICHEDIT50W", 
    L"window text",
    WS_SYSMENU | WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | WS_VISIBLE,
    50, 50, 500, 500,
    NULL, NULL, NULL, NULL
  );

  for (int i = 0 ; i<100000; i++) {
    wstringstream wss;
    wss << i << L", ";
    SendMessageW(richeditWindow, EM_REPLACESEL, FALSE, (LPARAM) wss.str().c_str());
  }

  MSG msg;
  while( GetMessageW( &msg, richeditWindow, 0, 0 ) ) {
    TranslateMessage(&msg);
    DispatchMessageW(&msg);
  }
}

2 个答案:

答案 0 :(得分:2)

您正在紧密循环中填充富编辑窗口,而不是为您的邮件队列提供服务。除非您的进程定期访问其消息队列,否则系统会认为您的应用已停止响应。好吧,它已经停止响应了!

为了使您的应用程序保持响应,您必须抽取消息队列。我真的不知道你真正的程序想要做什么。如果您想将该文本放入丰富的编辑中,则只需使用一条EM_REPLACESEL邮件即可。

如果你确实有一个长时间运行的任务,那么它属于另一个线程。然后你必须处理同步回GUI线程。如果您所做的只是调用SendMessage,那么系统会负责同步它。

底线是必须及时抽取你的消息队列。

答案 1 :(得分:0)

找到答案这是我修改后的代码,请查看PeekMessageWDispatchMessageW

#include <windows.h>
#include <iostream>
#include <sstream>

int main() {
  using namespace std;
  LoadLibrary("Msftedit.dll");
  HWND richeditWindow = CreateWindowExW (
    WS_EX_TOPMOST,
    L"RICHEDIT50W", 
    L"window text",
    WS_SYSMENU | WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | WS_VISIBLE,
    50, 50, 500, 500,
    NULL, NULL, NULL, NULL
  );

  MSG msg;
  for (int i = 0 ; i<100000; i++) {
    wstringstream wss;
    wss << i << L", ";
    SendMessageW(richeditWindow, EM_REPLACESEL, FALSE, (LPARAM) wss.str().c_str());
    if (PeekMessageW(&msg, richeditWindow, 0, 0, PM_REMOVE)) {
      TranslateMessage(&msg);
      DispatchMessageW(&msg);
    }
  }

  while( GetMessageW( &msg, richeditWindow, 0, 0 ) ) {
    TranslateMessage(&msg);
    DispatchMessageW(&msg);
  }
}