我已经编写了一个自定义的TMemo,但是注意到文本没有填充边框,没有填充。虽然我可以通过抵消它来尝试修复ClientRect中的问题,但在这个阶段它不会是一个非常优雅的解决方案。 TMemo在那里至少有1px的填充而不是客户区的一部分,所以我想我会尝试做同样的事情(我假设他们无论如何都是这样做的)。
所以我使用WM_NCCALCSIZE缩小了客户区,但当然边框没有完全绘制,所以我也必须实现WM_NCPAINT。这样可行。我现在绘制一个clBlack边框,然后是clWindow的填充矩形。到目前为止一切都很好。
在XP(经典风格)上,1px边框看起来有点奇怪,所以我想也许有一种方法来绘制旧的"客户端边缘" border,和也符合XP / Vista / Win7主题客户端边缘外观(我不知道如何使用渐变手动绘制)。
这就是我有点卡住的地方。有没有人知道如何以我可以填充的方式绘制边框,以及如何保持适当的客户端边缘"看(1px或2px)?
非常感谢。 ;)
(其他方式也欢迎这样做)
=====
修改 经过一些修补,我提出了以下解决方案。我以为我会把它发布在这里。
procedure TTest.WMNCCalcSize(var Msg: TWMNCCalcSize);
begin
inherited;
InflateRect(Msg.CalcSize_Params.rgrc[0], -1, -1);
Msg.Result := 0;
end;
procedure TTest.WMNCPaint(var Msg: TWMNCPaint);
var
lCanvas: TCanvas;
lRect: TRect;
iBorderWidth: integer;
iInflate: integer;
begin
if ThemeServices.ThemesEnabled
ThemeServices.PaintBorder(self, true)
else
inherited;
lCanvas := TCanvas.Create;
try
lCanvas.Handle := GetWindowDC(Handle);
with lCanvas do
begin
lRect := Rect(0, 0, Width, Height);
iBorderWidth := (Width - ClientWidth) div 2;
iInflate := -(iBorderWidth - 1);
InflateRect(varRect, iInflate, iInflate);
Brush.Color := clWindow;
FrameRect(lRect);
end;
finally
ReleaseDC(Handle, lCanvas.Handle);
FreeAndNil(lCanvas);
end;
Msg.result := 0;
end;
修改 哎呀!上面的内容在播放滚动条时会崩溃。我还没有解决方案。有什么建议吗?