スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ファルダ選択ダイアログ C/WinAPI

メモついでに、C/WinAPIでフォルダ(ディレクトリ)選択ダイアログの呼び出し方を記事にします。

そんで、フォルダ選択ダイアログってのはコレ
フォルダ選択ダイアログサムネ

長くなるので、続きへどうぞ。

 手順から説明します。

1."ObjBase.h"と"ShlObj.h"をインクルードする
2.プログラム開始時に"CoInitializeEx関数"を呼ぶ

3."BROWSEINFO構造体"に必要な情報を指定する
4."SHBrowseForFolder関数"でダイアログを開く
5."SHGetPathFromIDList関数"で4の戻り値からパスを取り出す
6."CoTaskMemFree関数"で確保されたメモリ領域を解放する

7.プログラム終了時に"CoUninitialize関数"を呼ぶ

 この順番で説明に入ります。
 何度もフォルダ選択ダイアログを呼び出す場合は3~6の手順を繰り返せばいいです。
1、2、7は一度だけです。
 それから、動作テスト時の開発環境はWindowsVista+VC++2010です。


 "ObjBase.h"と"ShlObj.h"は、今回使用する構造体や関数の宣言されたヘッダーファイルです。


 CoInitializeEx関数はCOMと言う物の初期化をします。
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);

とプログラムの最初で一回だけ呼び出して下さい。
引数については説明しません。気になるなら各自で調査せよ。


 次にBROWSEINFO構造体です。
この構造体がフォルダ選択ダイアログの設定になります。
BROESEINFO binfo;

//構造体を0で初期化
ZeroMemory(&binfo,sizeof(BROWSEINFO));

binfo.hwndOwner =hWnd; //呼び出し元のウインドウハンドル
binfo.lpszTitle =TEXT("保存先の選択"); //ダイアログに表示される文字列
//ダイアログのスタイル↓
binfo.ulFlags =BIF_USENEWUI | BIF_RETURNONLYFSDIRS;

最初にゼロクリアしておきます。あとはコメント通りです。
 ダイアログのスタイルの意味は
BIF_USENEWUI:新しいスタイルのダイアログ
BIF_RETURNONLYFSDIRS:フォルダ(ディレクトリ)のみを返す
です。
 他にも指定可能なフラグがここにあるので参照してみてください。


いよいよダイアログを開く関数です。
LPITEMIDLIST idlist;
idlist=SHBrowseForFolder(&binfo);

LPITEMLISTは構造体へのポインタです。気にせず、これに選択されたフォルダへのパスが入るのだな、と思ってください。
 SHBrowseForFolder関数の引数に指定するのはBROWSEINFO構造体へのアドレス(ポインタ)です。
例では、先程のbinfoのアドレスを指定しています。
 この関数の戻り値は失敗の場合NULLが返ります。フォルダが選択されない場合もです。


 SHGetPathFormIDList関数はSHBrowseForFolder関数の戻り値からフォルダ(ディレクトリ)のパスを取り出してくれます。
TCHAR path[MAX_PATH];
SHGetPathFormIDList(idlist,path);

 第一引数にはITEMIDLISTのアドレス。
 第二引数には選択されたフォルダのパスを格納するバッファへのポインタを指定します。このバッファは最低でも260字格納できるサイズでないといけない。


 あとは、後始末です。
CoTaskMemFree(idlist);

 これで、自動的に確保されたメモリが解放されます。


 最後、プログラム終了時にCOMの後始末をします。
初期化したら後始末。覚えときましょう。
CoUninitialize();


手順を通したソースがコレです。
#include<Windows.h>
#include<ObjBase.h>
#include<ShlObj.h>
#include<stdio.h>
#include<stdlib.h>

void main(void)
{
BROWSEINFO binfo;
LPITEMIDLIST idlist=NULL;
TCHAR dir[MAX_PATH];

CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);//COMの初期化

ZeroMemory(&binfo,sizeof(BROWSEINFO)); //ゼロクリア
binfo.hwndOwner=NULL; //オーナーウインドウが無いのでNULL
binfo.lpszTitle=TEXT("フォルダの選択");
binfo.ulFlags =BIF_USENEWUI | BIF_RETURNONLYFSDIRS;

idlist=SHBrowseForFolder(&binfo); //ダイアログを開く
if(idlist==NULL)exit(1); //エラー

SHGetPathFromIDList(idlist,dir); //フォルダパスをdirに格納する。
CoTaskMemFree(idlist); //解放

CoUninitialize(); //COMの後始末

//結果の表示
printf("選択されたフォルダのパス \"%s\"\n",dir);

getchar();
}


参考までに、どうぞ。

※間違っている箇所や更新情報があった場合、コメントしてくれると助かります。
  1. 2011/02/20(日) 01:59:23|
  2. プログラミング
  3. | Track back:0
  4. | Comment:1

Comment

No.292

田辺修二と申します。
コンピューター関連のサイトとしてとても質の高いサイトですね。
HDD(ハードディスク)のデータ管理の解説サイトを運営しているのですが、よろしければ、
相互リンクしていただけないでしょうか?

名前...HDD修復・HDD修理・故障対策
url...http://hdd-data-hukkyuu.com/
紹介url...http://hdd-data-hukkyuu.com/hdd_links2.php
説明・・・HDD(ハードディスク)のデータ管理のためのサイトです。

よろしければ、ご検討お願いします。
  1. 2011/03/17(木) 20:44:46 |
  2. URL |
  3. No Name #-
  4. [ Edit]

Post a comment

Only display to administrator.

Track back

Track Back URL
Track Back to this post(FC2 blog user)