48471 (Работа с окнами приложений), страница 2

2016-07-30СтудИзба

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

Документ из архива "Работа с окнами приложений", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика, программирование" в общих файлах.

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

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

Дочерние окна, принадлежащие к стандартным классам, обмениваются данными с родительским окном по следующим правилам:

  • родительское окно при необходимости посылает доченему окну сообщения с номерами, равными или большими WM_USER. Для каждого стандартного класса дочерних окон определены свои сообщения, на которые они реагируют. Многие из таких сообщений должны вернуть результат, поэтому часто используется SendMessage вместо PostMessage.

  • дочернее окно посылает родительскому окну сообщения WM_COMMAND, со следующим назначением параметров:

wPar – идентификатор дочернего окна
LOWORD(lPar) – хендл дочернего окна
HIWORD(lPar) – код извещения

код извещения информирует родительское окно о том, какое событие произошло с дочерним окном. Посылка некоторых извещений от дочерних окон может быть запрещена - если не указывать ???_NOTIFY стиль. Для каждого класса дочерних окон определены свои коды извещения.

  • для управления цветом дочернего окна родительское может обрабатывать сообщения WM_CTLCOLOR, которые посылаются всеми стандартными дочерними окнами их родителям.



Статические элементы

Начнем рассмотрение с самого простого класса - класса статических элементов. К статическим элементам относятся прямоугольники (“пустые” и закрашенные), неизменяемый текст и иконки, нарисованные в родительском окне. Статические окна не принимают сообщений от мыши и клавиатуры и не могут иметь фокуса ввода.

Для создания такого окна мы должны указать имя класса “STATIC”, и задать специфичный стиль, определяющий внешний вид этого элемента. Так мы можем указать один из стилей:

SS_BLACKRECT – черный закрашенный прямоугольник

SS_BLACKFRAME – черный контур прямоугольника

SS_GRAYRECT – серый закрашенный прямоугольник

SS_GRAYFRAME – серый контур прямоугольника

SS_WHITERECT – белый закрашенный прямоугольник

SS_WHITEFRAME – белый контур прямоугольника

для описания прямоугольника заданного цвета.

Мы можем описать статический элемент – пиктограмму (иконку), указав стиль SS_ICON. В качестве заголовка окна задется имя ресурса типа ICON, включенного в Ваше приложение. Размеры определяются размерами иконки независимо от указанных Вами.

Если нам надо заменить одну иконку на другую, то надо этому дочернему окну послать сообщение (STM_SETICON, hIcon, 0L), а если мы хотим только узнать хендл иконки, то надо послать сообщение (STM_GETICON, 0, 0L). Оба сообщения возвращают хендл иконки.

Чаще используется другая разновидность статическего элемента - текст. Заголовок окна определяет выводимый текст, который может быть выведен в одну строку, автоматически размещен в нескольких строчках и выровнен на левую или правую границу или центрирован, что задается стилем окна:

SS_SIMPLE, SS_LEFT, SS_LEFTNOWORDWRAP, SS_RIGHT, SS_CENTER

При этом надо обратить внимание на стиль SS_NOPREFIX; Обычно последовательность из & и любого символа обозначает подчеркнутый символ. Однако это не всегда удобно - например, если выводимый текст является именем файла или директории (в этом случае & может содержаться в строке как обычный символ). Для того, что бы запретить использование & в качестве префикса, используется стиль SS_NOPREFIX.


Кнопки

Самый “богатый” класс - класс кнопок. Для создания окна, принадлежащего этому классу надо указать имя класса “BUTTON”. Большинство кнопок (но не все) являются активными элементами (то есть могут принимать фокус ввода). Обычно кнопки посылают родительскому окну только один код извещения - BN_CLICKED, указывающий на то, что кнопка была нажата. Все остальные коды извещения кнопок (BN_???) соответствуют частному случаю кнопок, который не рекомендуется использовать в Windows 3.1.

К этому классу принадлежат следующие разновидности управляющих элементов:

BS_PUSHBUTTON и BS_DEFPUSHBUTTON обозначают кнопку, на которую можно “нажать”. Нажимают на кнопку или пробелом, или мышкой. Стиль BS_DEFPUSHBUTTON обозначает кнопку, которая должна нажиматься клавишей Enter, даже если фокус ввода принадлежит другому управляющему элементу.

