4

毎秒1回発生するイベントに応答してリフレッシュ(テキストの変更)する静的コントロールを実装しようとしています。クライアント領域全体を毎秒ペイントしたくなかったので、静的コントロールを使用することにしましたが、問題は親ウィンドウがスキンされていることです。つまり、背景としてカスタム ビットマップがあり、静的コントロールはそうではありません。収まるので、静的コントロールの背景を透明にする方法を探しています。

これは私が今持っているものです:

     hHandle = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 60, 212, 477, 20, hwnd, 0, hInstance, 0) ;


     case WM_CTLCOLORSTATIC: 
          {
              HDC hdC = (HDC)wParam;

              SetTextColor( hdC, RGB(31,122,179) );

              SetBkMode( hdC, TRANSPARENT );


              return 0;//(HRESULT)GetStockObject(NULL_BRUSH);
          }
          break;

NULL ブラシを返して背景をペイントしようとしましたが、背景が透明になることを期待していましたが、静的コントロールが適切に再描画されないようにすることはできませんでした。つまり、テキストが古いテキストの上に描画されるということです。そのすべてが面倒です。

サブクラス化が唯一のオプションですか?

4

3 に答える 3

3

WC_STATIC コントロールを取得して、選択した色のテキストのみを (画像または他の表面の上に) 表示する方法は、私が理解しているように、リターンです。これは、このリンクから私のために働いたものです。

case WM_CTLCOLORSTATIC:
   SetTextColor((HDC)wParam, RGB(255, 0, 0));
   SetBkMode((HDC)wParam, TRANSPARENT);

   // the correct return needs HOLLOW_BRUSH
   return (LRESULT)GetStockObject(HOLLOW_BRUSH);
break;
于 2015-08-10T16:19:18.863 に答える
3

これを確実に行う唯一の方法は、静的コントロールをサブクラス化し、背景を手動でペイントすることです。

WS_EX_TRANSPARENT下にあるピクセルに対してコントロールを真に透明にするわけではなく (そのように見えるかもしれませんが)、WS_EX_COMPOSITED子ウィンドウには使用できません。

代わりに、静的をサブクラス化し、WM_ERASEBKGNDメッセージをキャッチします。次に、基になるビットマップの適切な部分をペイントできます。

于 2012-12-06T20:05:21.607 に答える
0

静的コントロールのウィンドウ スタイルについては言及していません。具体的には、拡張スタイル WS_EX_TRANSPARENT は、再描画で説明した問題を解決することを目的としているようです。また、私が理解しているように、 WS_EX_COMPOSITED はあなたのコンテキストで役立つかもしれません。

また、再描画に影響を与える可能性があるため、背景ウィンドウに WS_CLIPCHILDREN を設定する必要があるかどうかを検討することもできます。

于 2012-12-06T17:28:03.600 に答える