在控制台下打开对话框?!没错,这是完全可以的,实现起来也是相当简单,基本上连雕虫小技都不算。不过网上这样的例子还不是很多,我就把自己写的一个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字符集下路径显示出的是一串数字。