BS_CHECKBOX и BS_AUTOCHECKBOX обозначают флажок – элемент, который состоит из небольшого квадрата и строки текста. В квадрате может быть поставлен крестик (check mark) - то есть этот элемент является “двухпозиционным переключателем” - отмечен/неотмечен.

BS_AUTOCHECKBOX отличается от обычного флажка тем, что автоматически переключается из одного состояния в другое при нажатии на него, а для простого BS_CHECKBOX вы должны сами подать команду для переключения.

BS_3STATE и BS_AUTO3STATE очень похож на флажок, но может быть в трех состояниях - отмечен/неотмечен/запрещен (в запрещенном состоянии не принимает сообщения от клавиатуры и мыши и рисуется серым. Это состояние включается и выключается только программным способом).

BS_RADIOBUTTON и BS_AUTORADIOBUTTON обозначает переключатель (радио‑кнопку) – элемент, похожий на флажок , но вместо квадрата рисуется кружок, в котором может быть поставлена жирная точка. Предназначен для использования в группе других радио кнопок - причем только одна из них может быть нажата, а остальные должны быть отпущены (как селекторы диапазона в радиоприемнике).

BS_GROUPBOX редставляет собой прямоугольную рамку, в верхней части которой может быть выведен текст. Используется для визуального объединения нескольких управляющих элементов в одну группу. Хотя GroupBox и является кнопкой, но он не может получать фокус ввода - то есть больше похож на статические элементы.

Кнопки могут обрабатывать 5 специфичных сообщений:

BM_SETCHECK nCheck 0L

устанавливает состояние кнопки:
0 – неотмечена
1 – отмечена
2 – запрещена (только BS_3STATE и BS_AUTO3STATE)

BM_SETSTATE nState 0L

устанавливает состояние кнопки
0 – нормальное состояние
1 – выделена (изобразить кнопку в “нажатом” состоянии)

BM_SETSTYLE wStyle bRedraw & 0

изменить стиль кнопки. wStyle является комбинацией BS_??? стилей, а bRedraw указывает, надо ли перерисовать кнопку.

BM_GETCHECK 0 0L
BM_GETSTATE 0 0L

возвращают текущее состояние кнопки.


Списки

Простые списки относятся к классу LISTBOX. Элементы этого класса представляют собой один или несколько столбцов, в которых размещается список строк. Вы можете выбрать одну или несколько записей из списка для дальнейшего использования. Список может иметь или не иметь полосу прокрутки, строки в нем могут быть отсортированы или размещены в порядке поступления.

Список распознает большое количество специфичных сообщений, поэтому здесь будут рассмотрены лишь некоторые из них.

LB_RESETCONTENT 0 0L

это сообщение приводит к удалению всех данных из списка.

LB_ADDSTRING 0 lpszString

добавить строку в конец списка

LB_FINDSTRING nIndexStart lpszString

найти нужную строку в списке и получить ее индекс

LB_DELETESTRING nIndex 0L

удалить строку из списка

LB_GETTEXT nIndex lpsBuffer

прочитать строку с индексом nIndex в списке и разместить ее в указаном буфере.

LB_GETCURSEL 0 0

получить индекс текущего выбранного элемента

LB_DIR nAttr lpszMask

заполнить список именами файлов, директорий и дисков. Иногда удобно пользоваться специальной функцией, посылаеющей это сообщение: DlgDirList и DlgDirSelect.

Посылаемые родительскому окну коды извещения могут информировать его о следующих событиях списка:

  • LBN_ERRSPACE – о произошедшей ошибке, связанной с нехваткой памяти;

  • LBN_KILLFOCUS и LBN_SETFOCUS – о получении или потере фокуса ввода;

  • LBN_DBLCLK – о двойном нажатии на кнопку мыши;

  • LBN_SELCHANGE – об изменении текущего выбранного элемента;

  • LBN_SELCANCEL – процесс выбора прерван, например, переходом к другому окну.

