从 Vis C++ 控制台应用程序打开 OpenDialog?

Posted

技术标签:

【中文标题】从 Vis C++ 控制台应用程序打开 OpenDialog?【英文标题】:Opening an OpenDialog from Vis C++ console app? 【发布时间】:2009-01-18 08:21:44 【问题描述】:

我知道这是一个非常简单的问题,但我非常习惯使用 Borland 和包装器,所以这对我来说是一种新方法。有人可以简单地告诉我如何打开仅从 Visual Studio C++ 控制台应用程序获取 .obj 文件的 OpenDialog 吗?

非常感谢!

【问题讨论】:

我不确定我是否理解你的问题,如果它更清楚一点,你可能会得到更好的回答。如果它是控制台应用程序而不是 Windows 应用程序,我认为您将无法打开 OpenDialog。 【参考方案1】:

控制台应用程序和 GUI 应用程序之间实际上没有任何区别,除了入口点(“GUI”应用程序中的 WinMain),如果不是从控制台。

所有的Win32 API都可用,所以需要使用GetOpenFileName调用,如下:

#define DEFAULT_EXTENSION L".obj"

OPENFILENAME    ofn;
wchar_t *FilterSpec =L"Object Files(*.obj)\0*.obj\0Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0";
wchar_t *Title =L"Open....";
wchar_t szFileName[MAX_PATH];
wchar_t szFileTitle[MAX_PATH];
int             Result;
wchar_t filePath[MAX_PATH]; // Selected file and path

*szFileName = 0;
*szFileTitle = 0;

/* fill in non-variant fields of OPENFILENAME struct. */
ofn.lStructSize       = sizeof(OPENFILENAME);
ofn.hwndOwner         = GetFocus();
ofn.lpstrFilter       = FilterSpec;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter    = 0;
ofn.nFilterIndex      = 0;
ofn.lpstrFile         = szFileName;
ofn.nMaxFile          = MAX_PATH;
ofn.lpstrInitialDir   = L"."; // Initial directory.
ofn.lpstrFileTitle    = szFileTitle;
ofn.nMaxFileTitle     = MAX_PATH;
ofn.lpstrTitle        = Title;
ofn.lpstrDefExt   =     DEFAULT_EXTENSION;

ofn.Flags             = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;

if (!GetOpenFileName ((LPOPENFILENAME)&ofn))

    return; // Failed or cancelled

else

    wcscpy_s(filePath,ofn.lpstrFile);

【讨论】:

在对代码进行了一些修改之后,确实如此!非常感谢!【参考方案2】:

是的,可以从 VC++ 控制台应用程序打开 OpenDialog。

步骤: 创建一个新项目。 -> 选择 Win32 控制台应用程序。 在下一个对话框中,选择“支持 MFC 的应用程序”。 您将获得以下代码:

#include "stdafx.h" #include "test.h"

#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE 静态字符 THIS_FILE[] = __FILE__; #endif

/////////////////////////////////////// ////////////////////////// // 唯一的应用程序对象

CWinApp theApp;

使用命名空间标准;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

    // TODO: change error code to suit your needs
    cerr << _T("Fatal Error: MFC initialization failed") << endl;
    nRetCode = 1;

else

    // TODO: code your application's behavior here.
    CString strHello;
    strHello.LoadString(IDS_HELLO);
    cout << (LPCTSTR)strHello << endl;


return nRetCode;

在“else”部分开头添加如下代码

CFileDialog dlgOpen(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"文本文件 (.txt)|.txt||"); dlgOpen.DoModal();

运行应用程序。将自动打开一个打开的对话框。谷歌“CFileDialog”以获得更多帮助。

【讨论】:

不是每个人都希望在他们的应用程序中使用 MFC - 尤其是控制台应用程序!此外 - 现有应用程序可能不太容易转换为 mfc...【参考方案3】:

在 Visual Studio 中,通常依赖于MFC's CFileDialog class。查看链接的 MSDN 文档页面以了解示例用法。这个页面也有some examples。

如果您使用的是 Windows Vista 或 Windows 7,您可以尝试新的 COM 接口IFileOpenDialog。 Kenny Kerr 有一个nice article 使用新的 Vista 对话框。

【讨论】:

不是每个人都希望在他们的应用程序中使用 MFC - 尤其是控制台应用程序! 有道理。请改用 GetOpenFileName() api 调用。 msdn.microsoft.com/en-us/library/ms646829(VS.85).aspx

以上是关于从 Vis C++ 控制台应用程序打开 OpenDialog?的主要内容,如果未能解决你的问题,请参考以下文章

从作为守护进程启动的应用程序打开外部应用程序

需要 Microsoft Visual C++ 14.0。使用“Microsoft Visual C++ 构建工具”获取它:http://landinghub.visualstudio.com/vis

通过 C++ 控制应用程序的监视器

如何在 Visual C++ 中保持控制台窗口打开?

在 gui 应用程序中打开控制台

以编程方式打开和关闭控制台