名前 題名 ▼ 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. GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link