Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Кнопки pushbutton defpushbutton и их назначение. Создание кнопок в окне приложения, сообщения от кнопок.




Различие PUSHBUTTON и DEFPUSHBUTTON:

У DEFPUSHBUTTON толстая внешняя линия, и на этом различия заканчиваются, если речь идет только о создании дочерних окон управления. Так понимаю то, что мы делали в 12 лабе.

Если говорить о создании окон диалога, то кнопки имеют существенные отличия не считая жирних внешних линий. DEFPUSHBUTTON получает фокус ввода автоматически, даже если она не была выбрана. В этом случае она может сработать при нажатии клавиши «пробел». Следует учесть, что в этом случае кнопка принимает на себя все сообщения от клавиатуры, поэтому фокус у нее надо забирать.

 

Создание кнопок:

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

Имя класса "button"

Текст окна button[i].text

Стиль окна WS_CHILD | WS_VISIBLE | СТИЛЬ_КНОПКИ

Положение по х cxChar

Положение по у cyChar * (1 + 2 * i)

Ширина 20 * cxChar

Высота 7 * cyChar / 4

Родительское окно hwnd

Идентификатор дочернего окна (HMENU)i

Описатель экземпляра ((LPCREATESTRUCT) lParam) -> hInstance

Дополнительные параметры NULL

Параметр "имя класса" — его предопределенное имя. При задании стиля окна используются стили WS_CHILD,

WS_VISIBLE и один из десяти стилей кнопок (BS_PUSHBUTTON, BS_DEFPUSHBUTTON и т. д.), которые

определены в структуре button. Параметр "текст окна" (который у обычного окна появляется в строке заголовка) —

это текст, который будет выводиться вместе с каждой кнопкой. Здесь просто использовался текст,

идентифицирующий стиль кнопки.

Параметры "положение по х " и "положение по у " показывают положение верхнего левого угла дочернего окна

относительно верхнего левого угла рабочей области родительского окна. Параметры "ширина" и "высота" задают

ширину и высоту каждого дочернего окна.

Сообщения от кнопок:

Передаются в старшем слове wParam.

Имеют следующие значения:

BN_CLICKED 0

BN_PAINT 1

BN_HILITE 2

BN_UNHILITE 3

BN_DISABLE 4

BN_DOUBLECLICKED 5

Коды уведомления от 1 до 5 — это коды для кнопок устаревшего стиля BS_USERBUTTON, поэтому вы столкнетесь только с кодами BN_CLICKED

Стили нажимных кнопок, рекомендуемые размеров кнопок.

BS_PUSHBUTTON и BS_DEFPUSHBUTTON

Порядок работы с кнопками с использованием мыши и клавиатуры

Реагируют на пробел, надо забирать фокус, так как они принимают на себя и остальные клавиши, но не обрабатывают их.

Сообщения, которые используются для работы с нажимными кнопками.

Вы можете имитировать нажатие кнопки, посылая окну сообщение WM_SETSTATE. Следующий оператор приводит к нажатию кнопки:

SendMessage(hwndButton, BM_SETSTATE, 1, 0);

Следующий вызов заставляет кнопку вернуться к своему нормальному состоянию:

SendMessage(hwndButton, BM_SETSTATE, 0, 0);

Описатель окна hwndButton является возвращаемым значением функции CreateWindow

46. Кнопки флажки CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE их назначение. Создание кнопок в окне приложения, сообщения от кнопок. Управление кнопками со стороны приложения.

Флажки (check boxes) представляют из себя маленькие квадратные окна с текстом. В программах флажки обычно объединяются, что дает пользователю возможность установить опции. Флажки, как правило, действуют как двухпозиционные переключатели:

· один щелчок вызывает появление контрольной метки (галочки); другой щелчок приводит к исчезновению контрольной метки.

Существуют следущие стили флажков: CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE.

При использовании стиля BS_CHECKBOX нужно самостоятельно устанавливать контрольную метку, посылая сообщение BM_SETCHECK. Параметр wParam устанавливается в 1 для установки контрольной метки и в 0 для ее удаления. Можно получить текущее состояние флажка, посылая управляющее сообщение BM_GETCHECK. Имеется возможность использовать следующие инструкции для переключения метки Х при обработке сообщения WM_COMMAND:

 

