LAB4 (Методические указания к лабораторным работам), страница 2

2018-01-09СтудИзба

Описание файла

Файл "LAB4" внутри архива находится в папке "Методические указания к лабораторным работам". Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование в среде windows" из 4 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование в среде windows" в общих файлах.

Онлайн просмотр документа "LAB4"

Текст 2 страницы из документа "LAB4"

Если в ответ на сообщение 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>.

Функции для создания диалоговой панели

В программном интерфейсе 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 возвращают идентификатор окна для созданной диалоговой панели.

Сообщения для органов управления

Органы управления, расположенные на поверхности диалоговой панели, посылают в функцию диалога сообщение WM_COMMAND. В свою очередь, приложение может посылать различные сообщения органам управления, вызывая функцию 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.

Использование специальных функций

Для упрощения работы с органами управления, расположенными в диалоговых панелях, в программном интерфейсе 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 - переведен в неактивное состояние.

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
436
Средний доход
с одного платного файла
Обучение Подробнее