2013-01-24 41 views
0

直到我通过鼠标触摸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); 
    } 
} 

回答

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); 
    } 
} 
+1

该代码是完全错误的。你需要检查PeekMessage的返回值。那里可能没有消息。如果有什么东西,你应该清空队列。否则,你会做一个关键,然后添加更多的文字,然后做一个关键,等等。那会好吗?你应该打电话翻译信息。但是,为什么不只是一次性添加所有文本呢?更糟糕的是,搞乱像这样的混乱队列是混乱和糟糕的形式。在另一个线程中运行循环。另外,如果用户开始输入,该怎么办。现在他们的文本与你的文字混淆了。 –

+0

是的,我知道代码看起来并不专业,但工作起来,我并不是那么迷恋发生在引擎盖下的事情,让计算机感受到痛苦,计算机对于人类来说不是其他方式。无论如何,这只是一个例子。 – rsk82

+0

没有数量的抛光修复了这一点。我很努力地知道我的答案有什么问题。 –

2

你是填充在一个紧凑的循环丰富的编辑窗口,而不是你的服务的消息队列。除非您的进程定期参与其消息队列,否则系统会认为您的应用已停止响应。那么,它已停止响应!

为了使您的应用程序响应,您必须泵的消息队列。我真的不知道你真正的计划正在做什么。如果您想将该文本置入丰富的编辑中,您可以使用单个EM_REPLACESEL消息来完成此操作。

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

底线是必须泵的消息队列及时。