1

d3d アプリケーションをオーバーレイするために、次のフラグを使用してウィンドウを作成しました。WS_EX_COMPOSITED | WS_EX_TRANSPARENT | WS_EX_LAYERED 透過性のためにウィンドウのカラーキー設定を進めましたが、すべてうまくいきました。しかし、GDI を使用して描画を開始すると、予期しない問題が発生しました。

何らかの理由で、WM_PAINT の実行中にマウス イベント (特に移動) がウィンドウを正しく通過しないため、マウスとキーボードが遅れているように見えます。FPS は問題ありません。これは API の問題です。何らかの理由で、WM_PAINT の進行中にキーボード/マウス メッセージが適切に処理されていないと思われます。

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

 switch(msg)
 {
  case WM_DESTROY:
  {
          KillTimer(hwnd, ID_TIMER);
          PostQuitMessage(0);
          break;
         }
  case WM_CREATE:
  {
   SetTimer(hwnd, ID_TIMER, 10, NULL);
   break;
  }
  case WM_TIMER:
  {
   InvalidateRect(hwnd, 0, 1);
   break;
         }
  case WM_PAINT:
  {
   paint(hwnd);
   break;
  }
 }
 return DefWindowProc(hwnd, msg, wParam, lParam);
}

void paint (HWND hwnd)
{
 PAINTSTRUCT Ps;
 HDC hdc = BeginPaint(hwnd, &Ps);

 SetBkColor(hdc, RGB(0,0,0));
 SetBkMode(hdc, TRANSPARENT);



 LOGBRUSH log_brush;
 log_brush.lbStyle = BS_NULL;
 HBRUSH handle_brush = CreateBrushIndirect(&log_brush);
 SelectObject(hdc, handle_brush);


..........................................


 DeleteObject(font);
 DeleteObject(pen);
 DeleteObject(handle_brush);

 EndPaint(hwnd, &Ps);
}

お力になれることがございましたら、どうぞよろしくお願いいたします。

4

2 に答える 2

1

WM_PAINT メッセージは、誰かが呼び出しをUpdateWindow行うか、入力キューにキーボードまたはマウスのメッセージがない限り、ウィンドウに配信されません。

WM_PAINT の処理を​​開始すると、キーボードまたはマウスのメッセージが到着すると、WM_PAINT の処理が完了するまでキューに置かれます。したがって、あなたが説明していることは不可能です。

WM_PAINT コードの実行に時間がかかる場合、ジャーキネスが発生する可能性がありますが、それは問題ではないとおっしゃっているので、もしかしたら WM_ERASEBKGND の処理ですか? そのコードはわかりませんがInvalidateRect、最後のパラメーターとして TRUE を渡していることはわかります。これは、背景を消去することを意味します。

WM_ERASEBKGND を処理しない場合は、DefWindowProc がウィンドウ クラスのブラシでウィンドウ全体を消去します。これにより、ウィンドウのどの部分も透明でないとウィンドウが考える可能性があります。

マウス メッセージをウィンドウを通過させたい場合、より確実な方法は、WM_NCHITTEST メッセージを処理し、マウスを通過させたい場所に HTTRANSPARENT を返すことです。
これは基本的に、WS_EX_TRANSPARENT スタイルがどのように機能するかです。このような

case WM_NCHITTEST:
   {
   lRet = DefWindowProc(hwnd, uMsg, wParam, lParam);
   if (HTCLIENT == lRet)
      lRet = HTTRANSPARENT;
   }

ウィンドウに非クライアント領域がない場合は、DefWindowProc の呼び出しをスキップできます。

于 2010-02-20T05:21:54.430 に答える
0

WndProc() は常に再入可能ではありません。メインのメッセージ ポンプでは、マウスとキーボードのメッセージがキューに入れられ、前の WM_PAINT メッセージが終了するのを待っていると思います。逆に、WndProc() から SendMessage() を呼び出す場合は、re-entrace を見ています。もう 1 つのケースは、キューにメッセージを追加する PostMessage() です。これが問題になる場合は、マウスとキーボードの入力に DirectInput を使用することを検討してください。それ以外の場合は、描画を高速化する方法を探してください。

于 2010-02-20T04:58:42.380 に答える