Поделиться через


Пример: диалоговое окно "Открыть"

Пример Shapes, который мы использовали, несколько замучен. Давайте перейдем к COM-объекту, который можно использовать в реальной программе Windows: диалоговое окно Открыть.

снимок экрана с открытым диалоговым окном

Чтобы отобразить диалоговое окно Открыть, программа может использовать COM-объект с именем объекта Common Item Dialog. Диалоговое окно common item реализует интерфейс с именем IFileOpenDialog, который объявлен в файле заголовка Shobjidl.h.

Ниже приведена программа, отображающая диалоговое окно Открыть пользователю. Если пользователь выбирает файл, программа отображает диалоговое окно, содержащее имя файла.

#include <windows.h>
#include <shobjidl.h> 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | 
        COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        IFileOpenDialog *pFileOpen;

        // Create the FileOpenDialog object.
        hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, 
                IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));

        if (SUCCEEDED(hr))
        {
            // Show the Open dialog box.
            hr = pFileOpen->Show(NULL);

            // Get the file name from the dialog box.
            if (SUCCEEDED(hr))
            {
                IShellItem *pItem;
                hr = pFileOpen->GetResult(&pItem);
                if (SUCCEEDED(hr))
                {
                    PWSTR pszFilePath;
                    hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);

                    // Display the file name to the user.
                    if (SUCCEEDED(hr))
                    {
                        MessageBoxW(NULL, pszFilePath, L"File Path", MB_OK);
                        CoTaskMemFree(pszFilePath);
                    }
                    pItem->Release();
                }
            }
            pFileOpen->Release();
        }
        CoUninitialize();
    }
    return 0;
}

Этот код использует некоторые понятия, которые будут описаны далее в модуле, поэтому не волнуйтесь, если вы не понимаете все здесь. Ниже приведены основные сведения о коде:

  1. Вызовите CoInitializeEx, чтобы инициализировать библиотеку COM.
  2. Вызовите CoCreateInstance для создания объекта Common Item Dialog и получения указателя на интерфейс IFileOpenDia log объекта.
  3. Вызовите метод Show объекта, в котором отображается диалоговое окно для пользователя. Этот метод блокируется, пока пользователь не уволит диалоговое окно.
  4. Вызовите метод GetResult объекта. Этот метод возвращает указатель на второй COM-объект, называемый элементом оболочки . Элемент оболочки, реализующий интерфейс IShellItem, представляет выбранный пользователем файл.
  5. Вызовите метод GetDisplayName элемента оболочки. Этот метод получает путь к файлу в виде строки.
  6. Отображение окна сообщения, отображающего путь к файлу.
  7. Вызовите CoUninitialize, чтобы неинициализировать библиотеку COM.

Шаги 1, 2 и 7 вызовов, определенные библиотекой COM. Это универсальные функции COM. Шаги 3–5 вызовов, определенные объектом Common Item Dialog.

В этом примере показаны оба варианта создания объекта: универсальная функция CoCreateInstance и метод (GetResult), относящееся к объекту Common Item Dialog.

Следующий

управление временем существования объекта

Пример открытия диалогового окна