Как нарисовать групповые блоки Delphi с прозрачным фоном

StackOverflow https://stackoverflow.com/questions/154387

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

когда у меня была такая ситуация, я сначала работал с 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 не работает надежно для этой работы, вероятно, потому, что иногда ОС не нужно все перерисовывать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top