フォルダ参照ダイアログについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

フォルダ参照ダイアログについて

#1

投稿記事 by MoNoQLoREATOR » 14年前

単刀直入に、フォルダ参照ダイアログの使い方がわかりません。

とりあえず
http://homepage2.nifty.com/DSS/VCPP/API ... Folder.htm
というサイトのサンプルをコピペして、適当に所々修正して、なんとか表示させるところまでこぎつけました。

そのスパゲッティコードが以下です。

コード:

#include <shlobj.h>
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);				
	if(DxLib_Init() == -1) return(-1);
	



char *szClassName = "ClassName";
HWND hWnd = CreateWindow(szClassName,
        "windowsテンプレート",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hI,NULL);

BROWSEINFO	bi;
LPSTR		lpBuffer;
LPITEMIDLIST	pidlRoot;	// ブラウズのルートPIDL
LPITEMIDLIST	pidlBrowse;	// ユーザーが選択したPIDL
LPMALLOC	lpMalloc = NULL;


HRESULT hr = SHGetMalloc(&lpMalloc);
if(FAILED(hr)) return 0;

// ブラウズ情報受け取りバッファ領域の確保
if ((lpBuffer = (LPSTR) lpMalloc->Alloc(_MAX_PATH)) == NULL) return 0;
    // ダイアログ表示時のルートフォルダのPIDLを取得
    // ※以下はデスクトップをルートとしている。デスクトップをルートとする
    //   場合は、単に bi.pidlRoot に0を設定するだけでもよい。その他の特
    //   殊フォルダをルートとする事もできる。詳細はSHGetSpecialFolderLoca
    //   tionのヘルプを参照の事。

if (!SUCCEEDED(SHGetSpecialFolderLocation(	hWnd,
						CSIDL_DESKTOP,
                                                &pidlRoot	) )){ 
        lpMalloc->Free(lpBuffer);
        return 0;
}


// BROWSEINFO構造体の初期値設定
// ※BROWSEINFO構造体の各メンバの詳細説明もヘルプを参照
bi.hwndOwner = hWnd;
bi.pidlRoot = pidlRoot;
bi.pszDisplayName = lpBuffer;
bi.lpszTitle = "フォルダを選択して下さい";
bi.ulFlags = 0;
bi.lpfn = 0;
bi.lParam = 0;

// フォルダ選択ダイアログの表示 
pidlBrowse = SHBrowseForFolder(&bi);
if (pidlBrowse != NULL) {  
	// PIDL形式の戻り値のファイルシステムのパスに変換
	if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) {
            // 取得成功時の処理
                 
                 
                 
        }
        // SHBrowseForFolderの戻り値PIDLを解放
        lpMalloc->Free(pidlBrowse);
}

// クリーンアップ処理
lpMalloc->Free(pidlRoot); 
lpMalloc->Free(lpBuffer);
lpMalloc->Release();







	DxLib_End();
	return(0);
}
CreateWindowの部分は、HWNDのことがさっぱりわからないため、以前「windowsアプリケーションで文字入力BOX的なものを表示したい」という質問をしたときに教えていただいたコードから抜き出してきました。

一応動いたのですが、これでいいのでしょうか?
なんだかすっきりしません。
何が行われているのか全く理解できません。
どなたか一行一行説明していただけませんか?

よろしくお願いいたしますm(_ _)m

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: フォルダ参照ダイアログについて

#2

投稿記事 by みけCAT » 14年前

とりあえず、なぜこのコードでわざわざDXライブラリを使っているのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: フォルダ参照ダイアログについて

#3

投稿記事 by bitter_fox » 14年前

MoNoQLoREATOR さんが書きました:

コード:

char *szClassName = "ClassName";
HWND hWnd = CreateWindow(szClassName,
        "windowsテンプレート",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hI,NULL);


if (!SUCCEEDED(SHGetSpecialFolderLocation(	hWnd,
						CSIDL_DESKTOP,
                                                &pidlRoot	) ))

bi.hwndOwner = hWnd;
CreateWindowの部分は、HWNDのことがさっぱりわからないため、以前「windowsアプリケーションで文字入力BOX的なものを表示したい」という質問をしたときに教えていただいたコードから抜き出してきました。
SHGetSpecialFolderLocation関数及びその他諸々のウィンドウハンドルに対してCreateWindowで作成した新しいウィンドウハンドル使用しているようですが、DXライブラリが作成したウィンドウのハンドルを使うべきでしょう。
DXライブラリが作成したウィンドウのハンドルを取得するにはGetMainWindowHandle関数を使用します。
http://studiokingyo.fc2web.com/dxlib/ka ... hiyou.html

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: フォルダ参照ダイアログについて

#4

投稿記事 by MoNoQLoREATOR » 14年前

>>みけCATさん
ただ単純に私が無知だからです。DXライブラリさんに頼りきっていたためウインドウ関係のことはさっぱりわかりません。

>>bitter_foxさん
ありがとうございます。そんな関数があるとは知りませんでした。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: フォルダ参照ダイアログについて

#5

投稿記事 by MoNoQLoREATOR » 14年前

正常に表示されて、正常にDXライブラリを使う事もできました。
次は選択されたフォルダ名を受け取る処理を書こうと思います。またお世話になるかもしれませんがその折はよろしくお願いいたします。

閉鎖

“C言語何でも質問掲示板” へ戻る