我正在尝试使用Canvas绘制类似对话框的表单。我可以在其中放置圆角边框和圆角矩形作为标题/标头。我只想用刷子填充标题。
然而,我很难填充这个标题。当使用FillRect
时,整个表单都会被重新绘制。尝试在此处进行搜索,如果我错过了,请指引我去哪里。否则,我该怎么做?使用Delphi 7,在OnPaint事件中。
procedure TCustomDialog.FormPaint(Sender: TObject);
var
Rect: TRect;
BorderColor: TColor;
BrushColor: TColor;
begin
// Rect for Form's borders;
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := ClientWidth;
Rect.Bottom := ClientHeight;
BorderColor := HtmlToTColor('#ffffff');
BrushColor := HtmlToTColor('#ffffff');
// Here I set the colors of Canvas.Pen (border) and Canvas.Brush (Filling),
// similar to Bootstrap themes/classes (Default, Success, Warning, Danger);
case DialogType of
dtInformation:
begin
BorderColor := HtmlToTColor(Header_Color_Pen_Information);
BrushColor := HtmlToTColor(Header_Color_Brush_Information);
end;
dtSuccess:
begin
BorderColor := HtmlToTColor(Header_Color_Pen_Success);
BrushColor := HtmlToTColor(Header_Color_Brush_Success);
end;
dtWarning:
begin
BorderColor := HtmlToTColor(Header_Color_Pen_Warning);
BrushColor := HtmlToTColor(Header_Color_Brush_Warning);
end;
dtError:
begin
BorderColor := HtmlToTColor(Header_Color_Pen_Error);
BrushColor := HtmlToTColor(Header_Color_Brush_Error);
end;
end;
with Canvas do
begin
Pen.Color := BorderColor;
Pen.Width := Form_Pen_Width;
// Draw rounded borders for Form;
RoundRect(1, 1, Rect.Right - 1, Rect.Bottom - 1, Form_Border_Radius - 1, Form_Border_Radius - 1);
// Rect for Dialog's Header;
Rect.Left := Component_Gutter;
Rect.Top := Component_Gutter;
Rect.Right := ClientWidth - Component_Gutter;
Rect.Bottom := Form_Header_Height;
RoundRect(Component_Gutter, Component_Gutter, ClientWidth - Component_Gutter, Form_Header_Height,
Form_Border_Radius - 2, Form_Border_Radius - 2);
Brush.Color := BrushColor;
FillRect(Rect);
end;
end;
Brush.Color := BrushColor;
这行代码到RoundRect()
调用之前,并删除FillRect()
调用即可。 - Tom BrunbergCanvas.Brush.Color := clRed;
Canvas.RoundRect(10, 10, 150, 50, 30, 10);
可以绘制一个填充的圆角矩形。请提供一个 [mcve],我们可以看到你做错了什么。 - Sertac AkyuzRoundRect(Component_Gutter ....)
的前面,并且按照我的建议删除了FillRect()
调用吗?现在的结果是什么?它不可能和你所声称的问题相同。你打算提供一个 MCVE,还是只是等待奇迹发生? - Tom Brunberg