カスタム 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;
編集: ああ!スクロールバーが動作している場合、上記のものは機能しません。私はまだその解決策を持っていません。助言がありますか?