2012-04-21 11 views
3

フォームの背景が見えないように、フォームに関数をプロットする必要があります。 TransparentColorがTrueに設定され、TransParentColorValueがclWhiteに設定されたTFormを作成しました。その上にTImageを置くだけで、ビットマップに関数を描画し、それをイメージに代入して、うまくいきます。 1つの問題があります。私はもうフォームをクリックできません。フォームのキャプションとクライアントエリアをクリックすると、基になるアプリケーションのクリックが発生します。これは、TransparentColorをTrueに設定することによって発生します。この「クリックスルー」をどうやって防ぐことができますか?透明なフォーム上のクリックスルーを防止する

更新 私はSertacの提案を試みましたが、いくつか注目すべき結果がありました。次のように私は、ビットマップを準備します

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

色がclWhiteに設定され、フォームが同様にTransparentColorValue、フォームが完全にクリックスルーが有効になっているされている場合。

clBlackに設定両方、フォームを移動させることができるが、境界をサイズ変更することができず、システム・ボタンは、それが通常のフォームとして動作clFuchsiaに

両方のセットを動作しません。さて、今は動作しますが、誰か説明がありますか?

+2

別の色を使用します(理由はわかりません)。 –

+0

奇妙なことに、TransparentColorValueをclBlackに設定し、ビットマップをclBlackで埋めても部分的に機能します。それはクリックスルーではなく、私は今フォームを移動することができますが、まだサイズを変更することはできず、システムボタンは反応しません。どのようにそれを解決するための任意のアイデア? – Arnold

+0

これらの色はどこにありますか? clfuchsiaにしてやってみましょう::) –

答えて

5

いくつかの特定の色を使用するとAPIが変わったように見えます。白は明白ですが、黒は少し問題はありません。私は黄色、灰色、ボタンの顔、フクシアなどで試してみました。彼らは上手く見えます。

誰でもDelphiの「透明な...」プロパティを使用せずに問題を再現したい場合は、ここで少し抜粋です:

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; 


注:誰もがして答えを提供する場合、私は喜んでこの回答を削除したいです決定的な説明。

+1

私はそれに同意します。 – Arnold

関連する問題