- ベストアンサー
コモンダイアログの表示位置
コモンダイアログの「ファイルを開く」を実行すると 左上に表示されてしまいます。 大抵のソフトは中央に表示されていますが、どのよう にすれば中央に表示されるのでしょうか。 どなたか教えて下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
bakaさんが示した方法以外では、ダミーのウィンドウを作り、そこにコモンダイアログを配置して、ダミーのウィンドウの方の表示位置を指定してやれば簡単に実現できます。
その他の回答 (2)
- baka
- ベストアンサー率83% (15/18)
Windows の仕様のようです。 まともな方法では無理だと思いますので、 諦めた方がよろしいでしょう。 一応試しに作ってはみましたが、決してお勧めしません。 ダイアログの位置を変えると、アプリを起動し直すまで その位置が確保されてしまう中途半端なものです。 サブクラス化に関しては、私自身ヘルプを参考に 作っただけで、コードの意味を熟知しておらず、 どんな弊害があるか知れません。もし実行される際は 十分注意してください。甚だ無責任ですが... (動作確認は VB 6 & Win 98) *フォームモジュールへ (オブジェクト名は "Form1" のままで、 CommonDialog コントロールおよび CommandButton コントロールを貼り付けてください。) Option Explicit Private Sub Form_Load() ghWnd = Me.hWnd CommonDialog1.DialogTitle = "ファイルを開く" End Sub Private Sub Command1_Click() Hook CommonDialog1.ShowOpen Unhook End Sub *標準モジュールへ Option Explicit Private Const GWL_WNDPROC = -4 Private Const WM_WINDOWPOSCHANGED = &H47 Private Const SWP_NOSIZE = &H1 Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long Global ghWnd As Long Global lpPrevWndProc As Long Private blnOver As Boolean Public Sub Hook() lpPrevWndProc = SetWindowLong(ghWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Sub Unhook() SetWindowLong ghWnd, GWL_WNDPROC, lpPrevWndProc End Sub Private Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_WINDOWPOSCHANGED Then SetDialogPos WindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, lParam) End Function Private Sub SetDialogPos() Dim hWnd As Long Dim RECT As RECT Dim X As Long Dim Y As Long If blnOver Then Exit Sub hWnd = FindWindow(vbNullString, Form1.CommonDialog1.DialogTitle) If hWnd = 0 Then Exit Sub GetWindowRect hWnd, RECT With RECT X = .Right - .Left Y = .Bottom - .Top End With With Screen X = (.Width / .TwipsPerPixelX - X) / 2 Y = (.Height / .TwipsPerPixelY - Y) / 2 End With SetWindowPos hWnd, ghWnd, X, Y, 0, 0, SWP_NOSIZE blnOver = True Unhook End Sub
お礼
ありがとうございました。 早速、サンプルプログラムを試みましたが強制終了してしまい実行できませんでした。(2度テストしました) 折角プログラムを組んでもらったのに残念です。 ご指摘通りシステムに問題があるみたいですね。
それって、単純にソフトの仕様なのではない でしょうか。 フリーソフトやシェアウェアの場合、プログラムの 仕方次第で、ファイルダイアログの表示が、 画面中央にならない場合があります。 どうしても気になるというのであれば、 そのソフトの名前を補足していただければ、 確認してみますよ。ただし、市販ソフトの場合は、 購入しなければならないので、確認は 出来ません。 #持っていれば別ですが、そう偶然はないでしょう。 間違いがありましたらご指摘ください。 ではでは☆
- 参考URL:
- どんなソフトの時になるのでしょうか。
お礼
ソフトというのは未熟な私が作っている自作なのです。 確認していただけるという心尽くしに感謝しております。 ありがとうございました。
お礼
簡単に実現できる方法を教えて頂き、ありがとうございました。 早速使わさせていただきました。