2

カスタム 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;

編集: ああ!スクロールバーが動作している場合、上記のものは機能しません。私はまだその解決策を持っていません。助言がありますか?

4

0 に答える 0