とりあえず
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);
}
一応動いたのですが、これでいいのでしょうか?
なんだかすっきりしません。
何が行われているのか全く理解できません。
どなたか一行一行説明していただけませんか?
よろしくお願いいたしますm(_ _)m