вторник, 2 апреля 2013 г.

Вызов диалоговых окон открытия-сохранения файла и выбора каталога в приложении Visual Studio

Рассмотрим создание стандартных диалогов для выбора файла или каталога в приложении, написанном на Visual C++.
В качестве шаблона будем использовать Dialog based приложение, созданное в предыдущем посте. Это стандартное, "пустое" Dialog based приложение, просто мы там добавили меню и обработчик его команды, которая вызывается когда мы щелкаем по пункту этого меню.
В этот обработчик (функция CCreatingMenuDlg::OnMytopmenuMymenuitem()) вместо старого вставляем новый код:
    CString a(TEXT("All Files (*.*)|*.*||")),
            b(TEXT("My File Dialog")),
            c(TEXT("Your file name is :"));

    CFileDialog fileDlg( TRUE,
                        NULL,
                        NULL,
                        OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY,
                        a,
                        this,
                        sizeof(OPENFILENAME)
                        );
    fileDlg.m_ofn.lpstrTitle = b;

    if ( fileDlg.DoModal() == IDOK)
    {
        CString szlstfile = fileDlg.GetPathName();
        CString res;
        res =  c + szlstfile;
        AfxMessageBox(res );
        ofstream flow1 (szlstfile);
        flow1 << "Ты сделал это!!!";
    }
При выборе этого пункта меню будет вызываться диалоговое окно, которое позволяет выбрать или создать файл, куда будет записана тестовая строка. Будьте осторожны при тестировании, чтобы не затереть какой-нибудь полезный файл.
Для работы с типом  ofstream (для демонстрируемой функциональности вообще-то нам последние две строчки кода что приведен выше не нужны) включим в файл CreatingMenu.h следующее:
#include<fstream>
#include
<iostream>
#include<string>
using namespace std;
Все. Теперь можно скомпилировать и запустить на выполнение.
Теперь напишем код для вызова диалога для выбора директории. Для этого в обработчик CCreatingMenuDlg::OnMytopmenuMymenuitem() вместо предыдущего вставим такой код:
    BROWSEINFO bi = { 0 };
    bi.lpszTitle = _T("Pick a Directory");
    bi.ulFlags |= BIF_NEWDIALOGSTYLE;
    LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
    if ( pidl != 0 )
    {
        TCHAR path[MAX_PATH];
        if ( SHGetPathFromIDList ( pidl, path ) )
        {
            //_tprintf ( _T("Selected Folder: %s\n"), path );
            CString a(path);
            CString res = TEXT("Your selected path is: ") + a;
            AfxMessageBox(res);
        }

         IMalloc * imalloc = 0;
        if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
        {
            imalloc->Free ( pidl );
            imalloc->Release ( );
        }
    }
 Компилируем и запускаем на выполнение.

Комментариев нет: