Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在不丢失边框的情况下向TCustomControl添加填充“;“外观和感觉”;?_Delphi_Padding_Tmemo_Nonclient - Fatal编程技术网

Delphi 如何在不丢失边框的情况下向TCustomControl添加填充“;“外观和感觉”;?

Delphi 如何在不丢失边框的情况下向TCustomControl添加填充“;“外观和感觉”;?,delphi,padding,tmemo,nonclient,Delphi,Padding,Tmemo,Nonclient,我已经编写了一个定制的TMemo,但是注意到文本完全没有填充,而是贴在边框上。尽管我可以尝试通过抵消等方式在ClientRect内部解决问题,但在现阶段这并不是一个非常优雅的解决方案。TMemo至少有1px的填充空间,这不是客户端区域的一部分,所以我想我应该尝试做同样的事情(我假设他们也这么做) 所以我使用WM_NCCALCSIZE缩小了客户端区域,但是当然边界没有完全绘制,所以我也必须实现WM_NCPAINT。这很有效。现在,我绘制一个clBlack边框,后面是clWindow的填充矩形。到目

我已经编写了一个定制的TMemo,但是注意到文本完全没有填充,而是贴在边框上。尽管我可以尝试通过抵消等方式在ClientRect内部解决问题,但在现阶段这并不是一个非常优雅的解决方案。TMemo至少有1px的填充空间,这不是客户端区域的一部分,所以我想我应该尝试做同样的事情(我假设他们也这么做)

所以我使用WM_NCCALCSIZE缩小了客户端区域,但是当然边界没有完全绘制,所以我也必须实现WM_NCPAINT。这很有效。现在,我绘制一个clBlack边框,后面是clWindow的填充矩形。到目前为止还不错

在XP(经典风格)上,1px边框看起来有点奇怪,所以我想也许有一种方法可以绘制旧的“客户端边缘”边框,并且也符合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;
编辑:
啊!当游戏中有滚动条时,上面的东西就会崩溃。我还没有解决这个问题的办法。有什么建议吗?

“.一种绘制旧的“客户边缘”边界的方法..”-通常您包括
WS\u EX\u CLIENTEDGE
,而不必担心
WM\u NCCALCSIZE
等。您好,Sertac。我试图在非客户端区域添加一个额外的像素,所以我有一个填充的ClientRect。WS_ES_CLIENTEDGE在CreateParams中处于启用状态,调用inherited将对其进行绘制,除非主题处于启用状态并且需要调用PaintBorder。不幸的是,滚动条上的填充物仍然没有给我一个1px的缩减ClientRect。这对我来说是一个强烈的信号,表明TMemo不能像这样工作,我正要完全放弃这种方法。@Jamo-如果是文本太接近边缘而困扰您,您可以使用
EM\u SETRECT
解决它。谢谢Sertac。不过,我相信这是针对TEdit/TMemo派生类的。我已经决定自己添加填充物,这很有效。可能很像埃姆西特。我仍然使用上面的一些代码在Win7上使用电子服务绘制边框,等等。