如何在不丢失边框“外观”的情况下为TCustomControl添加填充?

时间:2014-08-29 20:53:28

标签: delphi padding tmemo nonclient

我已经编写了一个自定义的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;

修改 哎呀!上面的内容在播放滚动条时会崩溃。我还没有解决方案。有什么建议吗?

0 个答案:

没有答案