-PR-
解決済み

コモンダイアログの表示位置

  • 暇なときにでも
  • 質問No.6582
  • 閲覧数1969
  • ありがとう数7
  • 気になる数0
  • 回答数3
  • コメント数0

コモンダイアログの「ファイルを開く」を実行すると
左上に表示されてしまいます。
大抵のソフトは中央に表示されていますが、どのよう
にすれば中央に表示されるのでしょうか。
どなたか教えて下さい。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル5

ベストアンサー率 66% (2/3)

bakaさんが示した方法以外では、ダミーのウィンドウを作り、そこにコモンダイアログを配置して、ダミーのウィンドウの方の表示位置を指定してやれば簡単に実現できます。
お礼コメント
noname#4956

簡単に実現できる方法を教えて頂き、ありがとうございました。
早速使わさせていただきました。
投稿日時 - 0000-00-00 00:00:00

その他の回答 (全2件)

  • 回答No.1

それって、単純にソフトの仕様なのではない
でしょうか。

フリーソフトやシェアウェアの場合、プログラムの
仕方次第で、ファイルダイアログの表示が、
画面中央にならない場合があります。

どうしても気になるというのであれば、
そのソフトの名前を補足していただければ、
確認してみますよ。ただし、市販ソフトの場合は、
購入しなければならないので、確認は
出来ません。
#持っていれば別ですが、そう偶然はないでしょう。

間違いがありましたらご指摘ください。
ではでは☆
お礼コメント
noname#4956

ソフトというのは未熟な私が作っている自作なのです。
確認していただけるという心尽くしに感謝しております。
ありがとうございました。
投稿日時 - 0000-00-00 00:00:00


  • 回答No.2
レベル7

ベストアンサー率 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
お礼コメント
noname#4956

ありがとうございました。
早速、サンプルプログラムを試みましたが強制終了してしまい実行できませんでした。(2度テストしました)
折角プログラムを組んでもらったのに残念です。
ご指摘通りシステムに問題があるみたいですね。
投稿日時 - 0000-00-00 00:00:00
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


抽選で合計100名様にプレゼント!

ピックアップ

ページ先頭へ