SendMessage((HWND)lParam, BM_SETCHECK,(WPARAM)

!SendMessage((HWND)lParam, BM_GETCHECK, 0, 0),0);

 

Следует обратить внимание на операцию! перед вторым вызовом функции SendMessage. Значение параметра lParam является описателем дочернего окна, переданным в вашу оконную процедуру сообщением WM_COMMAND. Если позже понадобится узнать состояние кнопки, следует послать ей другое сообщение BM_GETCHECK. Можно также сохранять текущее состояние контрольной метки в статической переменной внутри своей оконной процедуры. Также можно инициализировать флажок BS_CHECKBOX меткой Х, посылая ему сообщение BM_SETCHECK:

SendMessage(hwndButton, BM_SETCHECK, 1, 0);

При стиле BS_AUTOCHECKBOX флажок сам включает или выключает контрольную метку. Наша оконная процедура может игнорировать сообщения WM_COMMAND. Если необходимо текущее состояние кнопки, следует послать сообщение BM_GETCHECK:

iCheck =(int) SendMessage(hwndButton, BM_GETCHECK, 0, 0);

Значение iCheck равно TRUE (не равно 0), если кнопка помечена, FALSE (или 0), если нет.

 

Теперь рассмотрим флажки BS_3STATE и BS_AUTO3STATE. Как показывают их имена, эти стили

могут отображать третье состояние — серый цвет внутри окна флажка — которое имеет место, когда посылается сообщение BM_SETCHECK с параметром wParam равным 2. Серый цвет показывает пользователю, что его выбор неопределен или не имеет отношения к делу. В этом случае флажок не может быть включен — т. е. он запрещает какой-либо выбор в данный момент. Однако, флажок продолжает посылать сообщения родительскому окну, если щелкать на нем мышью.

Окно флажка помещается в левой части и в центре относительно верхней и нижней сторон прямоугольника, который был задан при вызове функции CreateWindow. Щелчок мыши в любом месте внутри прямоугольника вызывает посылку родительскому окну сообщения WM_COMMAND. Минимальная высота флажка равна высоте символа. Минимальная ширина равна количеству символов в тексте плюс два.

 

47. Кнопки-переключатели RADIOBUTTON, AUTORADIOBUTTON их назначение. Создание кнопок в окне приложения, сообщения от кнопок. Управление кнопками со стороны приложения.

 

Переключатели (radio buttons) похожи на флажки, но их форма не квадратная, а круглая. Жирная точка внутри кружка показывает, что переключатель помечен. Переключатель имеет стиль окна BS_RADIOBUTTON или BS_AUTORADIOBUTTON, но последний используется только в окнах диалога. В окнах диалога группы переключателей, как правило, используются для индикации нескольких взаимоисключающих опций. В отличие от флажков, если повторно щелкнуть на переключателе, его состояние не изменится. При получении сообщения WM_COMMAND от переключателя, необходимо отобразить его отметку, отправив сообщение BM_SETCHECK с параметром wParam, равным 1:

SendMessage(hwndButton, BM_SETCHECK, 1, 0);

Для всех остальных переключателей этой группы можно отключить контрольную метку, послав сообщение. BM_SETCHECK с параметром wParam, равным 0:

SendMessage(hwndButton, BM_SETCHECK, 0, 0);

 

48. Работа с кнопками в окне приложений. Управление фокусом кнопок.

Нажимаемые кнопки, флажки, переключатели и кнопки, определяемые пользователем, получают фокус ввода при щелчке мыши на них. Признаком наличия фокуса ввода служит окружающая текст пунктирная линия. Когда дочерние окна управления получают фокус ввода, родительское окно теряет его; весь ввод с клавиатуры направлен теперь не на родительское окно, а на дочернее окно управления. Однако, дочернее окно управления реагирует только на клавишу <Spacebar>, которая в этот момент действует аналогично мыши. Такая ситуация создает очевидную проблему: ваша программа теряет контроль над обработкой сообщений клавиатуры. Давайте посмотрим, что можно с этим сделать.

Когда Windows переключает фокус ввода с одного окна (например, родительского) на

