Функции для создания диалоговой панели
В программном интерфейсе Windows определены восемь функций, предназначенных для создания модальных и немодальных диалоговых панелей.
Для создания модальной диалоговой панели чаще всего используется функция DialogBox:
int WINAPI DialogBox( HINSTANCE hInstance, LPCSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc);
Через параметр hInstance необходимо передать идентификатор текущей копии приложения.
Параметр lpszTemplate представляет собой указатель на строку имени шаблона, указанном в операторе DIALOG текстового описания шаблона.
Параметр hwndOwner - идентификатор окна, создавшего диалоговую панель.
Последний параметр, dlgprc, представляет собой адрес функции диалога.
Если при создании диалоговой панели ей необходимо передать параметр, воспользуйтесь функцией DialogBoxParam:
int WINAPI DialogBoxParam( HINSTANCE hInstance, LPCSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit);
Эта функция полностью аналогична функции DialogBox, за исключением дополнительного параметра lParamInit. Значение этого параметра передается через параметр lParam сообщения WM_INITDIALOG и может быть проанализировано на этапе создания диалоговой панели.
Как мы уже говорили, существует редко используемая возможность создания диалоговой панели с помощью шаблона, сформированного непосредственно в памяти (а не загруженного из ресурсов приложения). Для создания таких диалоговых панелей предназначены функции DialogBoxIndirect и DialogBoxIndirectParam.
Функция DialogBoxIndirect аналогична функции DialogBox, но в качестве второго параметра в ней используется не указатель на строку имени шаблона, а идентификатор глобального блока памяти, в котором подготовлен шаблон:
int WINAPI DialogBoxIndirect( HINSTANCE hInstance, HGLOBAL hglbDlgTemplate, HWND hwndOwner, DLGPROC dlgprc);
Функция DialogBoxIndirectParam аналогична функции DialogBoxIndirect, но имеет дополнительный параметр lParamInit:
int WINAPI DialogBoxIndirectParam( HINSTANCE hInstance, HGLOBAL hglbDlgTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit);
Для создания немодальных диалоговых панелей используются функции CreateDialog, CreateDialogParam, CreateDialogIndirect, CreateDialogIndirectParam. Эти функции имеют параметры, аналогичные параметрам функций DialogBox, DialogBoxParam, DialogBoxParamIndirect:
HWND WINAPI CreateDialog(HINSTANCE hInstance, LPCSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc);
HWND WINAPI CreateDialogParam(HINSTANCE hInstance, LPCSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit);
HWND WINAPI CreateDialogIndirect(HINSTANCE hInstance, HGLOBAL hglbDlgTemplate, HWND hwndOwner, DLGPROC dlgprc);
HWND WINAPI CreateDialogIndirectParam( HINSTANCE hInstance, HGLOBAL hglbDlgTemplate, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit);
Функции DialogBox, DialogBoxParam, DialogBoxIndirect, и DialogBoxIndirectParam возвращают значение, передаваемое при завершении работы диалоговой панели с помощью функции EndDialog.
Функция EndDialog имеет следующий прототип:
void WINAPI EndDialog(HWND hdlg, int nResult);
В качестве первого параметра функции необходимо указать идентификатор завершаемой диалоговой панели, который передается в функцию диалога через параметр hdlg.
Функции CreateDialog, CreateDialogParam, CreateDialogIndirect, и CreateDialogIndirectParam возвращают идентификатор окна для созданной диалоговой панели.
Функция диалога
Перед созданием диалоговой панели, помимо шаблона диалога, программисту необходимо подготовить функцию диалога, предназначенную для обработки сообщений, поступающих от диалоговой панели. Эта функция должна быть описана следующим образом:
BOOL CALLBACK _export DlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
Вы можете выбрать для функции диалога любое имя.
Параметры функции диалога напоминают параметры функции окна. Все они, за исключением первого, имеют аналогичное назначение. Через первый параметр функции диалога передается идентификатор диалога hdlg, а не идентификатор окна hwnd.
В отличие от функции окна, функция диалога не должна вызывать функцию DefWindowProc для тех сообщений, которые она не желает обрабатывать. Если функция диалога обрабатывает сообщение, она должна вернуть значение TRUE, а если нет - FALSE.
Функция диалога не обрабатывает сообщения WM_CREATE, WM_PAINT, WM_DESTROY. При инициализации диалога в функцию диалога вместо сообщения WM_CREATE передается сообщение WM_INITDIALOG. Как правило, функция диалога всегда обрабатывает сообщения WM_INITDIALOG и WM_COMMAND.
Сообщение WM_INITDIALOG использует параметры wParam и lParam.
Параметр wParam содержит идентификатор органа управления, который первым получит фокус ввода после отображения диалоговой панели. Это первый орган управления, описанный в шаблоне диалога со стилем WM_TABSTOP. Параметр lParam содержит значение, передаваемое приложением при создании диалоговой панели.
Если в ответ на сообщение WM_INITDIALOG функция диалога возвращает значение TRUE, после создания диалоговой панели фокус ввода передается органу управления, идентификатор которого был записан в параметре wParam.
Если при инициализации диалоговой панели обработчик сообщения WM_INITDIALOG устанавливает фокус ввода на другой орган управления (вызывая функцию SetFocus), функция диалога должна вернуть значение FALSE.
Сообщение WM_COMMAND, поступающее в функцию диалога, передает сообщения или извещения от органов управления, расположенных в диалоговой панели.
Крое этого, функция диалога может получить это сообщение с параметром wParam, равным константам IDOK и IDCANCEL, описанным в файле windows.h.
Сообщение с параметром IDOK поступает в функцию диалога в том случае, если пользователь нажал клавишу <Enter> в момент, когда ни одна из кнопок, расположенных в диалоговой панели, не имеет фокус ввода, и ни одна из кнопок не имеет стиль WS_DEFPUSHBUTTON. Если в диалоговой панели есть кнопка со стилем WS_DEFPUSHBUTTON, в описанной ситуации в функцию диалога поступает сообщение WM_COMMAND с параметром wParam, равным идентификатору этой кнопки.
Сообщение с параметром IDCANCEL появится тогда, когда пользовательзакроет диалоговую панель с помощью системного меню или клавиши <Esc>.
Обычно в диалоговой панели всегда создается одна клавиша, имеющая стиль WS_DEFPUSHBUTTON. Как правило, на этой клавише пишется слово "OK" и она используется для нормального завершения работы диалоговой панели. Для этой клавиши имеет смысл использовать идентификатор IDOK.
Еще одна клавиша, присутствующая практически во всех диалоговых панелях, имеет надпись "Cancel" и используется для отмены диалоговой панели. Если определить идентификатор этой клавиши как IDCANCEL, вы сможете использовать единый обработчик сообщения для отмены диалоговой панели при помощи кнопки и при помощи системного меню или клавиши <Esc>.
Функция MessageBox
Теперь, когда вы знаете, что такое модальные и немодальные диалоговые панели, вспомним о нашем старом друге - функции MessageBox, с которой вы начали изучение программного интерфейса Windows:
int WINAPI MessageBox(HWND hwndParent, LPCSTR lpszText, LPCSTR lpszTitle, UINT fuStyle);
Напомним, что эта функция создает на экране диалоговую панель с текстом, заданным параметром lpszText и заголовком, заданным параметром lpszTitle. Если заголовок указан как NULL, используется заголовок по умолчанию - строка "Error".
Параметр hwndParent указывает идентификатор родительского окна, создающего диалоговую панель. Этот параметр можно указывать как NULL, в этом случае у диалоговой панели не будет родительского окна. Вы можете вызвать функцию MessageBox из функции диалога, в этом случае первый параметр должен содержать идентификатор окна диалоговой панели.
Последний параметр fuStyle определяет стиль и внешний вид диалоговой панели. Вы можете использовать одну из следующих констант, определяющих количество кнопок, расположенных на диалоговой панели и надписи на этих кнопках.
Константа | Описание |
MB_ABOTRETRYIGNORE | Диалоговая панель содержит три кнопки с надписями "Abort", "Retry", "Ignore" |
MB_OK | Диалоговая панель содержит одну кнопку "OK" |
MB_OKCANCEL | Две кнопки с надписями "OK", "Cancel" |
MB_RETRYCANCEL | Две кнопки с надписями "Retry", "Cancel" |
MB_YESNO | Две кнопки с надписями "Yes", "No" |
MB_YESNOCANCEL | Три кнопки с надписями "Yes", "No", "Cancel" |
К этим константам при помощи логической операции ИЛИ можно добавлять другие константы.
По умолчанию после инициализации диалоговой панели фокус ввода имеет первая кнопка. Эта кнопка будет использована по умолчанию. Вы можете определить в качестве кнопки, используемой по умолчанию любую из трех кнопок с помощью следующих констант:
Константа | Описание |
MB_DEFBUTTON1 | Первая кнопка используется по умолчанию |
MB_DEFBUTTON2 | Вторая кнопка используется по умолчанию |
MB_DEFBUTTON3 | Третья кнопка используется по умолчанию |
С помощью следующих трех констант вы можете влиять на модальность диалоговой панели:
Константа | Описание |
MB_APPLMODAL | Создается модальная диалоговая панель. Окно, указанное параметром hwndParent, переводится в неактивное состояние до тех пор, пока пользователь не завершит работу с диалоговой панелью. Пользователь может переключиться на другое приложение. Этот стиль используется по умолчанию |
MB_SYSTEMMODAL | До тех пор, пока пользователь не завершит работу с диалоговой панелью, все остальные приложения переводятся в неактивное состояние |
MB_TASKMODAL | Аналогично MB_APPLMODAL за исключением того, что если параметр hwndParent имеет значение NULL, блокируются все окна верхнего уровня, принадлежащие данной задаче. Этот стиль используется тогда, когда идентификатор родительского окна неизвестен, но тем не менее требуется перевести все окна текущего приложения в неактивное состояние до тех пор, пока пользователь не завершит работу с диалоговой панелью |
Константа | Внешний вид пиктограммы |
MB_ICONASTERISK | |
MB_ICONEXCLAMATION | |
MB_ICONHAND | |
MB_ICONINFORMATION | |
MB_ICONQUESTION | |
MB_ICONSTOP |
Константа | Название кнопки |
IDABORT | "Abort" |
IDCANCEL | "Cancel" |
IDIGNORE | "Ignore" |
IDNO | "No" |
IDOK | "OK" |
IDRETRY | "Retry" |
IDYES | "Yes" |
Графическое изображение типа bitmap
В ресурсы приложения вы можете включить произвольное графическое изображение в виде битового образа (в дальнейшем мы будем называть такое изображение изображением типа bitmap или просто изображением bitmap).
С помощью графического редактора, входящего в состав Resource Workshop, или с помощью стандартного приложения Paint Brush вы можете нарисовать прямоугольное графическое изображение типа bitmap. При этом для представления цвета одного пикселя может использоваться разное количество бит. Изображение записывается в файл с расширением имени bmp.
Мы уже сталкивались с изображениями bitmap, когда выводили в окно пиктограмму и курсор. Эти объекты являются частными случаями изображения bitmap.
Изображения bitmap удобно использовать для оформления внешнего вида окон приложения. С помощью таких изображений вы можете, например, создать органы управления любой формы (например, круглые кнопки с картинками), нарисовать фотографию, введенную сканером, заставку или эмблему фирмы. Изображения bitmap открывают широкие возможности для разработки дизайна приложения Windows.
К сожалению, рисование в окне изображения bitmap является достаточно сложной задачей, которой будет посвящена отдельная глава в одном из следующих томов "Библиотеки системного программиста". В программном интерфейсе Windows нет функции с именем DrawBitmap, с помощью которой вы могли бы нарисовать изображение bitmap, однако через некоторое время мы попытаемся восполнить этот пробел.
В этом разделе мы расскажем вам о том, как создать и описать изображение bitmap в файле описания ресурсов, как загрузить bitmap в память и использовать его для закрашивания внутренней области окна (client area).
Инициализация полосы просмотра
Для полосы просмотра определены понятия текущая позиция и диапазон изменения значений позиции. При передвижении ползунка вдоль полосы просмотра текущая позиция принимает дискретные значения внутри диапазона изменения значений позиции. Если ползунок находится в самом левом (для горизонтальной полосы просмотра) или самом верхнем (для вертикальной полосы просмотра) положении, текущая позиция равна минимальной. Если же ползунок находится в самом правом или самом нижнем положении, текущая позиция равна максимальной.
После того как вы создали полосу просмотра одним из описанных выше способов, ее необходимо проинициализировать, указав диапазон изменений значений позиции. Для этого следует вызвать функцию SetScrollRange:
void WINAPI SetScrollRange(HWND hwnd, int fnBar, int nMin, int nMax, BOOL fRedraw);
Параметр hwnd определяет идентификатор окна, имеющего полосу просмотра, или идентификатор полосы просмотра, созданного как орган управления.
Параметр fnBar определяет тип полосы просмотра, для которой выполняется установка диапазона изменения значений позиции:
Значение | Описание |
SB_CTL | Установка диапазона для полосы просмотра, созданной как орган управления класса "scrollbar". В этом случае параметр hwnd функции SetScrollRange должен указывать идентификатор органа управления, полученный при его создании от функции CreateWindow. |
SB_HORZ | Установка диапазона горизонтальной полосы просмотра для окна, при создании которого был использован стиль окна WS_HSCROLL. Параметр hwnd функции SetScrollRange должен указывать идентификатор окна, имеющего полосу просмотра |
SB_VERT | Установка диапазона вертикальной полосы просмотра для окна, при создании которого был использован стиль окна WS_VSCROLL. Параметр hwnd функции SetScrollRange должен указывать идентификатор окна, имеющего полосу просмотра |
Параметры nMin и nMax определяют, соответственно, минимальное и максимальное значение для диапазона. Разность между nMax и nMin не должна превышать 32767.
Параметр fRedraw определяет, следует ли перерисовывать полосу просмотра для отражения изменений. Если указано значение TRUE, после установки диапазона полоса просмотра будет перерисована, а если FALSE - не будет.
В любой момент времени вы можете узнать диапазон для полосы просмотра, вызвав функцию GetScrollRange:
void WINAPI GetScrollRange(HWND hwnd, int fnBar, int FAR* lpnMinPos, int FAR* lpnMaxPos);
Параметры hwnd и fnBar аналогичны параметрам функции SetScrollRange. Первый из них определяет идентификатор окна или органа управления, второй - тип полосы просмотра.
Параметры lpnMinPos и lpnMaxPos - указатели на переменные, в которые после возврата из функции будут записаны, соответственно, минимальное и максимальное значение диапазона.
Использование функции SendMessage
Первый параметр функции SendMessage является идентификатором окна, функция которого должна получить сообщение. Если вы создаете модальную диалоговую панель, функция диалога получает идентификатор окна диалоговой панели. Вам же нужны идентификаторы окон отдельных органов управления.
Программный интерфейс Windows содержит специальную функцию, предназначенную для определения идентификаторов окна органов управления по идентификатору окна диалога и идентификатору самого органа управления. Эта функция называется GetDlgItem:
HWND WINAPI GetDlgItem(HWND hdlg, int idControl);
В качестве параметра hdlg этой функции необходимо передать идентификатор окна диалоговой панели. Для модальных диалоговых панелей этот идентификатор можно определить только внутри функции диалога (он передается через первый параметр функции диалога). Идентификатор окна немодальной диалоговой панели возвращается функциями, создающими такую панель, например, функцией CreateDialog.
Второй параметр является идентификатором органа управления, указанным в шаблоне диалоговой панели.
Для того чтобы установить переключатель с идентификатором IDC_SWITCH во включенное состояние, вы можете вызывать функцию SendMessage следующим образом:
SendMessage(GetDlgItem(hdlg, IDC_SWITCH), BM_SETCHECK, TRUE, 0L);
Зная идентификатор окна органа управления, вы можете получить идентификатор самого органа управления, т. е. решить задачу, обратную выполняемой функцией DetDlgItem. Для этого следует воспользоваться функцией GetWindowWord, передав ей в качестве второго параметра константу GWW_ID:
nIDControl = GetWindowWord(hwndControl, GWW_ID);
Эта функция возвращает значения из области дополнительной памяти, определенной при регистрации класса окна. Напомним, что размер дополнительной области памяти задается значением, записанным в элементе cbWndExtra структуры WNDCLASS.
Использование класса "scrollbar"
Для создания полосы просмотра с помощью функции CreateWindow вы должны в первом параметре функции указать класс окна "scrollbar":
#define IDC_SCROLLBAR 1 HWND hScroll; hScroll = CreateWindow("scrollbar", NULL, WS_CHILD | WS_VISIBLE | SBS_HORZ, 20, 40, 100, 50, hWnd, IDC_SCROLLBAR, hInstance, NULL);
Заголовок окна не используется, поэтому второй параметр функции должен быть указан как NULL.
Третий параметр, определяющий стиль окна, наряду с константами WS_CHILD и WS_VISIBLE должен содержать определение стиля полосы просмотра. Существует девять стилей для полосы просмотра. Соответствующие символические константы определены в файле windows.h и имеют префикс имени SBS_ (например, SBS_HORZ).
Девятый параметр функции CreateWindow должен задавать идентификатор полосы просмотра.
Использование пиктограммы при регистрации класса окна
Во всех приложениях, описанных в предыдущем томе "Библиотеки системного программиста", для класса главного окна приложения мы определяли встроенную в Windows пиктограмму с идентификатором IDI_APPLICATION. Для этого мы вызывали функцию LoadIcon:
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
Эта функция имеет следующий прототип:
HICON WINAPI LoadIcon(HINSTANCE hInst, LPCSTR lpszIcon);
Параметр hInst является идентификатором текущей копии приложения.
Параметр lpszIcon - идентификатор ресурса или дальний указатель на строку, идентифицирующую ресурс.
Функция LoadIcon возвращает идентификатор загруженной пиктограммы или NULL при ошибке.
Если в файле описания ресурсов идентификатор пиктограммы представлен в виде текстовой строки, в качестве второго параметра функции LoadIcon следует передать указатель на эту строку.
Следующая строка задает для класса главного окна приложения пиктограмму, определенную в файле описания ресурсов под именем AppIcon:
wc.hIcon = LoadIcon(hInstance, "AppIcon");
Если же для идентификатора пиктограммы используется целое число, второй параметр следует определить с использованием макрокоманды MAKEINTRESOURCE, определенной в файле windows.h:
#define MAKELP(sel, off) ((void FAR*)MAKELONG((off), (sel))) #define MAKEINTRESOURCE(i) ((LPCSTR)MAKELP(0, (i)))
Например, пусть в файле описания ресурсов определена пиктограмма с целым числом в качестве идентификатора:
456 ICON great.ico
В этом случае загрузка пиктограммы должна выполняться следующим образом:
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(456));
Возможен еще один вариант:
wc.hIcon = LoadIcon(hInstance, "#456");
Для Windows символ "#" означает, что значение 456 является текстовой строкой.
Если пиктограмма, загруженная с помощью функции LoadIcon, вам больше не нужна, вы можете освободить занимаемую ей память, вызвав функцию DestroyIcon:
BOOL WINAPI DestroyIcon(HICON hIcon);
Функция DestroyIcon уничтожает пиктограмму, идентификатор которой задан параметром hIcon и освобождает ранее занимаемую этой пиктограммой память.
Использование Resource Workshop
Запустите Resource Workshop и из меню "File" выберите строку "New project...". В появившейся диалоговой панели установите переключатель ".RC" и нажмите кнопку "OK". На экране появится окно, озаглавленное "untitled.rc". Это окно не содержит ни одной строки, так как мы создали новый файл ресурсов (вы можете создать шаблон диалоговой панели в уже существующем файле ресурсов, если из меню "File" выберите строку "Open project...").
Затем из меню "Resource" выберите строку "New...". На экране появится диалоговая панель "New Resource". В списке "Resource Type" выберите строку "DIALOG" и нажмите кнопку "OK". После этого в главном окне приложения появятся окна, озаглавленные как "DIALOG_1", "Caption", "Alignment", "Tools" (рис. 3.1).
Окно "DIALOG_1" - это создаваемая вами диалоговая панель. Заголовок окна можно изменить. Для этого сначала сделайте щелчок мышью по заголовку окна, а затем в окне "Caption" введите новое имя для заголовка и нажмите клавишу <Enter>.
Установите нужный вам размер диалоговой панели, изменив размер окна "DIALOG_1". Это можно сделать, перемещая границы или углы окна мышью.
Далее следует создать и расположить на поверхности диалоговой панели все необходимые органы управления. Для создания органа управления (а также изменения стиля диалоговой панели) можно воспользоваться меню "Control".
Выберите из этого меню строку "Style...". На экране появится диалоговая панель "Window style" (рис. 3.2).
Рис. 3.2. Диалоговая панель "Window style"
В этой диалоговой панели вы можете изменить заголовок создаваемой диалоговой панели (поле "Caption"), класс окна ("Class"), который будет использоваться для диалоговой панели и даже подключить к диалоговой панели меню (поле "Menu"). Группа переключателей "Dialog style" позволяет изменить стиль диалоговой панели, добавив к ней системное меню ("System menu"), толстую рамку ("Thick frame"), вертикальную полосу просмотра ("Vertical scroll"), горизонтальную полосу просмотра ("Horizontal scroll"), кнопки минимизации ("Minimize Box") и максимизации ("Maximize box"), а также определить другие стили.
Вы можете выбрать тип окна ("Window type"), стиль рамки ("Frame style") и шрифт ("Font..."). Однако пока мы рекомендуем вам использовать значения, установленные по умолчанию и показанные на рис. 3.2, изменив только заголовок диалоговой панели.
Остальные строки меню "Control" предназначены для создания органов управления.
Выберите из этого меню строку "Push button". Форма курсора при этом изменится. Курсор примет вид маленького крестика с нарисованной около него кнопкой "OK". Поместите курсор в то место диалоговой панели, в котором вам нужно создать кнопку и сделайте щелчок левой клавишей мыши. На поверхности диалоговой панели появится кнопка с надписью "Text". Размеры и расположение только что созданной кнопки можно изменять при помощи мыши.
Если сделать по кнопке двойной щелчок левой клавишей мыши, на экране появится диалоговая панель "Button styles", с помощью которой можно изменить атрибуты кнопки (рис. 3.3).
Рис. 3.3. Диалоговая панель "Button styles"
При помощи этой панели вы можете изменить текст, написанный на кнопке (поле "Caption"), выбрать стиль кнопки (группа переключателей "Button type"), а также определить другие атрибуты. Каждый орган управления, расположенный в диалоговой панели, должен иметь свой идентификатор. Этот идентификатор можно определить в поле "Control ID" в цифровом или символическом виде (в последнем случае файл описания ресурсов должен включать в себя файл с описанием символических имен идентификаторов органов управления).
Создав все органы управления и определив их атрибуты, сохраните шаблон диалоговой панели в файле описания ресурсов, для чего из меню "File" выберите строку "Save project" или "Save file as...".
Далее вы можете вносить изменения в шаблон при помощи любого текстового редактора. Можно также отредактировать готовый шаблон, запустив приложение Resource Workshop и загрузив шаблон, выбрав из меню "File" строку "Open project...".
Использование специальных функций
Для упрощения работы с органами управления, расположенными в диалоговых панелях, в программном интерфейсе 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);
Младшее слово представляет собой ширину в пикселях диалоговой единицы длины, старшее - высоту.
Использование текстового редактора
Вы можете создать диалоговую панель без применения редакторов диалога, создав описание шаблона при помощи любого текстового редактора, сохраняющего текст без атрибутов форматирования.
Изменение формы курсора
Как мы уже говорили в предыдущем томе "Библиотеки системного программиста", можно определить форму курсора при регистрации класса окна или изменить ее в любое время в процессе работы приложения.
При регистрации класса окна мы задавали форму курсора следующим способом:
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
В качестве второго параметра функции LoadCursor вы можете указать идентификатор встроенного курсора или идентификатор курсора из файла описания ресурсов. В последнем случае через первый параметр необходимо передать идентификатор текущей копии приложения:
wc.hCursor = LoadCursor(hInstance, "AppCursor");
Для динамического изменения формы курсора (например, во время обработки сообщения) следует использовать функцию SetCursor:
HCURSOR WINAPI SetCursor(HCURSOR hcur);
Параметр hcur функции SetCursor должен указывать идентификатор нового курсора, подготовленный при помощи функции LoadCursor. Если указать параметр как NULL, изображение курсора исчезнет с экрана.
Для того чтобы выключить изображение курсора мыши или вновь включить его используют функцию ShowCursor:
int WINAPI ShowCursor(BOOL fShow);
Функция управляет содержимым счетчика, который используется для определения момента включения или выключения изображения курсора мыши. Первоначально содержимое счетчика равно нулю. Этот счетчик увеличивается, когда необходимо включить курсор, и уменьшается при выключении курсора. Если счетчик больше или равен нулю, курсор мыши находится во включенном (видимом) состоянии.
Для включения курсора в качестве параметра fShow функции следует передать значение TRUE, для выключения - FALSE.
Возвращаемое функцией ShowCursor значение равно новому содержимому счетчика.
Изменения в цикле обработки сообщений
При создании модальной диалоговой панели в приложении создается второй цикл обработки сообщений, который действует до завершения работы модальной диалоговой панели. Если же создается немодальная диалоговая панель, сообщения от органов управления, предназначенные для диалоговой панели, проходят через общую очередь сообщений приложения.
Для разделения этих сообщений цикл обработки должен вызывать функцию IsDialogMessage:
BOOL WINAPI IsDialogMessage(HWND hwndDlg, MSG FAR* lpmsg);
Функция IsDialogMessage определяет, предназначено ли сообщение, определяемое параметром lpmsg, для немодальной диалоговой панели с идентификатором окна, равным hwndDlg. Если предназначено, функция сама выполняет обработку такого сообщения и возвращает значение TRUE. В противном случае возвращается значение FALSE.
Изображение курсора в окне приложения
В разделе, посвященном пиктограммам, мы рассказали вам о функции DrawIcon, с помощью которой можно нарисовать пиктограмму в окне приложения. Есть ли в программном интерфейсе аналогичная функция для рисования курсора мыши?
Строго говоря, специальной функции для рисования курсора мыши нет. Это понятно - курсор мыши рисует сама операционная система Windows, отслеживая перемещения мыши по столу (некоторые видеоконтроллеры рисуют курсор мыши с помощью аппаратных средств, но опять же под руководством Windows). Однако приложение все-таки может нарисовать изображение курсора в своем окне, воспользовавшись функцией DrawIcon. Для этого в качестве второго параметра функции DrawIcon следует передать идентификатор курсора, полученный при помощи функции LoadCurosor.
Заметим, что эта особенность функции DrawIcon не нашла отражения в документации, поэтому в следующих версиях Windows она может исчезнуть. Тем не менее в Windows версии 3.1 благодаря практически одинаковому формату данных для пиктограммы и курсора, вы можете рисовать курсор как пиктограмму.
Изображение пиктограммы в окне приложения
После того как вы загрузили пиктограмму функцией LoadIcon, вы можете нарисовать ее в любом месте окна. Для этого вам достаточно вызвать функцию DrawIcon:
BOOL WINAPI DrawIcon(HDC hDC, int x, int y, HICON hIcon);
Параметр hDC - идентификатор контекста отображения, полученный для рисования.
Пиктограмма с идентификатором hIcon будет нарисована в точке с координатами (x,y), определяемыми параметрами x и y.
Функция DrawIcon возвращает значение TRUE при успешном завершении и FALSE при ошибке.
Кнопки
Для создания кнопки, как мы уже говорили, ваше приложение должно создать дочернее окно на базе предопределенного класса "button". После этого родительское окно будет получать от кнопки сообщение с кодом WM_COMMAND. Этим сообщением кнопка информирует родительское окно о том, что с ней что-то сделали, например, нажали.
Кнопки и клавиатура
Обычно для работы с кнопками используется мышь. Но, как мы уже говорили, с приложениями Windows вы можете работать и без мыши. В частности, в диалоговых панелях вы можете, нажимая клавишу <Tab>, передавать фокус ввода от одной кнопки к другой. Если кнопка имеет фокус ввода, ее функция окна будет получать сообщения от клавиатуры. Кнопка реагирует только на клавишу пробела - если вы нажмете пробел, когда кнопка имеет фокус ввода, кнопка (или переключатель, который есть ни что иное, как разновидность кнопки) изменит свое состояние.
Для того чтобы ваше приложение могло использовать клавишу <Tab> для передачи фокуса ввода от одного органа управления другому, оно должно создать для клавиши <Tab> свой обработчик сообщения WM_CHAR. Этот обработчик должен установить фокус ввода на следующий (из имеющихся) орган управления, вызвав функцию SetFocus.
К счастью, в Windows имеется объект, специально предназначенный для объединения нескольких органов управления - диалоговая панель. Функции поддержки диалоговых панелей определены внутри Windows. Они выполняют всю работу, необходимую для организации передачи фокуса ввода между различными органами управления, расположенными на диалоговой панели.
Кнопки, которые рисует родительское окно
Если вас не удовлетворяет внешний вид стандартных кнопок (или других стандартных органов управления, созданных на базе класса "button"), вы можете при создании кнопки указать стиль BS_OWNERDRAW. Этот стиль несовместим с остальными стилями кнопок.
Если вы создали кнопку со стилем BS_OWNERDRAW, она будет работать аналогично кнопкам других стилей, но процедура рисования кнопки возлагается на родительское окно. При этом оно может нарисовать кнопку с использованием пиктограмм (с помощью функции DrawIcon), графических изображений bitmap или любым другим способом.
Обычно кнопки BS_OWNERDRAW используют при отображении наборов инструментальных средств, называемых Toolbar. Примером такого набора может служить набор кнопок с пиктограммами, предназначенных для запуска команд в текстовом процессоре Microsoft Word for Windows (рис. 2.4).
Рис. 2.4. Кнопки с пиктограммами
Кнопка BS_OWNERDRAW, как и кнопка BS_PUSHBUTTON, посылает в родительское окно сообщение WM_COMMAND с кодом извещения BN_CLICKED. Дополнительно такая кнопка посылает в родительское окно сообщение WM_DRAWITEM, которое говорит о том, что надо нарисовать орган управления в том или ином состоянии.
Обработчик сообщения WM_DRAWITEM должен вернуть значение TRUE.
Параметр wParam сообщения WM_DRAWITEM содержит идентификатор органа управления, пославшего сообщение WM_DRAWITEM (для органа управления типа меню этот параметр равен 0).
Параметр lParam содержит дальний указатель на структуру типа DRAWITEMSTRUCT, описанную в файле windows.h:
typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; DWORD itemData; } DRAWITEMSTRUCT;
В файле windows.h определены также ближний и дальний указатели на эту структуру:
typedef DRAWITEMSTRUCT NEAR* PDRAWITEMSTRUCT; typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT;
Анализируя поля структуры DRAWITEMSTRUCT, родительское окно может определить тип и идентификатор органа управления, требующего перерисовки, а также состояние, в котором необходимо изобразить данный орган управления (включен, выключен, получил фокус ввода, неактивен, выбран для использования).
Приведем назначение отдельных полей структуры DRAWITEMSTRUCT.
Имя поля | Описание |
CtlType | Тип органа управления. Может принимать следующие значения: ODT_BUTTONODT_BUTTON - кнопка; ODT_COMBOBOXODT_COMBOBOX - орган COMBOBOX (рассмотрим позже); ODT_LISTBOXODT_LISTBOX - орган LISTBOX (рассмотрим позже); ODT_MENUODT_MENU - меню |
CtlID | Идентификатор органа управления. Не используется для меню |
itemID | Идентификатор строки для органов COMBOBOX, LISTBOX или меню |
itemAction | Действия, которые необходимо выполнить при изображении органа управления. Определен в виде отдельных битовых флагов: ODA_DRAWENTIREODA_DRAWENTIRE - требуется перерисовать весь орган управления; ODA_FOCUSODA_FOCUS - этот бит устанавливается в 1, если орган управления получил или потерял фокус ввода, новое состояние органа управления можно узнать, проанализировав содержимое поля itemState; ODA_SELECTODA_SELECT - изменилось состояние органа управления (он стал включенным, выключенным или неактивным), для уточнения состояния необходимо использовать поле itemState |
itemState | Вид, в котором необходимо изобразить орган управления. Определен в виде отдельных битовых флагов: ODS_CHECKEDODS_CHECKED - выбрана строка меню (этот бит используется только для меню); ODS_DISABLEDODS_DISABLED - орган управления неактивен; ODS_FOCUSODS_FOCUS - орган управления получил фокус ввода; ODS_GRAYEDODS_GRAYED - строка меню должна быть изображена серым цветом (этот бит используется только для меню); ODS_SELECTEDODS_SELECTED - орган управления выбран |
hwndItem | Для кнопок, органов управления COMBOBOX и LISTBOX это поле содержит идентификатор окна. Для меню это поле содержит идентификатор меню |
hDC | Контекст устройства, который необходимо использовать для рисования органа управления |
rcItem | Прямоугольные границы органа управления, внутри которого его необходимо нарисовать |
itemData | Используется только для органов управления COMBOBOX и LISTBOX |
Коды извещения
Текстовый редактор посылает в родительское окно сообщение WM_COMMAND с параметром wParam, равным идентификатору редактора. Этот идентификатор можно использовать для того чтобы различать сообщения, поступающие от разных органов управления (в частности, от разных текстовых редакторов, если в одном окне их создано несколько штук).
Младшее слово параметра lParam содержит идентификатор окна, полученный от функции CreateWindow при создании редактора.
Старшее слово параметра lParam содержит код извещения. Анализируя этот код, приложение может определить событие, послужившее причиной появления сообщения WM_COMMAND.
Приведем список кодов извещений.
Код извещения | Описание |
EN_CHANGE | Изменилось содержимое текста в окне редактирования |
EN_ERRSPACE | Произошла ошибка при попытке получить дополнительную память |
EN_HSCROLL | Выполнена свертка текста по горизонтали. Пользователь использовал горизонтальную полосу просмотра для свертки текста, но изменения в окне редактирования еще не произошли |
EN_KILLFOCUS | Текстовый редактор потерял фокус ввода |
EN_MAXTEXT | При вводе очередного символа произошло переполнение, так как было превышен максимально допустимый для редактора размер текста |
EN_SETFOCUS | Текстовый редактор получил фокус ввода |
EN_UPDATE | Содержимое текстового редактора будет изменено. Пользователь ввел один символ текста или выполнил другую операцию редактирования, но выполнение этой операции еще не отразилось на содержимом окна редактирования. После этого извещения после отображения изменений придет извещение с кодом EN_CHANGE |
EN_VSCROLL | Выполнена свертка текста по вертикали. Пользователь использовал вертикальную полосу просмотра для свертки текста, но изменения в окне редактироания еще не произошли |
Ваше приложение должно обрабатывать, по крайней мере, извещение с кодом EN_ERRSPACE, которое приходит в том случае, если редактор текста не смог заказать для себя дополнительную память.
Так же как редактор текста, список посылает в родительское окно сообщение WM_COMMAND (если он создан со стилем LBS_NOTIFY). Параметр wParam этого сообщения содержит идентификатор органа управления (в данном случае, идентификатор списка). Младшее слово параметра lParam содержит идентификатор окна списка, а старшее - код извещения.
Приведем список кодов извещения, поступающих от органа управления класса "listbox".
Код извещения | Описание |
LBN_DBLCLK | Двойной щелчок левой клавишей мыши по строке списка |
LBN_ERRSPACE | Ошибка при попытке заказать дополнительную память |
LBN_KILLFOCUS | Список теряет фокус ввода |
LBN_SELCANCEL | Пользователь отменил выбор в списке. Это извещение используется в Windows версии 3.1 и более поздних версий |
LBN_SELCHANGE | Изменился номер выбранной строки (т. е. пользователь выбрал другую строку) |
LBN_SETFOCUS | Список получает фокус ввода |
Список "combobox" посылает в родительское окно сообщение WM_COMMAND. Параметр wParam этого сообщения содержит идентификатор списка. Младшее слово параметра lParam содержит идентификатор окна списка, а старшее - код извещения.
Приведем список кодов извещения, поступающих от органа управления класса "combobox".
Код извещения | Описание |
CBN_CLOSEUP | Список исчез (стал невидим) |
CBN_DBLCLK | Двойной щелчок левой клавишей мыши по строке списка, имеющего стиль CBS_SIMPLE |
CBN_DROPDOWN | Список стал видимым |
CBN_EDITCHANGE | Пользователь изменил содержимое окна редактирования, причем изменения уже отображены |
CBN_EDITUPDATE | Пользователь изменил содержимое окна редактирования, изменения еще не отображены |
CBN_ERRSPACE | Ошибка при попытке заказать дополнительную память |
CBN_KILLFOCUS | Список теряет фокус ввода |
CBN_SELENDCANCEL | Пользователь отменил выбор в списке. |
CBN_SELENDOK | Пользователь выбрал строку в списке. |
CBN_SELCHANGE | Изменился номер выбранной строки (т. е. пользователь выбрал другую строку) |
CBN_SETFOCUS | Список получает фокус ввода |
Курсор мыши
В предыдущем томе "Библиотеки системного программиста" мы рассказывали вам о том, как управлять курсором мыши и как изменять его форму. В этом разделе мы вновь вернемся к этому вопросу.
Курсор мыши представляет собой ни что иное, как упрощенный вариант битового изображения (bitmap), аналогичного пиктограмме. Вы можете выбрать один из встроенных курсоров, либо создать свой собственный. Для создания своего курсора его надо нарисовать, пользуясь приложением Resource Workshop, и записать в файл с расширением имени cur. Далее на файл с курсором следует сделать ссылку в файле описания ресурсов. После этого приложение может загрузить курсор в память и использовать его либо при регистрации класса окна, либо для изменения формы курсора в произвольный момент времени.
LB_ADDSTRING
Добавление строки в список.
Параметры:
wParam = 0;
lParam = (LPARAM)(LPCSTR)lpszStr;
lpszStr - указатель на добавляемую строку.
Возвращаемое значение:
Номер строки в списке (первая строка имеет номер 0), или код ошибки.
LB_DELETESTRING
Удаление строки из списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер удаляемой строки. Первая строка имеет номер 0.
Возвращаемое значение:
Количество строк, оставшихся в списке, или код ошибки.
LB_DIR
Заполнение списка именами файлов и каталогов, расположенных в текущем каталоге, а также именами дисков.
Параметры:
wParam = (WPARAM)(UINT)uAttr;
lParam = (LPARAM)(LPCSTR)lpszFileSpec;
uAttr - атрибуты файлов;
lpszFileSpec - указатель на строку, содержащую имя файла или шаблон имени файла.
Возвращаемое значение:
Номер последнего имени файла, добавленного в список, или код ошибки.
LB_FINDSTRING
Поиск строки в списке, имеющей заданный префикс. Будет найдена строка, начальная часть которой совпадает с текстовой строкой, определенной в качестве префикса.
Параметры:
wParam = (WPARAM)nIndexStart;
lParam = (LPARAM)(LPCSTR)lpszStr;
nIndexStart - номер строки, с которой начинается поиск;lpszStr- адрес префикса строки, которую нужно найти в списке.
Возвращаемое значение:
Номер найденной строки, или код ошибки (если строки в списке нет).
LB_FINDSTRINGEXACT
Поиск строки в списке.
Параметры:
wParam = (WPARAM)nIndexStart;
lParam = (LPARAM)(LPCSTR)lpszStr;
nIndexStart - номер строки, с которой начинается поиск;lpszStr- адрес строки, которую нужно найти в списке.
Возвращаемое значение:
Номер найденной строки, или код ошибки (если строки в списке нет).
LB_GETCARETINDEX
Определение номера строки, имеющей фокус ввода. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Номер строки, имеющей фокус ввода или код ошибки.
LB_GETCOUNT
Определение количества строк в списке.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Количество строк в списке или код ошибки.
LB_GETCURSEL
Определение номера выделенной строки.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Номер выделенной строки или код ошибки.
LB_GETHORIZONTALEXTENT
Определение ширины сворачиваемой области списка, имеющего горизонтальную полосу просмотра.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Ширина сворачиваемой области списка в пикселях.
LB_GETITEMDATA
Получение 32-битового значения, соответствующего заданной строке. Напомним, что каждому элементу списка ставится в соответствие некоторое число, занчение которого можно определить с помощью этого сообщения.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки, для которой нужно получить значение.
Возвращаемое значение:
Двойное слово, содержащее искомое значение, или код ошибки.
LB_GETITEMHEIGHT
Определение высоты заданной строки в списке, который рисуется родительским окном и имеет переменную высоту элементов. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки, для которой нужно получить значение.
Возвращаемое значение:
Высота строки в пикселях или код ошибки.
LB_GETITEMRECT
Определение координат внутренней области окна, соответствующей заданной строке.
Параметры:
wParam = (WPARAM)nIndex;
lParam = (LPARAM)(RECT FAR *)lprc;
nIndex - номер строки, для которой нужно получить значение координат.
lprc - адрес структуры типа RECT, в которую будут записаны искомые координаты.
Возвращаемое значение:
Код ошибки.
LB_GETSEL
С помощью этого сообщения можно определить, выбрана ли указанная строка списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки, о которой нужно получить информацию.
Возвращаемое значение:
Положительное число, если строка выбрана, 0, если не выбрана или код ошибки.
LB_GETSELCOUNT
С помощью этого сообщения можно определить количество выбранных строк.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Количество выбранных строк или код ошибки.
LB_GETSELITEMS
Заполнение буфера идентификаторами выбранных строк для списка, в котором можно выбирать несколько строк сразу.
Параметры:
wParam = (WPARAM)cItems;
lParam = (LPARAM)(int FAR *)lpItems ;
cItems - максимальное количество выбранных строк, чьи идентификаторы будут записаны в буфер.
lpItems - указатель на буфер для записи идентификаторов выбранных строк.
Возвращаемое значение:
Количество идентификаторов, записанных в буфер, или код ошибки.
LB_GETTEXT
Копирование текста, соответствующего заданной строке, в буфер. Если список не содержит строк (определен без стиля LBS_HASSTRING), в буфер копируется двойное слово, соответствующее указанному элементу списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = (LPARAM)(int FAR *)lpszBuffer
;nIndex - номер строки.l
pszBuffer - адрес буфера.
Возвращаемое значение:
Длина строки в байтах (с учетом двоичного нуля, закрывающего строку), или код ошибки.
LB_GETTEXTLEN
Определение длины строки, содержащейся в списке.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;nIndex - номер строки.
Возвращаемое значение:
Длина строки в байтах (с учетом двоичного нуля, закрывающего строку), или код ошибки.
LB_GETTPOINDEX
Определение номера первой отображаемой строки.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение:
Номер строки или код ошибки.
LB_INSERTSTRING
Вставка элемента в заданную позицию списка. На расположение строки не влияет стиль LBS_SORT.Параметры:wParam = (WPARAM)nIndex;lParam = (LPARAM)(int FAR *)lpszBuffer;nIndex - номер позиции, в которую будет вставлена строка.lpszBuffer - адрес буфера.Возвращаемое значение:Номер позиции, в которую вставлена строка, или код ошибки.
LB_RESETCONTENT
Удаление всех строк из списка.
Параметры:
wParam = 0;
lParam = 0L;
Возвращаемое значение: не используется.
LB_SELECTSTRING
Поиск строки в списке, которая начинается с символов, соответствующих образцу. Найденная строка становится выбранной.
Параметры:
wParam = (WPARAM)nIndexStart;
lParam = (LPARAM)(int FAR *)lpszBuffer;
nIndexStart - номер строки, с которой начинается поиск.lpszBuffer - адрес буфера, содержащего образец.
Возвращаемое значение:
Номер найденной строки или код ошибки.
LB_SELITEMRANGE
Выделение одной или нескольких расположенных рядом строк.
Параметры:
wParam = (WPARAM)(BOOL)fSelect;
lParam = MAKELPARAM(wFirst, wLast);
fSelect - если TRUE, указанные строки выбираются и выделяются, если FALSE - выбор и выделение отменяются.
wFirst - номер первой выделяемой строки.
wLast - номер последней выделяемой строки.
Возвращаемое значение:
Код ошибки.
LB_SETCARETINDEX
Передача фокуса ввода указанной строке. Если данная строка находится вне окна отображения, список сворачивается таким образом, чтобы строка стала видимой. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = (WPARAM)nIndex;
lParam = MAKELPARAM(fScroll, 0);
nIndex - номер строки.
fScroll - если TRUE, свертка выполняется до тех пор, пока указанная строка не будет видна хотя бы частично, если FALSE - до тех пор, пока строка не будет видна полностью.
Возвращаемое значение:
Код ошибки.
LB_SETCOLUMNWIDTH
Установка ширины колонки в многоколоночном списке.
Параметры:
wParam = (WPARAM)cxColumn;
lParam = 0L;
cxColumn - ширина колонок списка в пикселях.
Возвращаемое значение: не используется.
LB_SETCURSEL
Выбор указанной строки. Ранее выделенная строка становится невыделенной. Если данная строка находится вне окна отображения, список сворачивается таким образом, чтобы строка стала видимой.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки. Если указать -1, выделение всех строк будет отменено. При этом функция SendMessage вернет значение LB_ERR, что в данном случае не говорит об ошибке.
Возвращаемое значение:
Код ошибки (если значение nIndex не равно -1).
LB_SETHORIZONTALEXTENT
Установка ширины, на которую может быть свернут список, имеющий стиль WS_HSCROLL.
Параметры:
wParam = (WPARAM)cxExtent;
lParam = 0L;
cxExtent - ширина в пикселях.
Возвращаемое значение: не используется.
LB_SETITEMDATA
Установка значения двойного слова, связанного с указанным элементом списка.
Параметры:
wParam = (WPARAM)nIndex;
lParam = (LPARAM)dwData;nIndex - номер строки.dwData - значение двойного слова.
Возвращаемое значение:
Код ошибки.
LB_SETITEMHEIGHT
Установка высоты элемента в списке, который рисует родительское окно и имеет переменную высоту элементов. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = (WPARAM)nIndex;
lParam = MAKELPARAM(cyItem, 0);
nIndex - номер строки. Если список не имеет стиль LBS_OWNERDRAWVARIABLE, значение этого параметра должно быть равно 0.cyItem - высота элемента в пикселах.
Возвращаемое значение:
Код ошибки.
LB_SETSEL
Установка высоты элемента в списке, который рисует родительское окно и имеет переменную высоту элементов. Это сообщение используется в Windows версии 3.1 и более поздних версий.
Параметры:
wParam = (WPARAM)(BOLL)fSelect;
lParam = MAKELPARAM(nIndex, 0);
fSelect - если TRUE, строка выбирается и выделяется, если FALSE - выделение и выбор строки отменяется.nIndex - номер строки. Можно указать как -1, в этом случае действие распространяется на все строки списка.
Возвращаемое значение:
Код ошибки.
LB_SETTABSTOPS
Установка позиции табуляции в списке.
Параметры:
wParam = (WPARAM)cTabs;
lParam = (LPARAM)(int FAR *)lpTabs;
cTabs - количество позиций табуляции.lpTabs - адрес массива целых чисел, содержащих позиции табуляции.
Возвращаемое значение:
Ненулевое значение, если позиции табуляции были установлены, в противном случае возвращается 0.
LB_SETTOPINDEX
Свертка списка до тех пор, пока указанная строка не станет видимой.
Параметры:
wParam = (WPARAM)nIndex;
lParam = 0L;
nIndex - номер строки.
Возвращаемое значение:
Код ошибки.
Файл string\string.cpp
// ---------------------------------------- // Работа с таблицей строк // ----------------------------------------
#define STRICT #include <windows.h>
#include "string.hpp"
// Прототип функции обработки ошибки void Error(void);
#pragma argsused int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { // Буфера для работы со строками BYTE szAppName[20]; BYTE szWindowName[80]; BYTE szMsg[80]; BYTE szBuf[80]; int cb;
// Загружаем строку с идентификатором IDS_APPNAME cb = LoadString(hInstance, IDS_APPNAME, szAppName, sizeof(szAppName));
// Если в буфер записано 0 символов, // это означает, что ресурс не найден. // В этом случае мы вызываем функцию обработки // ошибки и завершаем работу приложения if(!cb) { Error();
return -1; }
// Загружаем строку с идентификатором IDS_WINDOWNAME cb = LoadString(hInstance, IDS_WINDOWNAME, szWindowName, sizeof(szWindowName));
if(!cb) { Error();
return -1; }
// Загружаем строку с идентификатором IDS_MESSAGE cb = LoadString(hInstance, IDS_MESSAGE, szMsg, sizeof(szMsg));
if(!cb) { Error();
return -1; }
// Подготавливаем буфер для вывода сообщения wsprintf(szBuf, szMsg, (LPSTR)szAppName, 1994);
// Выводим сообщение, составленное из строк // и числа 1994 MessageBox(NULL, szBuf, szWindowName, MB_OK | MB_ICONINFORMATION);
return 0; }
// -------------------------------------------- // Функция обработки ошибки загрузки ресурса // -------------------------------------------- void Error(void) { MessageBox(NULL, "Ошибка при загрузке ресурса", "Error", MB_OK | MB_ICONSTOP);
}
В главный файл исходного текста приложения включается include-файл string.hpp (листинг 1.2), в котором описаны символические константы для идентификации строк.
Файл string\string.hpp
#define IDS_APPNAME 1 #define IDS_WINDOWNAME 2 #define IDS_MESSAGE 3
Этот же файл включается и в файл описания ресурсов (листинг 1.3). При этом для идентификации строк можно будет использовать символические имена, определенные в файле string.hpp.