3

フォームの背景が表示されていないフォームに関数をプロットしたいと思います。TransparentColorをTrueに設定し、TransParentColorValueをclWhiteに設定してTFormを作成しました。その上にTImageを置き、ビットマップに関数を描画し、それを画像に割り当てるだけで、うまく機能します。1つの問題があります。フォームをクリックできなくなりました。フォームのキャプションとclientareaをクリックすると、基になるアプリケーションがクリックされます。これは、TransparentColorをTrueに設定したことが原因です。この「クリックスルー」を防ぐにはどうすればよいですか?

更新 Sertacの提案を試しましたが、いくつかの驚くべき結果が得られました。次のようにビットマップを準備します。

   Bitmap.Canvas.Brush.Color := clFuchsia;
   Bitmap.Canvas.FillRect (Rect (0, 0, Bitmap.Width, Bitmap.Height));

ColorがclWhiteに設定され、FormsのTransparentColorValueも設定されている場合、フォームは完全にクリックスルーが有効になります。

両方ともclBlackに設定され、フォームは移動できますが、境界線のサイズを変更できず、システムボタンが機能しません

両方ともclFuchsiaに設定され、通常のフォームとして動作します。さて、それは今は機能しますが、誰かが説明を得たのでしょうか?

4

1 に答える 1

5

特定の色を使用すると、APIの動作がおかしくなるようです。白は明らかなものであり、黒は少し問題が少ないです。黄色、灰色、ボタンの面、フクシアなどを試してみましたが、見栄えがします。

Delphiの「Transparent...」プロパティを使用せずに問題を再現したい場合は、次のスニペットをご覧ください。

procedure TForm1.Button1Click(Sender: TObject);
var
  Color: DWORD;
  DC: HDC;
begin
  Color := $00FFFFFF;
  SetWindowLong(Handle, GWL_EXSTYLE,
      GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED );
  SetLayeredWindowAttributes(Handle, Color, 255, LWA_COLORKEY);

  DC := GetWindowDC(Handle);
  SetDCBrushColor(DC, Color);
  FillRect(DC, Rect(10, 10, 100, 80), GetStockObject(DC_BRUSH));
  ReleaseDC(Handle, DC);
end;


注:誰かが明確な説明で答えを提供した場合、私は喜んでこの答えを削除します。

于 2012-04-21T14:39:08.583 に答える