другое (например, дочернее окно управления), она первым делом посылает сообщение WM_KILLFOCUS окну, теряющему фокус ввода. Параметр сообщения wParam является описателем окна, которое должно получить фокус ввода. Затем Windows посылает сообщение WM_SETFOCUS окну, получающему фокус ввода, при этом параметр сообщения wParam является описателем окна, которое теряет фокус ввода. (В обоих случаях, wParam может быть равен NULL, который показывает, что нет окна, которое имеет или получает фокус ввода.)

Родительское окно, обрабатывая сообщения WM_KILLFOCUS, может предотвратить получение фокуса ввода дочерним окном.

Далее представлен более простой (но менее очевидный) способ добиться того же самого:

case WM_KILLFOCUS:

if(hwnd == GetParent((HWND) wParam))

SetFocus(hwnd);

return 0;

Однако, оба эти метода имеют недостатки: они не дают кнопкам возможности реагировать на клавишу <Spacebar>, поскольку кнопки никогда не получают фокус ввода. Лучше было бы дать кнопкам возможность получить фокус ввода, но при этом и пользователю обеспечить возможность переходить от кнопки к кнопке с помощью клавиши <Tab>.

 

48, а. Функции для изменения состояния дочерних окон на примере кнопок.

Если создается дочернее окно без WS_VISIBLE, то для его проявления нужна ф-я:

ShowWindow(hwndchild,SW_SHOWNORMAL)

ShowWindow(hwndchild,SW_HIDI)

IsWindowVisible(hwndchild).

Если окно становится недоступным, то оно не реагирует на клавиатуру и мышь и окрашивается в серый цвет.

EnableWindow(hwndchild,FALSe), если TRUE, то становится доступным

IsWindowEnable(hwndChild).

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

Оконная процедура с помощью функции GetParent получает описатель своего родительского окна (окна диалога) и посылает ему сообщение WM_COMMAND с параметром wParam равным идентификатору дочернего окна элемента управления, который получен с помощью функции GetWindowLong. Затем оконная процедура диалогового окна передает это сообщение процедуре диалога программы

 

48,в. Функции для изменения текста в дочерних окнах на примере кнопок.

Можно изменить текст кнопки (или любого другого окна) с помощью вызова функции SetWindowText:

SetWindowText(hwnd, pszString);

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

Имеется возможность получить текущий текст окна:

iLength = GetWindowText(hwnd, pszBuffer, iMaxLength);

Параметр iMaxLength задает максимальное число символов для копирования в буфер, который определяется указателем pszBuffer. Возвращаемым значением функции является длина скопированной строки. Можно подготовить свою программу для приема строки конкретной длины, вызвав сначала функцию:

iLength = GetWindowTextLength(hwnd);

 

 

49. Статические дочерние окна. Их назначение и создание в окне приложения. Стили статических окон.

Статическое окно «static» представляет собой прямоугольную область, в которой пользователь может выводить текст или bitmap. Это совершенно обычные дочерние окна. Они не получают сообщения от клавиатуры и не реагируют на мышь. Они не посылают сообщений WM_COMMAND обратно родительскому окну. Они служат дополнительным устройством вывода. Когда вы перемещаете мышь или щелкаете мышью над статическим дочерним окном, дочернее окно обрабатывает сообщение WM_NCHITTEST и возвращает в Windows значение HTTRANSPARENT. Это заставляет Windows послать то же сообщение WM_NCHITTEST расположенному внизу окну, которым обычно является родительское окно. Родительское окно, как правило, передает сообщение в DefWindowProc, где оно преобразуется в сообщение мыши рабочей области.

Вы можете создать статическое дочернее окно управления, используя класс окна "static" при вызове функции CreateWindow.

 

Можно задать 6 основных стилей:
SS_BLACKRECT

SS_GRAYRECT

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

SS_BLACKFRAME

SS_GRAYFRAME

SS_WHITEFRAME – рамки с заданным цветом, без закрашивания прямоугольника.

SS_ETCHEDHORZ, SS_ETCHEDVERT или SS_ETCHEDFRAME так же являются стилями для создания рамки с тенью.

Статический класс также включает в себя три стиля текста: SS_LEFT, SS_RIGHT и SS_CENTER. Они предназначены для выравнивания текста соответственно по левому краю, по правому краю и по центру. Статический класс также содержит стили окна SS_ICON и SS_USERITEM. Однако, эти стили не имеют смысла при использовании в качестве дочерних окон управления.

 

