背景を透明にするためにデルファイグループボックスを描画する方法
-
03-07-2019 - |
質問
非常に微妙な動作をさせようとしていますが、今はかなりひどいようです。ペイント機能をオーバーロードしたTGroupBoxの背景をペイントして、角が親オブジェクトに透けて見えるようにします。 XPThemesがなくても非常にまともな外観のネストされたグループボックスがたくさんあります。
実行時に背景の一部を透明にペイントする方法はありますか。 Delphiデザインビューを使用せずにフォームジェネレーターをプログラミングしています。
解決
次の手順でこの問題を再現しようとしています:
1-テーマをWindows XPのデフォルトに設定
2-空のフォームにTGroupBoxをドロップします(align = alNone)
3-align = alBottomおよびalign = alClientを使用して、最初のTGroupBox内に2つのTGroupBoxをドロップします
しかし、視覚的には私には問題ありません。
フォームの設計方法に関する詳細情報を提供できますか? .DFMから貼り付けたコードには問題ありません。
ここに私のDFMの関連部分があります:
object GroupBox1: TGroupBox
Left = 64
Top = 56
Width = 481
Height = 361
Margins.Left = 10
Caption = 'GroupBox1'
ParentBackground = False
TabOrder = 0
object GroupBox2: TGroupBox
Left = 2
Top = 254
Width = 477
Height = 105
Align = alBottom
Caption = 'GroupBox2'
TabOrder = 0
end
object GroupBox3: TGroupBox
Left = 2
Top = 15
Width = 477
Height = 239
Align = alClient
Caption = 'GroupBox3'
TabOrder = 1
end
end
他のヒント
そのような状況にあったとき、私は最初にTGroupBoxを使用していましたが、TPaintBox(このサンプルではpbと呼びます)を使用し、代わりにTGroupBoxのグラフィカル部分をシミュレートすることにしました。
procedure TfraNewRTMDisplay.pbPaint(Sender: TObject);
const
icMarginPixels=0;
icCornerElipsisDiameterPixels=10;
begin
pb.Canvas.Pen.Color:=clDkGray;
pb.Canvas.Pen.Width:=1;
pb.Canvas.Pen.Style:=psSolid;
pb.Canvas.Brush.Color:=m_iDisplayColor;
pb.Canvas.Brush.Style:=bsSolid;
pb.Canvas.RoundRect(icMarginPixels,
icMarginPixels,
pb.Width-icMarginPixels*2,
pb.Height-icMarginPixels*2,
icCornerElipsisDiameterPixels,
icCornerElipsisDiameterPixels);
end;
ハ、それはラメでした。ただ、コンストラクターで ParentBackground:= false
を設定せず、必要に応じてグループボックスの内部をペイントする必要がありました。
はい、それは不十分でした。コンストラクタでParentBackground:= falseを設定せず、必要に応じてグループボックスの内部をペイントする必要がありました。
わからないことがあるかもしれませんが、最近の経験では、テーマとアンプのために聞こえるほど単純ではありません。ペイントする領域を正確に知る。 TCanvas.FloodFillでさえ、この作業で確実に動作しません。おそらく、OSがすべてを再描画する必要がないためです。