Как нарисовать поля группы Delphi, чтобы иметь прозрачный фон - PullRequest
3 голосов
/ 30 сентября 2008

Я пытаюсь заставить что-то очень тонкое работать, сейчас это выглядит довольно ужасно. Я пытаюсь нарисовать фон TGroupBox, у которого я перегружен функцией рисования, чтобы углы были видны до их родительского объекта. У меня есть куча вложенных групповых блоков, которые выглядят очень прилично без XPThemes.

Есть ли способ закрасить часть фона прозрачным во время выполнения. Я программирую генератор форм, но не использую дизайн-представление Delphi.

Ответы [ 4 ]

2 голосов
/ 01 октября 2008

Когда у меня возникла такая ситуация, я сначала работал с 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 голос
/ 02 октября 2008

Ха, это было глупо, мне просто нужно было не устанавливать ParentBackground: = false в моем конструкторе и рисовать внутреннюю часть группового блока, когда это уместно.

может быть, есть кое-что, чего я не знаю, но по моему недавнему опыту, это не так просто, как кажется, из-за тем и точно зная, какую область рисовать. даже TCanvas.FloodFill не работает надежно для этой работы, вероятно, потому что иногда ОС не нужно перекрашивать все.

1 голос
/ 02 октября 2008

Ха, это было неубедительно, мне просто нужно было не устанавливать ParentBackground := false в моем конструкторе и при необходимости рисовать внутреннюю часть группового блока.

1 голос
/ 30 сентября 2008

Я пытаюсь продублировать эту проблему, выполнив следующие действия:

1 - установить тему для Windows XP по умолчанию

2 - удалить TGroupBox в пустой форме (align = alNone)

3 - Перетащите два 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
...