• ベストアンサー

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

コモンダイアログの「ファイルを開く」を実行すると 左上に表示されてしまいます。 大抵のソフトは中央に表示されていますが、どのよう にすれば中央に表示されるのでしょうか。 どなたか教えて下さい。

noname#4956
noname#4956

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

  • ベストアンサー
回答No.3

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

noname#4956
質問者

お礼

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

その他の回答 (2)

  • baka
  • ベストアンサー率83% (15/18)
回答No.2

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度テストしました) 折角プログラムを組んでもらったのに残念です。 ご指摘通りシステムに問題があるみたいですね。

noname#9414
noname#9414
回答No.1

それって、単純にソフトの仕様なのではない でしょうか。 フリーソフトやシェアウェアの場合、プログラムの 仕方次第で、ファイルダイアログの表示が、 画面中央にならない場合があります。 どうしても気になるというのであれば、 そのソフトの名前を補足していただければ、 確認してみますよ。ただし、市販ソフトの場合は、 購入しなければならないので、確認は 出来ません。 #持っていれば別ですが、そう偶然はないでしょう。 間違いがありましたらご指摘ください。 ではでは☆

参考URL:
どんなソフトの時になるのでしょうか。
noname#4956
質問者

お礼

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

関連するQ&A

  • コモンダイアログを表示したい

    Windows98/VisualBasic5.0を使用しています。 ファイル名を指定させるために、コモンダイアログを表示したいのですが方法がわかりません。 コントロールを貼り付ければよいのでしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • コモンダイアログの設定

    コモンダイアログを表示させると「読み取り専用ファイルとして開く」というチェックボックスがダイアログの下のほうに出ていますが、このチェックボックスを表示させないようにするにはどうすればいいのでしょうか? コモンダイアログはGetOpenFileName関数で表示させています。 また、APIを利用する上で参考になるサイトをご存知でしたら教えてください。

  • コモンダイアログからExcelへ

    コモンダイアログから既存のExcelファイルを表示させたいのですが、わかりません。 コモンダイアログの「開く」を押すとフルパスが取得されるというのは理解できたのですが、実際にプログラムをどう書いていいのかわかりません。 ファイルのパスを使うとはどういうことでしょうか? またshell関数をどう使えばいいのでしょうか? 基本的な質問で申し訳ありませんが、よろしくお願いします。

  • コモンダイアログコントロールの使い方

    お世話になっております。 VC++6.0でアプリ開発をしていますが、 コモンダイアログの使い方がわかりません。 ダイアログ上のボタンをクリックしたら 「ファイルを開く」のダイアログを表示させたいのですが。 ご回答よろしくお願いします。

  • コモンダイアログの表示

    VB.NETでエクセルをコントロールするS/Wを作っています保存時にコモンダイアログを表示させたいのですが、ツールBOXに見あたりません。どうすれば出てきますか。

  • コモンダイアログの表示座標

    フルスクリーンモードで、WinAPIの「GetOpenFileName」や 「GetSaveFileName」などのコモンダイアログを使用する際、 稀にダイアログが表示されない時がありました。 おそらくフルスクリーンモードで表示されている領域よりも外側に 表示されていると思うので、ダイアログを表示する座標を指定したいのですが、 その方法が分からず困っております。 ご存知の方いらっしゃいましたらお教えください、 宜しくお願い致します。

  • コモンダイアログのファイルを開くについて

    Windowsのファイルを開くダイアログで、ファイルを開くダイアログから エクセルファイルを選択し、開くボタンを押したら、選択された エクセルファイルを開きたいのですが、ヘルプで参照したところコモンダイアログ があるのを知りました。 ダイアログを開くところまでは、できたのですが、次にエクセルファイルを選択 し、開くボタンを押したときのイベントってどうやってとればよいのかわかりません。 開くボタンを押時に、選択されているパスを取りたいのですが、それもどうやって 取ればよいのやら、、、(+_+) ご教示ねがえませんでしょうか? よろしくお願いいたします。

  • リストボックスのリストをコモンダイアログを使って保存

    タイトルにあるようにリストボックスの内容をテキストファイルにコモンダイアログを使って保存したいのですが、どのようにするのでしょうか? ちなみにコモンダイアログの「名前をつけて保存」は表示させることが出来ます。 宜しくお願いします

  • コモンダイアログボックスの並び順が逆順になって戻らない。。

    OSは、Windows XP homeです。 いろいろなアプリケーションで 「ファイルを開く」や「名前をつけて保存」する時などに表示される 「コモンダイアログボックス」について質問です。 この「コモンダイアログボックス」、通常ならば表示したときに [名前の正順]でアイコンが並んでいると思うのですが、 これがなぜか、[名前の逆順]で表示されるようになってしまいました。 特定のアプリケーションだけでなく、全てのアプリケーションで同じ症状です。 いちいち、[右クリック]-[アイコンの整列]-[名前]で元に戻すのも 全アプリケーションで毎回となると手間に感じます。 どうすれば、以前のように「コモンダイアログボックス」が[名前の正順]で開かれるのでしょうか? ちなみに、一度[名前の正順]に戻しても、コモンダイアログボックスを開き直すと また[名前の逆順]表示に戻ってしまいます。 どうか直し方を教えてください、お願いします。

  • ダイアログの表示位置の保存

    MFCのダイアログベースでプロジェクトを作成し、 実行すると雛形のダイアログが画面中央に出現しますが、 このダイアログを任意の位置に動かし、ダイアログを閉じた後、 再実行した際に、前回終了時の位置に表示させるにはどのように実装すれば良いのでしょうか? なお、座標のデータなどは終了時にiniファイルに書き出しておき、 再起動時にそれを読み出す方法を考えています。 iniファイルへの読書きの方法については理解済みです。 お手数ですがご回答よろしくお願いします。 開発環境:VC++2005

専門家に質問してみよう