50. Использование статических окон как устройств вівода текста или картинок.

Статическое окно «static» представляет собой прямоугольную область, в которой пользователь может выводить текст или bitmap. Для стилей:

SS_BLACKRECT SS_BLACKFRAME

SS_GRAYRECT SS_GRAYFRAME

SS_WHITERECT SS_WHITEFRAME

поле текста окна функции CreateWindow игнорируется. Статический класс также включает в себя три стиля текста: SS_LEFT, SS_RIGHT и SS_CENTER. Они предназначены для выравнивания текста соответственно по левому краю, по правому краю и по центру.

Текст задается в параметре текста окна функции CreateWindow, и позднее он может быть изменен с помощью функции SetWindowText. Когда

оконная процедура кнопки управления статического класса выводит на экран этот текст, она использует функцию DrawText с параметрами DT_WORDBREAK, DT_NOCLIP и DT_EXPANDTABS. Текст помещается внутрь прямоугольника дочернего окна.

Фоном дочерних окон этих трех стилей обычно является COLOR_BTNFACE, а самого текста — COLOR_WINDOWTEXT.

Вы можете обрабатывать сообщения WM_CTLCOLORSTATIC для изменения цвета текста с помощью вызова функции SetTextColor, а для изменения цвета фона текста — с помощью вызова функции SetBkColor, возвращая при этом описатель кисти фона.

 

51. Введение новой оконной процедуры для управления фокусом дочерних окон управления и изменения функций дочерних окон.

Получить адрес стандартной оконной процедуры можно с помощью вызова функции GetWindowLong, в которой в качестве параметра используется идентификатор GWL_WNDPROC. Более того, вызывая функцию SetWindowLong, вы можете задать новую оконную процедуру. Это очень мощный прием, который называется "введение новой оконной процедуры". Он позволяет вам "влезть" в существующие внутри Windows оконные процедуры, обработать некоторые сообщения внутри вашей собственной программы, а все остальные сообщения оставить прежней оконной процедуре.

fnOldEdit = GetWindowLong (hWnd, GWL_WNDPROC, hEdit, NewProcEdit)

Такая конструкция вернет указатель на стандартную оконную процедуру Edit и перенаправляет сообщение редактора в NewProcEdit. Поскольку NewProcEditявляется функцией программы, которая вызывается операционной системой Windows, то она должна определяться как функция обратного вызова (CALLBACK). для установки адреса новой оконной процедуры, а также для получения адреса существующей оконной процедуры полосы прокрутки, используется функция SetWindowLong например:

fnOldScr =(WNDPROC) SetWindowLong(hwndScrol, GWL_WNDPROC,(LONG) ScrollProc));

Для вызова оконных процедур, вы должны использовать функцию CallWindowProc.

52. Класс редактирования(edit). Основные стили класса, назначение и использование окон редактирования.

Стили окна(Из Питзольда) Как уже говорилось, мы создаем управляющее окно редактирования, используя в качестве имени класса окна

"edit" при вызове функции CreateWindow. Стилем окна является WS_CHILD и еще несколько опций. Как и в статических дочерних окнах управления, текст в управляющих окнах редактирования может быть выравнен либо по левому краю, либо по правому, либо по центру. Формат можно задать с помощью стилей окна ES_LEFT, ES_RIGHT и ES_CENTER.

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

новую строку нужно нажимать клавишу <Enter>. Используя стиль окна ES_AUTOVSCROOL, в многострочное управляющее окно редактирования можно включить полосу вертикальной прокрутки. Если вы включите эти стили прокрутки в многострочные управляющие окна редактирования, то вы можете добавить полосы прокрутки к управляющему окну редактирования. Это делается путем использования тех же идентификаторов стиля окна, что и для недочерних окон: WS_HSCROLL и WS_VSCROLL. По умолчанию в управляющем окне редактирования отсутствует рамка окна. Добавить ее можно, используя стиль

WS_BORDER. У нас в лаб. Работе создавался такой стиль.

CreateWindow задается равным:

WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE |

ES_AUTOHSCROLL | ES_AUTOVSCROLL

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...