直到我通過鼠標觸摸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);
}
}
該代碼是完全錯誤的。你需要檢查PeekMessage的返回值。那裏可能沒有消息。如果有什麼東西,你應該清空隊列。否則,你會做一個關鍵,然後添加更多的文字,然後做一個關鍵,等等。那會好嗎?你應該打電話翻譯信息。但是,爲什麼不只是一次性添加所有文本呢?更糟糕的是,搞亂像這樣的混亂隊列是混亂和糟糕的形式。在另一個線程中運行循環。另外,如果用戶開始輸入,該怎麼辦。現在他們的文本與你的文字混淆了。 –
是的,我知道代碼看起來並不專業,但工作起來,我並不是那麼迷戀發生在引擎蓋下的事情,讓計算機感受到痛苦,計算機對於人類來說不是其他方式。無論如何,這只是一個例子。 – rsk82
沒有數量的拋光修復了這一點。我很努力地知道我的答案有什麼問題。 –