私は非常に微妙なものを機能させようとしていますが、今はかなりひどいようです。コーナーが親オブジェクトに透けて見えるように、ペイント機能をオーバーロードした TGroupBox の背景をペイントしようとしています。XPThemes がなくても非常にまともに見えるネストされたグループ ボックスがたくさんあります。
実行時に透明な背景の一部をペイントする方法はありますか? Delphi デザイン ビューを使用せずに、フォーム ジェネレータをプログラミングしています。
私は非常に微妙なものを機能させようとしていますが、今はかなりひどいようです。コーナーが親オブジェクトに透けて見えるように、ペイント機能をオーバーロードした TGroupBox の背景をペイントしようとしています。XPThemes がなくても非常にまともに見えるネストされたグループ ボックスがたくさんあります。
実行時に透明な背景の一部をペイントする方法はありますか? Delphi デザイン ビューを使用せずに、フォーム ジェネレータをプログラミングしています。
そのような状況になったとき、最初は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;
次の手順でこの問題を再現しようとしています。
1-テーマをWindowsXPのデフォルトに設定します
2-空のフォームにTGroupBoxをドロップします(align = alNone)
3-最初のTGroupBox内に2つのTGroupBoxをドロップします。align=alBottomおよびalign=alClient
しかし、視覚的には私には問題ないように見えます。
フォームをどのように設計したかについて、もう少し情報を提供できますか?.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
はぁ、それはつまらなかった。コンストラクターを設定せず、必要に応じParentBackground := false
てグループボックスの内部をペイントする必要があった。
ハ、それは不自由でした。コンストラクターで ParentBackground := false を設定せず、必要に応じてグループ ボックスの内部をペイントする必要がありました。
多分私が知らない何かがあるかもしれませんが、私の最近の経験では、テーマとペイントする領域を正確に知っているため、思ったほど単純ではありません. TCanvas.FloodFill でさえ、この作業では確実に機能しません。これは、OS がすべてを再描画する必要がない場合があるためです。