在控制台下打开对话框?!没错,这是完全可以的,实现起来也是相当简单,基本上连雕虫小技都不算。不过网上这样的例子还不是很多,我就把自己写的一个demo贴上来。参考了大名鼎鼎的《windows程序设计》中的一点代码。
- #include <Windows.h>
- #include <CommDlg.h>
- #include <iostream>
-
- using namespace std;
-
- static OPENFILENAME ofn ;
-
- void PopFileInitialize (HWND hwnd)
- {
- static TCHAR szFilter[] = TEXT ("所有图片文件\0*.bmp;*.dib;*.jpg;*.jpeg;*.jpe;*.gif;*.tiff;*.png;*.ico\0") \
- TEXT ("JPEG文件 (*.jpg;*.jpeg;*.jpe)\0*.jpg;*.jpeg;*.jpe\0") \
- TEXT ("位图文件 (*.bmp;*.dib)\0*.bmp;*.dib\0") \
- TEXT ("GIF (*.gif)\0*.gif\0") \
- TEXT ("TIFF (*.tiff)\0*.tiff") \
- TEXT ("PNG (*.png)\0*.png") \
- TEXT ("ICO (*.ico)\0*.ico\0\0");
-
- ofn.lStructSize = sizeof (OPENFILENAME) ;
- ofn.hwndOwner = hwnd ;
- ofn.hInstance = NULL ;
- ofn.lpstrFilter = szFilter ;
- ofn.lpstrCustomFilter = NULL ;
- ofn.nMaxCustFilter = 0 ;
- ofn.nFilterIndex = 0 ;
- ofn.lpstrFile = NULL ; // Set in Open and Close functions
- ofn.nMaxFile = MAX_PATH ;
- ofn.lpstrFileTitle = NULL ; // Set in Open and Close functions
- ofn.nMaxFileTitle = MAX_PATH ;
- ofn.lpstrInitialDir = NULL ;
- ofn.lpstrTitle = NULL ;
- ofn.Flags = 0 ; // Set in Open and Close functions
- ofn.nFileOffset = 0 ;
- ofn.nFileExtension = 0 ;
- ofn.lpstrDefExt = TEXT ("jpg") ;
- ofn.lCustData = 0L ;
- ofn.lpfnHook = NULL ;
- ofn.lpTemplateName = NULL ;
- }
-
- BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
- {
- ofn.hwndOwner = hwnd ;
- ofn.lpstrFile = pstrFileName ;
- ofn.lpstrFileTitle = pstrTitleName ;
- ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
-
- return GetOpenFileName (&ofn) ;
- }
-
- int main()
- {
- static TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH] ;
- HWND hwnd;
- hwnd=GetForegroundWindow(); //获取前台窗口句柄。本程序中的前台窗口就是控制台窗口。
- PopFileInitialize (hwnd); //初始化ofn
- PopFileOpenDlg(hwnd, szFileName, szTitleName);//打开文件对话框
- cout<<szFileName<<endl; //在控制台中显示选中文件的路径
- return 0;
- }
这个程序仅仅是一个简单范例,用于在控制台中打开文件对话框,顺便再控制台中输出选中文件的路径。记得把你的工程属性中得字符集改成多字节字符集,因为在Unicode字符集下路径显示出的是一串数字。
|