2013-01-24 38 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,那麼系統負責同步它。

底線是必須泵的消息隊列及時。