Создание диалоговых окон - PullRequest
3 голосов
/ 27 декабря 2011

Я просто хочу спросить, есть ли в 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

Я предполагаю, что мне нужно будет использовать классы, но я действительно не знаю, как писать такой код.

Любая помощь будет высоко ценится!

@@@ FINAL EDIT @@@

Кажется, что этот код не компилируется при вставке в WIN32 Project в VS 2010.

Дает мне эти ошибки:

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

Есть предложения по исправлению этой ошибки?

EDIT:

Сам нашел ...

Необходимо включить

#include <Commdlg.h>

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

В C (или C ++) вы создадите экземпляр структуры OPENFILENAME и установите его члены. Это очень похоже на то, что вы показали в приведенном выше примере кода 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).

Полный пример кода здесь , но упрощенная версия такова:

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 не имеет встроенного строкового типа, что усложняет кодирование. Если вас смущает приведенный выше пример кода, я настоятельно советую вам изучить язык C, прежде чем пытаться изучать Win32 API. Все пойдет намного более гладко, и вы не будете почти так же потеряны.

0 голосов
/ 27 декабря 2011

C ++ не содержит библиотек GUI, поэтому наличие диалогового окна не имеет смысла. Пожалуйста, обратитесь к документации любых библиотек GUI, которые вы используете.

0 голосов
/ 27 декабря 2011

Вам не нужно использовать классы, фактически вам даже не нужно использовать C ++. Win32 предоставляет GetOpenFileName, который делает всю тяжелую работу за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...