|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"初期幅で開くTOpenDialog"
こんにちは、佐藤 充男です。
Windows98でTOpenPictureDialogやTSavePictureDialogを表示したのちに、
TOpenDialogかTSaveDialogを開くと幅が横長になるのを防ぐコンポです。
8番会議室 nifty:FDELPHI/MES/08/11271 Satobeさんの発言を元に作成
しました。Satobeさんに感謝します。
動作確認はDelphi4CSS、Delphi5Entで行いました。
使い方はTOpenDialogと同じです。TSaveDialogは継承元を替えるだけで
出来ると思いますが…(^^;
//=== ここから ========================================================
unit OpenDialogTest;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TOpenDialogTest = class(TOpenDialog)
private
Fod1HWND: HWND;
Fod1NewWProc, Fod1OldWProc: TFarProc;
Fod1Flag: Boolean;
Fod1Rect: TRect;
protected
procedure DoClose; override;
procedure DoShow; override;
procedure WndProc2(var Message: TMessage);
public
published
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TOpenDialogTest]);
end;
procedure TOpenDialogTest.DoClose;
begin
//サブクラス化解除
SetWindowLong(Fod1HWND, GWL_WNDPROC, Longint(Fod1OldWProc));
FreeObjectInstance(Fod1NewWProc);
inherited DoClose;
end;
procedure TOpenDialogTest.DoShow;
begin
inherited DoShow;
if ofOldStyleDialog in Self.Options
then Fod1HWND := Self.Handle
else Fod1HWND := GetParent(Self.Handle);
//元のサイズを取得しておく
GetWindowRect(Fod1HWND, Fod1Rect);
//サブクラス化
Fod1Flag := True;
Fod1NewWProc := MakeObjectInstance(WndProc2);
Fod1OldWProc := Pointer(GetWindowLong(Fod1HWND, GWL_WNDPROC));
SetWindowLong(Fod1HWND, GWL_WNDPROC, Longint(Fod1NewWProc));
end;
procedure TOpenDialogTest.WndProc2(var Message: TMessage);
var
pWinPos: PWindowPos;
Monitor: TMonitor;
begin
if Fod1Flag and
(Message.Msg = WM_WINDOWPOSCHANGING) then begin
pWinPos := PWindowPos(Message.LParam);
if (pWinPos^.flags and SWP_NOSIZE) = 0 then begin
Fod1Flag := False;
// 画面中央に移動
if Application.MainForm <> nil then
Monitor := Application.MainForm.Monitor
else
Monitor := Screen.Monitors[0];
pWinPos^.x := Monitor.Left +
((Monitor.Width - Fod1Rect.Right + Fod1Rect.Left) div 2);
pWinPos^.y := Monitor.Top +
((Monitor.Height - Fod1Rect.Bottom + Fod1Rect.Top ) div 3);
//強制的に元のサイズに
pWinPos^.cx := Fod1Rect.Right - Fod1Rect.Left;
pWinPos^.cy := Fod1Rect.Bottom - Fod1Rect.Top;
end;
end;
Message.Result := CallWindowProc(Fod1OldWProc,
Fod1HWND,
Message.Msg,
Message.WParam,
Message.LParam);
end;
end.
//=== ここまで ========================================================
2000/3/9(木) 03:20pm LDM03756 佐藤 充男
Original document by 佐藤 充男 氏 ID:(LDM03756)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|