Как нарисовать групповые блоки Delphi с прозрачным фоном
-
03-07-2019 - |
Вопрос
Я пытаюсь заставить работать что-то очень тонкое, сейчас это выглядит довольно ужасно.Я пытаюсь нарисовать фон 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 не работает надежно для этой работы, вероятно, потому, что иногда ОС не нужно все перерисовывать.