Существует еще одна разновидность списков - так называемые комбинированные списки, состоящие из небольшого окошка редактора и простого списка, размещенного под ним. Эти списки принадлежат к классу COMBOBOX. Выделяют три разновидности комбинированных списков, определяемых его стилем:

  • простой комбинированный список – CBS_SIMPLE – когда и редактор и список постоянно видны;

  • выпадающий комбинированный список – CBS_DROPDOWN – когда постоянно видимо окошко редактора и специальная кнопка справа, при нажатии на которую под редактором появляется (выпадает) список.

  • неизменяемый комбинированный список – CBS_DROPDOWNLIST – аналогичный CBS_DROPDOWN, но текст в редакторе не может быть изменен.

Комбинированные списки позволяют легко получать пополняемый во время работы список, но автоматическое пополнение не предусмотрено. Для этого Вам надо будет самим, убедившись, что текст в редакторе не присутствует в списке, добавить его к списку.

Такой список может иметь стиль CBS_OEMCONVERT, который приводит к автоматическому преобразованию записываемых в него строк из OEM в ANSI, и к обратному преобразованию при чтении из него данных.

Комбинированные списки поддерживают еще больше сообщений и кодов извещения, связанных с применением редактора и возможностью появления и скрывания списка.


Редактор

Один из самых удобных стандартных классов - класс редактора EDIT. Окна, принадлежащие к этому классу могут представлять собой как однострочные, так и многострочные редакторы, возможно имеющие полосы прокрутки и даже окошки просмотра - ввод и редактирование в которых запрещены. К таким редакторам легко добавлять дополнительные операции, например, поиск или замену текста. Самым существенным недостатком является то, что весь редактируемый текст размещается в локальном блоке памяти, и, соответственно, ограничен размером этой памяти - не более 64K минус уже занятое пространство.

Весь редактируемый текст представляет собой одну длинную, заканчивающуюся \0 строку, возможно содержащую символы табуляции, перевода строки и возврата каретки.

Простейший способ создать собственный редактор - при создании собственного окна на всю его внутреннюю область установить окно стандартного редактора и добавить несколько дополнительных функций - меню, чтение/запись файла, поиск/замену и пр. Строго говоря, текстовой редактор NotePad сделан именно таким методом.

Окошко редактора может быть использовано для редактирования небольшого текста, тогда для его чтения или задания удобно использовать функции

void SetWindowText( hWnd, lpszText );

int GetWindowText( hWnd, lpsBuffer, nMaxCount );

int GetWindowTextLength( hWnd );

или сообщениями WM_SETTEXT, WM_GETTEXT и WM_GETTEXTLENGTH, которые в случае платформы Win32 позволят получить или изменить текст в окне, принадлежащем другому процессу, в то время как рассмотренные функции могут работать только с окнами, принадлежащими данному процессу.

Однако с большими текстами удобнее работать как с отдельными блоками памяти. Для этого надо будет воспользоваться сообщениями:

EM_GETHANDLE 0 0L

для получения хендла блока, содержащего текст;

EM_SETHANDLE hLocal 0L

для задания хендла блока, содержащего текст;

EM_LIMITTEXT nMaxChars 0L

для задания максимального размера текста;

Как все стандартные классы дочерних окна, окна EDIT посылают родительскому окну извещения о происходящих событиях – ошибке из‑за нехватки памяти, получении и потере фокуса, изменении редактируемого текста и о “прокрутке” текста в окошке редактора.


Полосы прокрутки

Последний рассматриваемый нами стандартный класс дочерних окон – полосы прокрутки, принадлежащие к классу SCROLLBAR. Взаимодействие полос прокрутки с родительским окном отличается от взаимодействия всех остальных стандартных классов.

Вы можете сами создавать полосы прокрутки, но, если вам надо одну-две полосы прокрутки снизу и справа от окна, то проще создать окно со стилями WS_VSCROLL и/или WS_HSCROLL. При этом окно автоматически получит нужные полосы прокрутки. Удобство заключается еще и в том, что эти полосы прокрутки размещаются вне внутренней области окна, то есть Вам не надо учитывать их размер.

Для извещения родительского окна полосы прокрутки посылают сообщения WM_VSCROLL и WM_HSCROLL в зависимости от типа полосы - горизонтальная или вертикальная, а для управления полосами прокрутки используются специальные функции.

Сначала рассмотрим сообщения полосы прокрутки:

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