Использование специальных функций
Для упрощения работы с органами управления, расположенными в диалоговых панелях, в программном интерфейсе Windows определены специальные функции. При использовании этих функций вам не требуется указывать идентификаторы окна органов управления, достаточно знать идентификаторы самих органов управления, определенные в описании шаблона.
Для посылки сообщения органу управления удобно использовать функцию SendDlgItemMessage:
LRESULT WINAPI SendDlgItemMessage( HWND hdlg, int idDlgItem, UINT uMsg, WPARAM wParam, LPARAM lParam);
В качестве параметра hdlg этой функции необходимо указать идентификатор окна диалоговой панели. Параметр idDlgItem определяет идентификатор органа управления, которому предназначается сообщение. Остальные три параметра этой функции содержат, соответственно, код сообщения и параметры, передаваемые вместе с сообщением.
Для выполнения некоторых часто использующихся операций с органами управления в программном интерфейсе Windows определены специальные функции.
В частности, для заполнения списка LISTBOX именами файлов, каталогов и дисковых устройств предназначена функция DlgDirList:
int WINAPI DlgDirList(HWND hdlg, LPSTR lpszPath, int idListBox, int idStatic, UINT uFileType);
Первый параметр этой функции указывает идентификатор окна диалоговой панели.
Параметр lpszPath - указатель на строку, содержащую шаблон для имен файлов.
Параметр idListBox перед вызовом функции должен содержать идентификатор заполняемого списка.
В качестве параметра idStatic вы должны указать идентификатор статического органа управления, в который будет записана строка полного пути к текущему каталогу, или NULL, если статический орган управления не используется.
И, наконец, последний параметр этой функции определяет тип файлов, имена которых заносятся в список, а также указывают на необходимость записи в список имен каталогов и дисковых устройств. Этот параметр должен быть указан как логическая комбинация констант с префиксом имени DDL_ (вы уже знакомы с этими константами).
Аналогичная функция предусмотрена и для списка COMBOBOX:
int WINAPI DlgDirListComboBox ( HWND hdlg, LPSTR lpszPath, int idListBox, int idStatic, UINT uFileType);
Назначение параметров этой функции полностью аналогично назначению параметров функции DlgDirList.
Функция DlgDirSelect предназначена для получения из списка LISTBOX (подготовленного с помощью функции DlgDirList) строки, выбранной пользователем:
BOOL WINAPI DlgDirSelect(HWND hdlg, LPSTR lpszBuffer, int idListBox);
Параметр hdlg определяет диалоговую панель. Нужный список задается параметром idListBox. Выбранная строка будет записана в буфер, адрес которой указан с помощью параметра lpszBuffer. Размер буфера должен быть не меньше 128 байт.
Аналогичная функция предусмотрена для списка COMBOBOX:
BOOL WINAPI DlgDirSelectComboBox (HWND hdlg, LPSTR lpszBuffer, int idListBox);
Если ваше приложение будет работать в среде Windows версии 3.1 или более старшей версии, для получения выбранной пользователем строки вы можете использовать функции DlgDirSelectEx и DlgDirSelectComboBoxEx:
BOOL WINAPI DlgDirSelectEx(HWND hdlg, LPSTR lpszBuffer, int cbBufSize, int idListBox); BOOL WINAPI DlgDirSelectComboBoxEx(HWND hdlg, LPSTR lpszBuffer, int cbBufSize, int idListBox);
Эти функции позволяют получить в буфер lpszBuffer размером cbBufSize байт строку, выбранную пользователем из списка с идентификатором idListBox, расположенном в диалоговой панели hdlg. Однако для выбранной строки выполняется дополнительная обработка, а именно: если выбрано имя каталога или дискового устройства, функция удаляет из строки квадратные скобки и символы "-".
В программном интерфейсе Windows имеется несколько функций, облегчающих работу с редакторами текстов, расположенных в диалоговых панелях.
Функция SetDlgItemText позволяет изменить заголовок органа управления или записать текст в текстовый редактор:
void WINAPI SetDlgItemText(HWND hdlg, int idControl, LPCSTR lpszText);
Текстовая строка lpszText записывается в орган управления с идентификатором idControl, расположенным в диалоговой панели hdlg.
Функция SetDlgItemInt позволяет записать в заголовок органа управления или текстовый редактор текстовую строку, полученную после преобразования целого числа в формат строки символов:
void WINAPI SetDlgItemInt(HWND hdlg, int idControl, UINT uValue, BOOL fSigned);
Для диалоговой панели с идентификатором окна, равным hdlg, эта функция записывает символьное представление параметра uValue в заголовок органа управления или редактор текста с идентификатором idControl. Если параметр fSigned указан как TRUE, значение uValue интерпретируется как знаковое целое, если FALSE - как беззнаковое целое.
Для получения строки, связанной с органом управления, расположенном в диалоговой панели, можно использовать функцию GetDlgItemText:
int WINAPI GetDlgItemText(HWND hdlg, int idControl, LPSTR lpszBuffer, int cbBufferSize);
Эта функция записывает текст, связанный с органом управления idControl, в буфер lpszBuffer, имеющий размер cbBufferSize байт.
Предусмотрена также функция, получающая из органа управления текстовую строку и выполняющая преобразование этой строки в целое число:
UINT WINAPI GetDlgItemInt (HWND hdlg, int idControl, BOOL FAR* lptTranslated, BOOL fSigned);
Эта функция возвращает целое число, которое образуется после преобразования текста, связанного с органом управления idControl в диалоговой панели hdlg. Если параметр fSigned указан как TRUE, преобразуемая строка интерпретируется как символьное представление знакового целого, если FALSE - как беззнакового целого. В переменную, адрес которой передается через параметр lptTranslated, записывается код ошибки. Если преобразование выполнено без ошибок, в переменную записывается значение TRUE, в противном случае - FALSE.
Есть также функции, предназначенные для работы с переключателями.
Функция CheckDlgButton предназначена для изменения состояния переключателя CHECKBOX (включения или выключения):
void WINAPI CheckDlgButton(HWND hdlg, int idButton, UINT uState);
Для переключателя с идентификатором idButton, расположенного в диалоговой панели hdlg, устанавливается новое состояние в соответствии со значением параметра uState.
Для выключения переключателя параметр uState должен иметь нулевое значение. Если этот параметр будет равен 1, переключатель будет включен, а если 2 - переведен в неактивное состояние.
Аналогичная функция предусмотрена для переключателей RADIOBUTTON:
void WINAPI CheckRadioButton (HWND hdlg, int idFirstButton, int idLastButton, int idCheckButton);
Эта функция может обслуживать сразу группу переключателей, имеющих идентификаторы от idFirstButton до idLastButton. Она включает переключатель с идентификатором idCheckButton, после чего выключает все остальные переключатели группы в указанном параметрами idFirstButton и idLastButton диапазоне идентификаторов.
Для определения текущего состояния переключателя вы можете воспользоваться функцией IsDlgButtonChecked:
UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);
Эта функция возвращает состояние переключателя с идентификатором idButton, расположенного в диалоговой панели hdlg. Если переключатель находится в выключенном состоянии, возвращается нулевое значение. Для включенного переключателя возвращается значение 1. Значение 2 соответствует неактивному переключателю, изображенному серым цветом. В случае ошибки возвращается отрицательное значение -1.
Если ваше приложение использует собственную логику для передачи фокуса ввода между органами управления, расположенными в диалоговой панели, ему может потребоваться информация о последовательности, в которой должен передаваться фокус ввода. С помощью функции GetNextDlgGroupItemприложение может определить идентификатор окна предыдущего или следующего органа управления в группе:
HWND WINAPI GetNextDlgGroupItem(HWND hdlg, HWND hwndControl, BOOL fPrevious);
В зависимости от значения флага fPrevious функция возвращает идентификатор предыдущего или следующего органа управления группе относительно органа управления с идентификатором hwndControl. Если значение флага fPrevious равно TRUE, функция возвращает идентификатор окна для предыдущего органа управления в группе, если FALSE - для следующего.
Функция GetNextDlgTabItem позволяет определить идентификатор окна для первого органа управления, который имеет стиль WS_TABSTOP и расположен после органа управления с заданным идентификатором или перед этим органом:
HWND WINAPI GetNextDlgTabItem(HWND hdlg, HWND hwndControl, BOOL fPrevious);
Параметр hwndControl определяет орган управления, начиная с которого функция будет выполнять поиск, параметр fPrevious определяет направление поиска. Если значение параметра fPrevious равно TRUE, функция ищет предыдущий орган управления в группе, если FALSE - следующий.
Следует упомянуть еще две функции, имеющие отношение к специфической системе координат, принятой для работы с диалоговыми панелями.
Функция MapDialogRect преобразует координаты из единиц диалоговой панели (dialog units) в пиксели:
void WINAPI MapDialogRect(HWND hdlg, RECT FAR* lprc);
Преобразуемые координаты необходимо записать в структуру типа RECT, адрес которой указывается во втором параметре функции. Результат преобразования будет записан в эту же структуру.
Функция GetDialogBaseUnits возвращает двойное слово, содержащее информацию о диалоговой системе координат:
DWORD WINAPI GetDialogBaseUnits(void);
Младшее слово представляет собой ширину в пикселях диалоговой единицы длины, старшее - высоту.