C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: FolderBrowserDialogフォームの中央に表示


(過去ログ 85 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■50302 / inTopicNo.1)  FolderBrowserDialogフォームの中央に表示
  
□投稿者/ Yuuta (5回)-(2010/06/03(Thu) 11:37:35)

分類:[VB.NET/VB2005 以降] 

使用言語:VB2005SP1

ご教授下さい

FolderBrowserDialogですが
オーナーフォーム(Dialogを呼び出したフォーム)の中央に
表示する事はできるのでしょうか?
デフォルトでWindows画面の中央に表示されるようなのですが…

フォームのようにStartPositionのような設定はないのでしょうか?

引用返信 編集キー/
■50400 / inTopicNo.2)  Re[1]: FolderBrowserDialogフォームの中央に表示
□投稿者/ やじゅ (1630回)-(2010/06/06(Sun) 07:30:55)
やじゅ さんの Web サイト
2010/06/06(Sun) 07:34:57 編集(投稿者)

No50302 (Yuuta さん) に返信
> FolderBrowserDialogですが
> オーナーフォーム(Dialogを呼び出したフォーム)の中央に
> 表示する事はできるのでしょうか?
> デフォルトでWindows画面の中央に表示されるようなのですが…
>
> フォームのようにStartPositionのような設定はないのでしょうか?

FolderBrowserDialogもCommonDialogを継承していますので、常に画面中央に表示される仕様のようです。

任意の位置に変更するには、下記サイトのようにする必要がありそうです。
C#になってしまいますが、ColorDialog コントロールを任意の位置に表示する
http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm#ColorDialog
HookProc メソッドをオーバーライド
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.commondialog.hookproc(VS.71).aspx
引用返信 編集キー/
■50405 / inTopicNo.3)  Re[2]: FolderBrowserDialogフォームの中央に表示
□投稿者/ なちゃ (443回)-(2010/06/06(Sun) 13:57:27)
FolderBrowserDialogはsealedなので継承してカスタマイズは出来ないですよ。

引用返信 編集キー/
■50406 / inTopicNo.4)  Re[3]: FolderBrowserDialogフォームの中央に表示
□投稿者/ やじゅ (1632回)-(2010/06/06(Sun) 18:29:13)
やじゅ さんの Web サイト
No50405 (なちゃ さん) に返信
> FolderBrowserDialogはsealedなので継承してカスタマイズは出来ないですよ。

ああ、NotInheritable(sealed)で継承できないですね、見逃してました。
下記サイトを参考にVB.NETに書き換えてみました。
http://rararahp.cool.ne.jp/cgi-bin/lng/dotnet/dotnetlng.cgi?print+200609/06090001.txt

Imports System.Threading
Imports System.Runtime.InteropServices

