#. 함수원형
LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi);

#. BROWSEINFO 구조체
typedef struct _browseinfo
{
HWND hwndOwner; 윈도핸들
LPITEMIDLIST pidl; 나타낼 계층 구조상 루트
LPSTR pszDisplayName; 선택된 디스플레이네임 버퍼
LPCSTR lpszTitle; 트리위의 라벨의 문자열
UINT ulFlags; 윈도우 모양과 행동 설정
BFCALLBACK lpfn; 훅킹시 사용되는 콜밸
LPARAM lParam; 콜백에 전달될 파라미터
int iImage; 선택된 폴더나 파일의 아이콘 인덱스(시스템 이미지리스트)
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

#. 함수의 간단한 사용법
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = hwnd;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

TCHAR szPath[MAX_PATH] = {0};
SHGetPAthFromIDList(pidl, szPath);

#. 함수에 사용되는 플래그
BIF_RETURNONLYFSDIRS 디렉토리만 선택할 수 있다.
네트워크는 보여주기는 하되 선택할 수 없다.
BIF_DONTGOBELOWDOMAIN 해당도메인만 보이고 네트워크는 보이지 않는다.
BIF_STATUSTEXT 다이알로그 템플릿에 라벨이 들어있으며 임의의 텍스트 출력이 가능하다.
BIF_EDITBOX 폴더를 수동으로 선택하는 에디트 박스를 가진다. (쉘 버전 4.71이상에서 지원)
BIF_VALIDATE 잘못된 경로를 에디트했을 경우 경고 표시
BIF_BROWSEFORCOMPUTER 사용자 컴퓨터 이름만 선택가능
BIF_BROWSEFORPRINTER 프린터 이름만 선택가능
BIF_BROWSEINCLUDEFILES 파일이름도 보여준다. 이를 선택가능 (보통 폰트경로나 프린트 경로를 설정할 경우)

#. CALLBACK의 사용
int CALLBACK BrowseCallbackProc(
HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM dwData);

hwnd는 훅킹할 윈도핸들이고, uMsg는 전달되는 메시지이다.
lParam은 uMsg에 따라 다른 의미를 가지게 된다. dwData는 사용자 정의 데이터로 여러분이 VROWSEINFO 구조체의 lParam 멤버를 통해 지정한 것과 동일한 데이터이다.

우리가 감지할 수 있는 이벤트로는
1. BFFM_INITIALIZED - 대화상자가 초기화 완료
2. BFFM_SELCHANGED - 선택이 변경됨
3. BFFM_VALIDATEFAILED - 에디트박스에 부적절할값 입력

우리가 보낼 수 있는 메시지
1. BFFM_ENABLEOK - 확인 버튼 인에이블
2. BFFM_SETSELECTION - 지정된 파일이나 폴더를 선택
lParam에 PIDL이나 해당 경로가 들어가고
wParam에는 해석법이 들어있다. FALSE면 PIDL TRUE면 경로
BFFM_SETSTATUSTEXT 상태바에 텍스트를 임의로 넣는다.

#. 컨텍스트 메뉴버튼 없애기

BFFM_INITIALIZED 메시지에 대한 응답으로
DWORD dwStyle = GetWindowLong(hwnd, GET_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, dwStyle & ~WS_EX_CONTEXTHELP);

#. 대화 캡션 변경

BFFM_INITIALIZED 메시지에 대한 응답으로
SetWindowTExt(hwnd, 원하는 캡션);

#. 초기화 위치 바꾸기

BFFM_INITIALIZED 메시지에 대한 응답으로
RECT rc;
GetClientRect(hwnd, &rc);
SetWindowPos(hwnd, NULL, (GetSystemMetrics(SM_CXSCREEN)-(rc.right-rc.left))/2,
(GetSystemMetrics(SM_CYSCREEN)-(rc.bottom-rc.top))/2,
0, 0, SWP_NOZORDER | SWP_NOSIZE);

#. 상태 라벨에 경로명 넣기

BFFM_SELCHANGED 메시지에 대한 응답으로
TCHAR szText[MAX_PATH] = {0};
SHGetPathFromIDList(reinterpret_cast(lParam), szText);
SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, reinterpret_cast(szText));

첨부파일에는 두가지의 예제가 들어있다.
첫번째 파일은 Printers라는 가상 폴더를 루트로 하는
예제이고,
두번째는 일반적인 결로를 루트로하는 예제이다.

+ Recent posts