16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:コモンダイアログの表示位置を変更"
この発言は #00490 Satobe さんのコモンダイアログの表示位置を変更 に対するコメントです
この発言に対し以下のコメントが寄せられています
#00945 Satobe さん RE^2:コモンダイアログの表示位置を変更
TOpenDialog.Options プロパティで、ofOldStyleDialog が True に
設定されていた場合に、表示位置の変更が働きませんでした。m(_`_)m
----- 修正版 -----
//OpenDialog1 OnShowイベント
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
if ofOldStyleDialog in (Sender as TOpenDialog).Options then
FOpenDialog1hWnd := (Sender as TOpenDialog).Handle
else
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の新しいウィンドウプロシージャ
procedure TForm1.OpenDialog1WndProc(var Message: TMessage);
var
pWinPos: PWindowPos;
DeskTop,rc: TRect;
begin
if (Message.Msg = WM_WINDOWPOSCHANGING) and
(FOpenDialog1MoveFlag = False) then begin
pWinPos := PWindowPos(Message.LParam);
pWinPos^.flags := pWinPos^.flags and not(SWP_NOMOVE);
FOpenDialog1MoveFlag := True; //位置調整を行った
//↓ここで表示位置(ダイアログの左上)を
// スクリーン座標で設定する
//(右下に表示する例)
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;
上記、OpenDialog1Show と OpenDialog1WndProc 以外は、前回のまま
でokです。
98/04/12(日) 01:33 Satobe(JCG00336)
Original document by Satobe 氏 ID:(JCG00336)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|