15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как обновить список файлов в общих диалогах

Иногда, в общих диалогах, таких как File Open или Save As необходимо обновить список файлов не закрывая диалога. Сделать это можно путём эмулирования двойного щелчка по списку директорий. Можно конечно отправить сообщение из любого другого приложения, однако, чтобы отправить сообщение диалогу, надо использовать процедуру ловушки.

Функции общих диалогов для обновления списка файлов и директорий являются встроенными в общие диалоги, поэтому недоступны для приложений, работающих с подпрограммами общих диалогов. Эти функции срабатывают только когда пользователь сделает двойной щелчёк по списку.

Пример кода

Следующий код использует кнопку Cancel общего диалога для обновления списка:

   BOOL CALLBACK __export FileOpenHook (HWND hDlg, UINT message,
                            WPARAM wParam, LPARAM lParam)
   {
      switch (message)
      {
         case WM_COMMAND:
            switch(wParam)
            {
            // Далее эмулируем двойной щелчёк на списке директорий,
            // заставляя диалог по новой считать текущую директорию
            // с файлами и обновить список файлов.
               case IDCANCEL :
                  PostMessage( hDlg, WM_COMMAND, lst2,
                               MAKELPARAM(GetDlgItem(hDlg, lst2),
                               LBN_DBLCLK);
                  return TRUE;
            }
         break;
      }
      return FALSE;
   } 

Если приложение для платформы Win32, то уведомительное сообщение отправляется немного подругому; ниже приведён код PostMessage для приложений Win32:

   PostMessage (hDlg, WM_COMMAND, MAKEWPARAM (lst2,LBN_DBLCLK),
             (LPARAM)GetDlgItem (hDlg, lst2)); 

Приложения, использующие ID элементов управления общего диалога должны включать файл DLGS.H.

Шаблоны для общих диалогов находятся в директории \SAMPLES\COMMDLG либо в директории \INCLUDE дистрибутива Windows SDK.