0

マウスでリッチエディット ウィンドウに触れるまで、その内容はライブ更新されますが、マウスをその上に置くと、矢印が砂時計カーソルに変わります。ウィンドウは、タイトル バーでウィンドウを移動しようとして 3 回または 4 回試行しても反応しません。最終的にマウスのドラッグに反応すると、正常に動作しますが、コンテンツの更新が停止し、タイトル バーが空になります。同様の効果は、ウィンドウのクライアント領域をクリックしようとしたときです。今回は、反応ウィンドウなしで数回クリックした後も更新が停止し、タイトルバーが(応答なし)に変わります。

ループが最終的に停止すると、プログラムはウィンドウの更新に戻り、「生きている」状態に戻ります。クライアント領域が更新されている間にウィンドウを操作できるようにする (そして、更新されているコンテンツを確認する) にはどうすればよいですか?

#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);
  }
}
4

2 に答える 2

2

リッチ エディット ウィンドウをタイト ループで入力していて、メッセージ キューを処理していません。プロセスがメッセージ キューに定期的にアクセスしていない限り、システムはアプリが応答を停止したと見なします。あれ、反応しなくなった!

アプリケーションの応答性を維持するには、メッセージ キューをポンピングする必要があります。あなたの実際のプログラムが何をしようとしているのか、私にはよくわかりません。そのテキストをリッチ エディットに入れたい場合は、1 つのEM_REPLACESELメッセージで行います。

実際に実行時間の長いタスクがある場合、それは別のスレッドに属します。次に、GUI スレッドへの同期を処理する必要があります。SendMessage を呼び出すだけの場合は、システムが同期を処理します。

肝心なのは、タイムリーにメッセージ キューをポンプする必要があるということです。

于 2013-01-24T23:16:52.760 に答える
0

見つかった答えは、これが私の改訂されたコードです。 と を見てPeekMessageWくださいDispatchMessageW

#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);
  }
}
于 2013-01-24T23:28:06.680 に答える