16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"コモンダイアログの表示位置を変更"
この発言に対し以下のコメントが寄せられています
#00491 Satobe さん RE:コモンダイアログの表示位置を変更
◆解説
TOpenDialogの表示位置を自由に設定する例です。
TOpenDialogの OnShowイベントで取得したダイアログのハンドルを利用
して動的にサブクラス化を行い、WM_WINDOWPOSCHANGINGメッセージを捕
まえることで、表示位置を設定します。
◆動作確認
Delphi3.1 + Win95a
◆例
Form1に OpenDialog1 と Button1 を置いて下さい。
----- ここから -----
type
TForm1 = class(TForm)
...省略
private
{ Private 宣言 }
FOpenDialog1hWnd: HWND;
FNewOpenDialog1WndProc, FOldOpenDialog1WndProc: TFarProc;
FOpenDialog1MoveFlag: Boolean;
procedure OpenDialog1WndProc(var Message: TMessage);
public
...省略
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
//[ファイルを開く]ダイアログボックスを表示する
OpenDialog1.Execute;
end;
//OpenDialog1 OnShowイベント
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
FOpenDialog1hWnd := GetParent((Sender as TOpenDialog).Handle);
//動的サブクラス化
FOpenDialog1MoveFlag := False; //位置調整していない
FNewOpenDialog1WndProc := MakeObjectInstance(OpenDialog1WndProc);
FOldOpenDialog1WndProc := Pointer(GetWindowLong(FOpenDialog1hWnd,
GWL_WNDPROC));
SetWindowLong(FOpenDialog1hWnd, GWL_WNDPROC,
Longint(FNewOpenDialog1WndProc));
end;
//OpenDialog1 OnCloseイベント
procedure TForm1.OpenDialog1Close(Sender: TObject);
begin
//動的サブクラス化を解除する
SetWindowLong(FOpenDialog1hWnd, GWL_WNDPROC,
Longint(FOldOpenDialog1WndProc));
FreeObjectInstance(FNewOpenDialog1WndProc);
FOpenDialog1hWnd := HWND(nil); //←これらは
FNewOpenDialog1WndProc := nil; //←必要ないかも知れないけど
FOldOpenDialog1WndProc := nil; //← 念のため
end;
//OpenDialog1の新しいウィンドウプロシージャ
procedure TForm1.OpenDialog1WndProc(var Message: TMessage);
var
pWinPos: PWindowPos;
DeskTop,rc: TRect;
begin
if (Message.Msg = WM_WINDOWPOSCHANGING) and
(FOpenDialog1MoveFlag = False) then begin
FOpenDialog1MoveFlag := True; //位置調整を行った
pWinPos := PWindowPos(Message.LParam);
//タスクバーを除いた画面の領域を取得
SystemParametersInfo(SPI_GETWORKAREA, 0, @DeskTop, 0);
//↓ここで表示位置(ダイアログの左上)を
// スクリーン座標で設定する
//(右下に表示する例)
GetWindowRect(FOpenDialog1hWnd, rc);
pWinPos^.x := DeskTop.Right - (rc.Right - rc.Left); //(*)
pWinPos^.y := DeskTop.Bottom- (rc.Bottom- rc.Top); //(*)
//(↓左上に表示するなら)
//pWinPos^.x := DeskTop.Left;
//pWinPos^.y := DeskTop.Top;
end;
Message.Result := CallWindowProc(FOldOpenDialog1WndProc,
FOpenDialog1hWnd,
Message.Msg,
Message.WParam,
Message.LParam);
end;
end.
----- ここまで -----
(*)部で代入する値を変えることで、自由に表示位置を設定できます。
#くれぐれも画面からはみ出してしまうような設定はしないでね。(^^;
98/04/11(土) 22:50 Satobe(JCG00336)
Original document by Satobe 氏 ID:(JCG00336)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|