喫茶XRAYトップページ

[スレッド全体
]

[11451] サイズ変更グリップ返信 削除
2017/10/15 (日) 12:32:41 igy
># 実際、サイズ変更グリップを表示するコンポーネントを作りました。

作ったコンポーネントは、こんな感じです。
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.


[11452] Re:サイズ変更グリップ返信 削除
2017/10/15 (日) 18:38:26 Mr.XRAY
▼ igyさん
> ># 実際、サイズ変更グリップを表示するコンポーネントを作りました。

おお,なるほど.
テストコードと実行結果です.
例によって Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.

procedure TForm1.FormCreate(Sender: TObject);
begin
  FResizeGrip := TIgySizingMark.Create(Self);
  FResizeGrip.Parent := Panel1;
end;

procedure TForm1.Panel1Resize(Sender: TObject);
begin
 FResizeGrip.Left := Panel1.Width - FResizeGrip.Width ;
 FResizeGrip.Top := Panel1.Height- FResizeGrip.Height;
end;


[11454] Re2:サイズ変更グリップ返信 削除
2017/10/15 (日) 18:50:06 Mr.XRAY
そうか,これはグリップというわけではなく,マークなんですね.
それで Mark なんですね.なるほど.


[11455] Re3:サイズ変更グリップ返信 削除
2017/10/15 (日) 18:58:48 igy
▼ Mr.XRAYさん
> そうか,これはグリップというわけではなく,マークなんですね.
> それで Mark なんですね.なるほど.


あ、当時、なんて名前を付ければよいか、わからなかったので、マークにしてました・・・
今だったら、TxxxSizingGrip や TxxxSizeGrip とか、
テストコードに書かれているように TxxxResizeGrip のほうがよさそうですね。


[11456] Re4:サイズ変更グリップ返信 削除
2017/10/15 (日) 19:02:29 Mr.XRAY
▼ igyさん

> あ、当時、なんて名前を付ければよいか、わからなかったので、マークにしてました・・・
> 今だったら、TxxxSizingGrip や TxxxSizeGrip とか、テストコードに書かれているように TxxxResizeGrip のほうがよさそうですね。


いや,Mark とかのが適切のような.
FireMonkey は Grip ですが,実際にその部分にマウスカーソルがいくと
リサイズになるようです.つまり実際に「握る」ことになるようです.
Grip のための表示という意味では Grip でもいいのかな ?


[11457] Re5:サイズ変更グリップ返信 削除
2017/10/15 (日) 19:21:53 igy
▼ Mr.XRAYさん
> FireMonkey は Grip ですが,実際にその部分にマウスカーソルがいくと
> リサイズになるようです.つまり実際に「握る」ことになるようです.


たしかに!

SezeGripをフォーム(右下じゃないところ)に置き、
SezeGripのところにマウスカーソルを合わせると、カーソルの表示も変わり、
ドラッグするとフォーム自体がリサイズしますね!!



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82