3

私は非常に微妙なものを機能させようとしていますが、今はかなりひどいようです。コーナーが親オブジェクトに透けて見えるように、ペイント機能をオーバーロードした TGroupBox の背景をペイントしようとしています。XPThemes がなくても非常にまともに見えるネストされたグループ ボックスがたくさんあります。

実行時に透明な背景の一部をペイントする方法はありますか? Delphi デザイン ビューを使用せずに、フォーム ジェネレータをプログラミングしています。

4

4 に答える 4

2

そのような状況になったとき、最初は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;
于 2008-09-30T20:21:54.860 に答える
1

次の手順でこの問題を再現しようとしています。

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
于 2008-09-30T19:02:02.167 に答える
1

はぁ、それはつまらなかった。コンストラクターを設定せず、必要に応じParentBackground := falseてグループボックスの内部をペイントする必要があった。

于 2008-10-02T14:21:36.177 に答える
1

ハ、それは不自由でした。コンストラクターで ParentBackground := false を設定せず、必要に応じてグループ ボックスの内部をペイントする必要がありました。

多分私が知らない何かがあるかもしれませんが、私の最近の経験では、テーマとペイントする領域を正確に知っているため、思ったほど単純ではありません. TCanvas.FloodFill でさえ、この作業では確実に機能しません。これは、OS がすべてを再描画する必要がない場合があるためです。

于 2008-10-02T15:50:35.307 に答える