c++ - 制作对话框

标签 c++ windows class dialog

我就想问一下C++有没有简单的方法可以让对话框(openfiledialog,savefiledialog)这样写:

' VB6 Example    
'Setting up the "open file" dialog box.
openDiag.DialogTitle = "Select a file to open"
openDiag.Filter = "Exe files | *.exe" 'Ensures only EXE files can be selected.
openDiag.ShowOpen 'Opens up the dialog
'Takes the filename that was selected in the dialog and stores it in your OpenPath var and
'also displays it in the textbox
openPath = openDiag.FileName
txtfilepath.Text = openPath

我假设我需要使用类,但我真的不知道如何编写这种代码。

任何帮助将不胜感激!

@@@最终编辑@@@

似乎这段代码在 VS 2010 中粘贴到 WIN32 项目时无法编译。

给我这些错误:

error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'ofn' : undeclared identifier  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'OFN_EXPLORER' : undeclared identifier c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'OFN_FILEMUSTEXIST' : undeclared identifier    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'OFN_HIDEREADONLY' : undeclared identifier c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'OPENFILENAME' : undeclared identifier c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2065: 'OPENFILENAME' : undeclared identifier c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2070: ''unknown-type'': illegal sizeof operand   c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2070: ''unknown-type'': illegal sizeof operand   c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2146: syntax error : missing ';' before identifier 'ofn' c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.Flags' must have class/struct/union  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.hwndOwner' must have class/struct/union  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.lpstrDefExt' must have class/struct/union    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.lpstrFile' must have class/struct/union  c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.lpstrFilter' must have class/struct/union    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.lpstrTitle' must have class/struct/union c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.lStructSize' must have class/struct/union    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
error C2228: left of '.nMaxFile' must have class/struct/union   c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
IntelliSense: identifier "OFN_EXPLORER" is undefined    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
IntelliSense: identifier "OFN_FILEMUSTEXIST" is undefined   c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
IntelliSense: identifier "OFN_HIDEREADONLY" is undefined    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
IntelliSense: identifier "OPENFILENAME" is undefined    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp 
IntelliSense: identifier "OPENFILENAME" is undefined    c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp
IntelliSense: too many arguments in function call   c:\documents and settings\User\my documents\visual studio 2010\projects\program\program\program.cpp

关于如何修复这个错误有什么建议吗?

编辑:

自己找的...

需要包含

#include <Commdlg.h>

最佳答案

在 C(或 C++)中,您将创建 OPENFILENAME structure 的一个实例, 并设置其成员。这与您在上面的示例 VB 6 代码中显示的内容非常相似。

链接的文档包含有关该结构的所有不同成员的含义以及您应该如何填写它们的信息,但其中大部分与您在 VB 6 中找到的内容相匹配。

例如:

OPENFILENAME ofn;
ofn.lpstrTitle = TEXT("Select a file to open");
ofn.lpstrFilter = TEXT("EXE files\0*.exe\0");
/* etc... */

当您设置了所有属性并准备好显示对话框时,神奇的事情就来了。与在 VB 6 中数据结构公开显示对话框的函数 (ShowOpen) 不同,在 C/Win32 中,您需要调用不同的函数来执行此操作。

您感兴趣的函数是GetOpenFileName ,它只有一个参数——指向您的 OPENFILENAME 结构的指针。该结构的成员用于初始化对话框,该函数还用有关用户选择的文件的信息填充该结构的成员。该函数的返回值指示用户是否指定了文件名并单击了“确定”按钮(非零),或者用户是否单击了“取消”或发生了错误(零;FALSE)。

完整的示例代码是here ,但简化版本是这样的:

TCHAR szFileName[MAX_PATH]; /* string buffer to hold name of the selected file */

OPENFILENAME ofn = {0};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;      /* a handle to your window that will own the dialog */
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = TEXT("Select a file to open");
ofn.lpstrFilter = TEXT("EXE files\0*.exe\0");
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
/* etc... */

/* Show the dialog. */
if (!GetOpenFileName(&ofn))
{
    /* Either the user clicked Cancel, or an error occurred.
     * You need to handle it here... */
}
else
{
    /* The user selected a file and clicked OK.
     * The name and path to the file is contained in the szFileName buffer. */

    MessageBox(NULL, szFileName, TEXT("You selected the file..."), MB_OK);
}

是的,有些事情与 VB 6 不同。例如,C 没有内置的字符串类型,这使得代码编写起来有点复杂。如果您对上面的示例代码感到困惑,我强烈建议您在尝试学习 Win32 API 之前先学习 C 语言。事情会变得顺利得多,你也不会那么迷茫。

关于c++ - 制作对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8642601/

相关文章:

c++ - C/C++ 中双引号字符的备用字符组合是什么?

c++ - 如何从具有固定 C++ 中某些参数的函数创建函数指针

c++ - 替代 C/C++ localtime()

c# - 从 C# 中选择 SQL Server 数据库中的特定记录

java - boolean 值已更改但 if 语句无法识别

java - 从另一个类调用方法时遇到问题

c++ - 隐藏 C++ 库的私有(private)成员

C++ glDrawElements 数组作为参数 EXC_BAD_ACCESS 错误

.net - 在 Windows Vista/7 中重定向应用程序的图形输出(使用 DWM)

java - 从同一包中的不同类调用新方法