[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/02/05(Mon) 10:20
投稿者名:Edward
Eメール:
URL :
タイトル:
SHBrowseForFolderに[新しいフォルダ]ボタン
 SHBrowseForFolderを使ってフォルダ選択をダイアログを表示させています
選択作業中のフォルダをステータス欄(BIF_STATUSTEXT = &H4)に表示させているのですが
[新しいフォルダ(N)]ボタンも追加したくなりました。ulFlagsにBIF_NEWDIALOGSTYLE &H40を
追加するとボタンも追加されたのですが。ステータス欄が使えなくなりました。
旧ダイアログスタイルでも構わないのですが。ボタンだけを追加しステータス欄と
共に使用する事って出来ないものでしょうか?

何方か御指導下さいますよう宜しくお願いいたします。

投稿時間:2007/02/05(Mon) 15:56
投稿者名:K.J.K.
Eメール:
URL :
タイトル:
Re: SHBrowseForFolderに[新しいフォルダ]ボタン
おそらく、フックしてから強引にステータス欄を作り各種処理する、
ぐらいしかないのでは。

投稿時間:2007/02/05(Mon) 16:45
投稿者名:Edward
Eメール:
URL :
タイトル:
Re^2: SHBrowseForFolderに[新しいフォルダ]ボタン
K.J.K.様
御意見有難う御座います。
> おそらく、フックしてから強引にステータス欄を作り各種処理する、
> ぐらいしかないのでは。

ステータスのコントロール自体がNewDialogStyleに
なると無いのかなと感じています。
外見上、ステータス欄が有ったスペースは
より広くなっているのですけどね。
そこで、その上のタイトルに書く文字列に
vbCrLfを入れて2行や3行にした場合
旧スタイルではステータスの有った場所に
文字列が入るようになりますね。
そこで、動的にタイトル文字列を変更出来ない
ものかと、今は企んでいます。
何方か経験が有る方いらっしゃいましたら
御指導下さい。宜しくお願いいたします。

また、気が付いたのですが旧スタイルではulFlagsに
BIF_RETURNONLYFSDIRS(&H1)を指定すると。フォルダ
のみ表示され。[マイ コンピュータ]等実体の無い項目を
選んでも[OK]ボタンは使用不可状態でしたが。
BIF_RETURNONLYFSDIRS Or BIF_NEWDIALOGSTYLEとすると
[マイ コンピュータ]を選んでも[OK]ボタンは使用可能
状態になってしまうんですね。
これも旧スタイルの様に[マイ コンピュータ]を選んで
いる状態では[OK]ボタンは使用不可に出来ないもので
しょうか?
BIF_NEWDIALOGSTYLEにすると[新しいフォルダ(N)]ボタンが
使えるようになるのは良いのですが。
解決出来ない不都合さも出てきて困っています。
皆さんは、どう解決していますか?

投稿時間:2007/02/05(Mon) 18:09
投稿者名:K.J.K.
Eメール:
URL :
タイトル:
Re^3: SHBrowseForFolderに[新しいフォルダ]ボタン
> ステータスのコントロール自体がNewDialogStyleに
> なると無いのかなと感じています。

感じるも何も、
http://msdn2.microsoft.com/en-us/library/ms538017.aspx
より、
> BIF_STATUSTEXT
> (略) This flag is not supported when BIF_NEWDIALOGSTYLE is specified.
と書いてありますよね。

> そこで、動的にタイトル文字列を変更出来ない
> ものかと、今は企んでいます。

コールバックを用意して、BFFM_INITIALIZEDを受け取ったときにAPI関数を
使って該当するStaticコントロールのTextを書き換えるとか。

> これも旧スタイルの様に[マイ コンピュータ]を選んで
> いる状態では[OK]ボタンは使用不可に出来ないもので
> しょうか?

コールバックを用意して、BFFM_SELCHANGEDを受け取ったときにAPI関数を
用いるなどしてファイルシステムのものであるのかを判断し、BFFM_ENABLEOK
をSendMessageして使用可能/不可を切り替えるとか。

投稿時間:2007/02/06(Tue) 17:01
投稿者名:Edward
Eメール:
URL :
タイトル:
Re^4: SHBrowseForFolderに[新しいフォルダ]ボタン
K.J.K.様
御指導有難う御座います。

> コールバックを用意して、BFFM_SELCHANGEDを受け取ったときにAPI関数を
> 用いるなどしてファイルシステムのものであるのかを判断し、BFFM_ENABLEOK
> をSendMessageして使用可能/不可を切り替えるとか。
これは、私も同じ事を企んでいました。フォルダ名が取得出来なかった時は
Call SendMessage(hwnd, BFFM_ENABLEOK, 0, ByVal 0&)
して実現出来ました。使用可能状態へは勝手に戻してくれるようです。

> コールバックを用意して、BFFM_INITIALIZEDを受け取ったときにAPI関数を
> 使って該当するStaticコントロールのTextを書き換えるとか。
元々は、BFFM_SELCHANGEDを受取った時、現在選ばれているフォルダの
フルパスをステータスに表示していました。
同じような事をしたいのですが、タイトルのID(?、メッセージの送り先)って
どうしたら特定出来ますでしょうか?

経験の有る方、御指導下さいますよう。よろしくお願いいたします。

投稿時間:2007/02/06(Tue) 17:28
投稿者名:K.J.K.
Eメール:
URL :
タイトル:
Re^5: SHBrowseForFolderに[新しいフォルダ]ボタン
> 同じような事をしたいのですが、タイトルのID(?、メッセージの送り先)って
> どうしたら特定出来ますでしょうか?

表示されてから、API関数を用いて列挙し、該当するものを探すとか。
# おそらくは、Spy++などを使って調べたIDの決めうちでもいけるとは
# 思いますが。

投稿時間:2007/02/14(Wed) 15:36
投稿者名:Edward
Eメール:
URL :
タイトル:
Re^6: SHBrowseForFolderに[新しいフォルダ]ボタン
以下の様な事をやっております。

BIF_NEWDIALOGSTYLE設定時のOKボタンのEnabled設定は
BFFM_SELCHANGEDイベントの中で以下の様な記述で出来たのですが
このイベント内でタイトルも変更したいと考えているのですが
難儀しております。何方か御指導いただけますようよろしくお願いいたします。

****.frm
Private Sub cmdFolder_Click()
    Dim szPath As String
    szPath = BrowseForFolder(txtPath.Text, Me.hWnd, "保存先")
End Sub

***.mod
Public Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal lpszPath As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Private Const MAX_PATH = 260
Private Const BIF_RETURNONLYFSDIRS As Long = &H1        'only file system directories
Private Const BIF_STATUSTEXT       As Long = &H4        'include status area for callback
Private Const BIF_NEWDIALOGSTYLE   As Long = &H40       'use the new dialog layout
Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED = 2
Private Const BFFM_SETSTATUSTEXTA = (WM_USER + 100)
Private Const BFFM_ENABLEOK = (WM_USER + 101)
Private Const BFFM_SETSELECTIONA = (WM_USER + 102)

Private Type BrowseInfo
    hwndOwner      As Long
    pIDLRoot       As Long
    pszDisplayName As String
    lpszTitle      As String
    ulFlags        As Long
    lpfn           As Long
    lParam         As Long
    iImage         As Long
End Type

Public Function BrowseForFolder(DefaultFolder As String, Parent As Long, Caption As String) As String
    Dim bi As BrowseInfo
    Dim sResult As String, nResult As Long

    bi.hwndOwner = Parent
    bi.pIDLRoot = 0
    bi.pszDisplayName = String$(MAX_PATH, Chr$(0))
    bi.lpszTitle = Caption
    bi.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_NEWDIALOGSTYLE
    bi.lpfn = GetAddress(AddressOf BrowseCallbackProc)
    bi.lParam = 0
    bi.iImage = 0

    nResult = SHBrowseForFolder(bi)
    If nResult <> 0 Then
        sResult = String(MAX_PATH, 0)
        If SHGetPathFromIDList(nResult, sResult) Then
            BrowseForFolder = Left$(sResult, InStr(sResult, Chr$(0)) - 1)
        End If
        CoTaskMemFree nResult
    End If
End Function

Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
    Dim strBuffer       As String
    Dim lngResult       As Long

    Select Case uMsg
    Case BFFM_INITIALIZED

    Case BFFM_SELCHANGED
        strBuffer = String(MAX_PATH + 1, vbNullChar)
        ' 現在選択されているフォルダのパスを得る。
        lngResult = SHGetPathFromIDList(lParam, strBuffer)
        If lngResult <> 0 Then  'フォルダを選んでいる場合
        Else                    'フォルダ以外を選んでいる場合、OKボタンを使用不可にする。
            Call SendMessage(hWnd, BFFM_ENABLEOK, 0, ByVal 0&)
        End If
    End Select
End Function

Private Function GetAddress(nAddress As Long) As Long
    GetAddress = nAddress
End Function

投稿時間:2007/02/14(Wed) 16:11
投稿者名:K.J.K.
Eメール:
URL :
タイトル:
Re: SHBrowseForFolderに[新しいフォルダ]ボタン
試していないけど、こんな感じでは。

Private Declare Function SetDlgItemText Lib "user32.dll" Alias "SetDlgItemTextA" _
(ByVal hDialog As Long, ByVal ControlID As Long, ByVal NewText As String) As Long

Call SetDlgItemText(hWnd, &H3742&, "ダイアログのタイトル" & vbNewLine & strBuffer)

投稿時間:2007/02/14(Wed) 16:24
投稿者名:Edward
Eメール:
URL :
タイトル:
Re^2: SHBrowseForFolderに[新しいフォルダ]ボタン
K.J.K.様
相変わらず、素早い反応有難う御座います。
無事に動作しております。
有難う御座います。

> 試していないけど、こんな感じでは。
>
> Private Declare Function SetDlgItemText Lib "user32.dll" Alias "SetDlgItemTextA" _
> (ByVal hDialog As Long, ByVal ControlID As Long, ByVal NewText As String) As Long
>
> Call SetDlgItemText(hWnd, &H3742&, "ダイアログのタイトル" & vbNewLine & strBuffer)