Public Class Win32API

    <StructLayout(LayoutKind.Sequential)> _
       Public Structure RECT
        Public left As Integer
        Public top As Integer
        Public right As Integer
        Public bottom As Integer
    End Structure

    <DllImport( _
        "user32.dll", _
        CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Public Shared Function FindWindow( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As IntPtr
    End Function

    <DllImport("user32.dll")> _
    Public Shared Function SetWindowPos(ByVal hWnd As IntPtr, _
          ByVal hWndInsertAfter As IntPtr, ByVal x As Integer, ByVal y As Integer, _
          ByVal width As Integer, ByVal height As Integer, _
          ByVal flags As Integer) As UInt32
    End Function

    <DllImport("user32.dll")> _
       Public Shared Function GetWindowRect(ByVal hwnd As IntPtr, _
       ByRef lpRect As RECT) As Integer
    End Function

    Public Const SWP_NOSIZE As Integer = 1

End Class

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim threadA As New Thread(New ThreadStart(AddressOf ThreadMethod))  
        threadA.Start()

        'FolderBrowserDialogクラスのインスタンスを作成
        Dim fbd As New FolderBrowserDialog

        '上部に表示する説明テキストを指定する
        fbd.Description = "フォルダを指定してください。"
        'ルートフォルダを指定する
        'デフォルトでDesktop
        fbd.RootFolder = Environment.SpecialFolder.Desktop
        '最初に選択するフォルダを指定する
        'RootFolder以下にあるフォルダである必要がある
        fbd.SelectedPath = "C:\Windows"
        'ユーザーが新しいフォルダを作成できるようにする
        'デフォルトでTrue
        fbd.ShowNewFolderButton = True

        'ダイアログを表示する
        If fbd.ShowDialog(Me) = DialogResult.OK Then
            '選択されたフォルダを表示する
            Console.WriteLine(fbd.SelectedPath)
        End If

    End Sub

    Private Sub ThreadMethod()

        Dim hWnd As IntPtr
        Dim winRect As Win32API.RECT
        Dim pt As System.Drawing.Point

        Do
            hWnd = Win32API.FindWindow(Nothing, "フォルダの参照")
        Loop While (hWnd = IntPtr.Zero)

        'フォルダ参照ダイアログのサイズを取得
        Win32API.GetWindowRect(hWnd, winRect)

        pt = New Point(Me.Location.X + (Me.Width - (winRect.right - winRect.left)) \ 2, _
                       Me.Location.Y + (Me.Height - (winRect.bottom - winRect.top)) \ 2)

        'フォルダ参照ダイアログの位置をオーナーフォームの中央にする
        Win32API.SetWindowPos(hWnd, IntPtr.Zero, pt.X, pt.Y, 0, 0, Win32API.SWP_NOSIZE)

    End Sub

End Class

引用返信 編集キー/
■50407 / inTopicNo.5)  Re[4]: FolderBrowserDialogフォームの中央に表示
□投稿者/ Azulean (565回)-(2010/06/06(Sun) 19:44:11)
この手のもので無限ループを作ることはやめるべきです。
OS のバージョンアップ、言語パックなどのリソースのインストール状況、表示言語の設定によって、脱出不可能になるからです。
無限ループでなく、一定の脱出条件を別に設けていれば、最悪フリーズはしません。(やりたいことはできていなくても、致命的な事態を避けられる)

なお、このサンプルは Windows 7 で動作しません。
理由は「フォルダーの参照」というように、伸ばし音が入っているからです。
引用返信 編集キー/
■50408 / inTopicNo.6)  Re[5]: FolderBrowserDialogフォームの中央に表示
□投稿者/ Azulean (566回)-(2010/06/06(Sun) 19:48:20)
さて、元の質問に関してですが、どうしてもやりたいのでしょうか?

後付けで加える動作となるため、ウィンドウを探し出したり、フックしたりして、無理矢理位置を変えることになります。
OS の仕様変更などの要因で、あっさり動作しなくなることもありますし、手間(費用)がかかる割に得られる効果は少ないと思っています。


# 正攻法は BrowseCallbackProc でウィンドウ位置を変えることかな?未確認です。
引用返信 編集キー/
■50410 / inTopicNo.7)  Re[5]: FolderBrowserDialogフォームの中央に表示
□投稿者/ やじゅ (1633回)-(2010/06/06(Sun) 21:01:31)
やじゅ さんの Web サイト
No50407 (Azulean さん) に返信
> この手のもので無限ループを作ることはやめるべきです。

そげですね、だんだん。(by ゲゲゲの女房)

> なお、このサンプルは Windows 7 で動作しません。
> 理由は「フォルダーの参照」というように、伸ばし音が入っているからです。

なるほど、長音表記の変更の影響が出てるわけですね。

マイクロソフト製品ならびにサービスにおける外来語カタカナ用語末尾の長音表記の変更について
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3491
引用返信 編集キー/
■50432 / inTopicNo.8)  Re[6]: FolderBrowserDialogフォームの中央に表示
□投稿者/ Yuuta (6回)-(2010/06/07(Mon) 10:50:54)
やじゅ様、なちゃ様、Azulean様、返信ありがとうございました

マイクロソフトが提供するダイアログ等、VB6のときよりも格段に使いやすくなっていますが
微妙に痒い所に手が届かないですよね、ダイアログなのだから、むしろオーナーフォームの
中央の方が使い勝手がいいと思うのですが、画面中央なら引数等を引き渡さなくても
いいからなのでしょうかね?

今回の件ですが、無理にでも、このダイアログを使用したい訳ではなく
使えれば、後からプログラムを見る人の為に簡素化できていいかな?ぐらいに
思っていたので、フォルダーを選択するフォームを1つ作ろうかと思います

また、表示位置にこだわらなければ、こちらのダイアログも使っていこうかと思います

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -