通用对话框
CFileDialog(BOOL , -, -, dwFlags, "x|x.x|", ParentWnd, dwsize , TRUE): m_ofn.lpstrTitle = _T("Title"); lpstrInitialDir = _T("C:\\"); lpstrFilter = _T("类型1\0*.txt\0类型2\0*.*\0\0"); nFilterIndex = 1; if(IDOK == fd.DoModal()) { //lpstrFile 返回值 GetPathName(); GetFileName\Ext(); //Flags |= OFN_AllowMultiSelect POSITION = GetStartPosition(); while(pos) { GetNextPathName(pos); } } Flags |= OFN_EnableTemplate; lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG); //IDD_DIALOG自定义对话框模板,Style要设为Child,其中一个控件ID设为1119(stc32),最好是PictureBox,透明不会自绘盖住CFileDialog Flags |= OFN_EnableHook; lpfnHook = fun; UINT CALLBACK fun(HWND , uiMsg, WPARAM, LPARAM ) { uiMsg == WM_NOTIFY; ((OFNotify *)LPARAM)->hdr.code == CDN_IncludeItem\SelChange; ((OFNotifyEx *)LPARAM)->pidl; SHGetPathFromIDList((LPC ItemIDList)pidl, char[]); }
API实现FileDialog
OPENFILENAME ofn; memset(&ofn, sizeof(OPENFILENAME)); ofn.lpstrFile = TCHAR[MAX_PATH]; //设置缓冲区接收返回结果 lpstrFile[0] = _T('\0'); //memset或置第一个字符为'\0' nMaxFile = MAX_PATH; hwndOwner = this->m_hWnd; hInstance = NULL; lStructSize = sizeof(OPENFILENAME); lpstrTitle = ""; lpstrInitialDir = ""; lpstrFilter = _T("文本文件\0*.txt\0所有文件\0*.*\0\0"); nFilterIndex = 1; Flags = 0; lpTemplateName = NULL; lpfnHook = NULL; bool = GetOpenFileName(&ofn); //API
文件夹对话框
BrowseInfo bi; memset(&bi, 0, sizeof(BROWSEINFO)); bi.hwndOwner; //HWND lpszTitle; //不是标题栏 pidlRoot = SHGetSpecialFolderLocation(null,CSIDL_xx,ItemIDList); ulFlags = BIF_ReturnOnlyfsDirs|BrowseIncludeFiles; pszDisplayName = TCHAR[]; //返回选中item名,不包括全部路径,基本不用 lpfn = pfun; //int CALLBACK (*)(hwnd, uiMsg, WPARAM , LPARAM ); lParam = (LPARAM)xx;//LPARAM ItemIDList = SHBrowseForFolder(&bi); //API DoModal 返回值也不是IDOK //返回必须由应用程序释放,它是调用IMalloc Interface来申请的,所以也通过这个Interface來释放 LPMALLOC pMalloc; //申请一个 IMalloc Interface if (SUCCEEDED(SHGetMalloc(&pMalloc))) { pMalloc->Free(pIDList); (void)pMalloc->Release(); } SHGetPathFromIDList(ItemIDList , TCHAR[]);
1