># 実際、サイズ変更グリップを表示するコンポーネントを作りました。
作ったコンポーネントは、こんな感じです。
13年前に書いたコードでした。今だったら、もっと、スマートな書き方が出来たかもしれないですけど・・・
unit IgySizingMark;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Themes;
type
TIgySizingMark = class(TGraphicControl)
private
{ Private 宣言 }
protected
{ Protected 宣言 }
procedure Paint; override;
public
{ Public 宣言 }
constructor Create(Owner: TComponent); override;
published
{ Published 宣言 }
property Align;
property Anchors;
property Constraints;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property ParentShowHint;
property ShowHint;
property Visible;
property OnContextPopup;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;
procedure Register;
implementation
const
MARK_SIZE = 12; // SizingGripのサイズ
X_ADD = 3;
Y_ADD = 3;
procedure Register;
begin
RegisterComponents('Igy', [TIgySizingMark]);
end;
constructor TIgySizingMark.Create(Owner: TComponent);
begin
inherited Create(Owner);
// 幅・高さを設定
Height := MARK_SIZE + 1 + Y_ADD;
Width := MARK_SIZE + 1 + X_ADD;
// 幅・高さを固定
with Constraints do
begin
MaxHeight := MARK_SIZE + 1 + Y_ADD;
MinHeight := MARK_SIZE + 1;
MaxWidth := MARK_SIZE + 1 + X_ADD;
MinWidth := MARK_SIZE + 1;
end;
end;
procedure TIgySizingMark.Paint;
var
cnt, amari, ln, sx, sy: integer;
SizingGripShow: boolean;
r: TRect;
Details: TThemedElementDetails;
begin
inherited;
SizingGripShow := (TForm(Owner).WindowState = wsNormal) and
(not TForm(Owner).HorzScrollBar.IsScrollBarVisible) and
(not TForm(Owner).VertScrollBar.IsScrollBarVisible);
if SizingGripShow then
begin
if not ThemeServices.ThemesEnabled then
begin // XP 以前かマニフェストが指定されていない場合
sx := Width - (MARK_SIZE + 1);
sy := Height - (MARK_SIZE + 1);
with Canvas do
begin
for ln := 0 to MARK_SIZE - 1 do
begin
for cnt := 1 to MARK_SIZE - ln do
begin
amari := cnt mod 4;
if amari = 1 then
Pixels[sx+cnt+ln, sy+MARK_SIZE-ln] := clBtnHighlight
else if amari in [2, 3] then
Pixels[sx+cnt+ln, sy+MARK_SIZE-ln] := clBtnShadow;
end;
end;
end;
end
else // テーマに沿った描画を行う
begin
r := ClientRect; // 描画領域の取得
Details := ThemeServices.GetElementDetails(tsGripper); // パーツ&状態に対応するパーツ番号、状態番号を取得
ThemeServices.DrawElement(Canvas.Handle, Details, r); // 描画
end;
end;
end;
end.
|