Скачать презентацию Интерфейс пользователя Оконный интерфейс Windows Desktop Window Скачать презентацию Интерфейс пользователя Оконный интерфейс Windows Desktop Window

11 Windows-1part.ppt

  • Количество слайдов: 56

Интерфейс пользователя Оконный интерфейс Windows Интерфейс пользователя Оконный интерфейс Windows

Desktop Window При запуске Windows автоматически создаётся системное окно desktop window Это окно отображается Desktop Window При запуске Windows автоматически создаётся системное окно desktop window Это окно отображается как фон на экране Это окно служит базовым для всех остальных окон Получить дескриптор этого окна можно с помощью Get. Desktop. Window()

Окно приложения Каждое графическое приложение создаёт минимум одно окно, называемое главным окном приложения Клиентская Окно приложения Каждое графическое приложение создаёт минимум одно окно, называемое главным окном приложения Клиентская область Область, где приложение отображает информацию Не клиентская область Заголовок n Меню n Кнопки минимизации, максимизации, закрытия n Рамка n Полосы прокрутки n Иконка Отображается системой n

Диалоговые окна и control’ы Control – специальное окно, которое используется для отображения или ввода Диалоговые окна и control’ы Control – специальное окно, которое используется для отображения или ввода определённого фрагмента информации n n n Кнопки Списки … Диалоговое окно – окно, в котором расположено несколько control’s. Как правило его не клиентская область устроена проще, чем главное окно приложения. Окно сообщений – специальный вид диалогового окна для отображения сообщений, создаётся функцией Message. Box()

Атрибуты окна Имя класса Имя окна Стиль окна Расширенный стиль Позиция Размер Окно родитель Атрибуты окна Имя класса Имя окна Стиль окна Расширенный стиль Позиция Размер Окно родитель и окно владелец Дескриптор меню или идентификатор дочернего окна Идентификатор экземпляра приложения Пользовательский параметр Дескриптор окна

Атрибуты окна Класс окна Каждое окно принадлежит к какому-нибудь классу. Класс окна определяет его Атрибуты окна Класс окна Каждое окно принадлежит к какому-нибудь классу. Класс окна определяет его поведение. Один из главных параметров класса – оконная процедура, обрабатывающая сообщения Класс регистрируется функциями Register. Class()/Register. Class. Ex()

Атрибуты окна Стили задают: Тип окна Наличие элементов не клиентской области Тип рамки Видимость Атрибуты окна Стили задают: Тип окна Наличие элементов не клиентской области Тип рамки Видимость окна Вид и функциональность control’ов

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

Типы окон Overlapped Окно верхнего уровня, у которого есть заголовок, рамка и клиентская область. Типы окон Overlapped Окно верхнего уровня, у которого есть заголовок, рамка и клиентская область. WS_OVERLAPPED или WS_OVERLAPPEDWINDOW. Pop-up Окно верхнего уровня которого может не быть заголовка, обычно диалоговое окно. WS_POPUP. Child Дочернее окно. WS_CHILD Layered Полупрозрачные окна. WS_EX_LAYERED. Message-Only Не отображаются, только для получения сообщений. Создаётся как дочернее для окна HWND_MESSAGE.

Оконные сообщения Система передаёт окну информацию с помощью сообщений Сообщение обрабатывается функцией окна (определённой Оконные сообщения Система передаёт окну информацию с помощью сообщений Сообщение обрабатывается функцией окна (определённой в классе окна) следующего вида: LRESULT CALLBACK Wnd. Proc(HWND h. Wnd, UINT message, WPARAM w. Param, LPARAM l. Param) h. Wnd – дескриптор окна message – тип сообщения w. Param и l. Param – параметры сообщения (зависят от типа)

Оконные сообщения Типы сообщений Системные сообщения (0 x 0000 -0 x 03 FF) n Оконные сообщения Типы сообщений Системные сообщения (0 x 0000 -0 x 03 FF) n n n Ввод с клавиатуры и мыши Создание и удаление окна Изменение состояния и параметров окна Запросы информации у окна Управление control’ами … Пользовательские сообщения (WM_USER=0 х04000 x 7 FFF) n Могут использоваться для классов окон приложения Для приложений версии 4. 0 предусмотрен дополнительный диапазон 0 х8000 -0 х. BFFF Register. Window. Message() позволяет регистрировать уникальные в рамках системы сообщения из диапазона 0 х. С 000 -0 х. FFFF

Оконные сообщения Цикл сообщений Сообщения передаются через очередь сообщений, которая создаётся для каждого потока Оконные сообщения Цикл сообщений Сообщения передаются через очередь сообщений, которая создаётся для каждого потока приложения, который создавал окна. Поток должен извлекать сообщения из очереди (Get. Message()), и передавать их соответствующим окнам (Dispatch. Message()). Необработанные сообщения функция окна передаёт функции Def. Window. Prog() которая обеспечивает обработку по умолчанию.

Оконные сообщения Отправка сообщений Сообщение окну отправляются функцией Send. Message: LRESULT Send. Message(HWND h. Оконные сообщения Отправка сообщений Сообщение окну отправляются функцией Send. Message: LRESULT Send. Message(HWND h. Wnd, UINT message, WPARAM w. Param, LPARAM l. Param) Если нам не важен код возврата можно воспользоваться Post. Message: BOOL Post. Message(HWND h. Wnd, UINT message, WPARAM w. Param, LPARAM l. Param)

Оконные сообщения Некоторые полезные сообщения WM_SIZE – изменён размер окна WM_PAINT – требуется отрисовать Оконные сообщения Некоторые полезные сообщения WM_SIZE – изменён размер окна WM_PAINT – требуется отрисовать окно WM_MOUSEMOVE – движение мыши в окне WM_LBUTTONDOWN/WM_LBUTTONUP – щелчок левой кнопки мыши WM_RBUTTONDBLCLK – двойной щелчок правой кнопки WM_KEYDOWN/WM_KEYUP – нажатие и отпускание клавиши WM_CHAR – пользователь ввёл букву WM_COMMAND – активирована команда меню или control WM_NOTIFY – уведомление от control’ов

Создание окна Если создаём своё окно необходимо зарегистрировать класс вызвав Register. Class()/Register. Class. Ex() Создание окна Если создаём своё окно необходимо зарегистрировать класс вызвав Register. Class()/Register. Class. Ex() Для создания окна вызываем Create. Window()/Create. Window. Ex() Для главного окна вызываем Show. Window() и Update. Window() для отображения окна. При создании окно получает сообщения WM_NCCREATE и WM_CREATE

Удаление окна Окно уничтожается вызовом функции Destroy. Window() Функция Destroy. Window(): n n n Удаление окна Окно уничтожается вызовом функции Destroy. Window() Функция Destroy. Window(): n n n Посылает сообщение WM_DESTROY и окну, а затем его потомкам Уничтожает потомков и само окно Последнее получаемое окном сообщение – WM_NCDESTROY. Для выхода из программы (цикла обработки сообщений) при уничтожении главного окна нужно вызвать Post. Quit. Message().

Пример Регистрация класса bool Register. Class(HINSTANCE h. Instance) { WNDCLASSEX wcex; wcex. cb. Size Пример Регистрация класса bool Register. Class(HINSTANCE h. Instance) { WNDCLASSEX wcex; wcex. cb. Size = sizeof(WNDCLASSEX); wcex. style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wcex. lpfn. Wnd. Proc = (WNDPROC)My_Wnd. Proc; wcex. cb. Cls. Extra = 0; wcex. cb. Wnd. Extra = 0; wcex. h. Instance = h. Instance; wcex. h. Icon = Load. Icon(h. Instance, (LPCTSTR)IDI_MY_ICON); wcex. h. Cursor = Load. Cursor(NULL, IDC_ARROW); wcex. hbr. Background = (HBRUSH)(COLOR_WINDOW+1); wcex. lpsz. Menu. Name = (LPCTSTR)IDC_MY_MENU; wcex. lpsz. Class. Name = “My_Win_Class"; wcex. h. Icon. Sm = Load. Icon(wcex. h. Instance, (LPCTSTR)IDI_SMALL); return Register. Class. Ex(&wcex)!=0; }

Пример Cоздание главного окна HWND Create. Main. Window(HINSTANCE h. Instance, int n. Cmd. Show) Пример Cоздание главного окна HWND Create. Main. Window(HINSTANCE h. Instance, int n. Cmd. Show) { HWND _h. Wnd = Create. Window(“My_Win_Class", “My. Window", WS_OVERLAPPED|WS_CAPTION, CW_USEDEFAULT, NULL, h. Instance, NULL); if (!_h. Wnd) { return 0; } Show. Window(_h. Wnd, n. Cmd. Show); Update. Window(_h. Wnd); return _h. Wnd; }

Пример Функция Win. Main int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, Пример Функция Win. Main int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPTSTR lp. Cmd. Line, int n. Cmd. Show) { MSG msg; HWND Main. Wnd; if(!Register. Class(h. Instance)) return FALSE; if((Main. Wnd=Create. Main. Window(h. Instance, n. Cmd. Show))==NULL) return FALSE; while (Get. Message(&msg, NULL, 0, 0)) { Translate. Message(&msg); Dispatch. Message(&msg); } return (int) msg. w. Param; }

Пример Функция окна LRESULT CALLBACK My_Wnd. Proc(HWND h. Wnd, UINT message, WPARAM w. Param, Пример Функция окна LRESULT CALLBACK My_Wnd. Proc(HWND h. Wnd, UINT message, WPARAM w. Param, LPARAM l. Param) { int wm. Event; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: if (LOWORD(w. Param)==IDM_EXIT) { Destroy. Window(h. Wnd); return TRUE; } break; case WM_PAINT: hdc = Begin. Paint(h. Wnd, &ps); Fill. Rect(dc, &ps. rc. Paint, (HBRUSH)Get. Stock. Object(WHITE_BRUSH)); End. Paint(h. Wnd, &ps); return TRUE; case WM_DESTROY: Post. Quit. Message(0); return TRUE; } return Def. Window. Proc(h. Wnd, message, w. Param, l. Param); }

Диалоговые окна / Dialog Box Используются для: Запроса дополнительной информации у пользователя Отображение информации/ввод Диалоговые окна / Dialog Box Используются для: Запроса дополнительной информации у пользователя Отображение информации/ввод опций пока пользователь работает в другом окне Типы: Модальные диалоговые окна Немодальные диалоговые окна

Диалоговые окна Общие свойства Автоматически создаются Windows вместе с дочерними окнами на основе заданного Диалоговые окна Общие свойства Автоматически создаются Windows вместе с дочерними окнами на основе заданного шаблона – ресурса Автоматически обеспечивают обработку дополнительных команд с клавиатуры (переход между control’ами) Имеются стандартные диалоговые окна: n n n Открытие/сохранение файлов Печать Выбор цвета Выбор шрифта Вывод сообщений …

Диалоговые окна Модальные диалоговые окна Создаётся для ввода параметров без возможности работать с другими Диалоговые окна Модальные диалоговые окна Создаётся для ввода параметров без возможности работать с другими окнами приложения Должно быть окном верхнего уровня (pop-up) При создании становится активным окном и остаётся таким до завершения работы Автоматически отключается (disable) окновладелец и все его дети, и соответственно они не получают ввода пользователя Сообщения обрабатываются в специальном цикле сообщений.

Диалоговые окна Немодальные диалоговые окна Создаётся для одновременной работы с другими окнами приложения Должно Диалоговые окна Немодальные диалоговые окна Создаётся для одновременной работы с другими окнами приложения Должно быть окном верхнего уровня (pop-up) При создании становится активным окном, но в процессе работы может стать не активным Не отключает окно-владельца За обработку сообщений отвечает приложение. Приложение должно закрыть все немодальные диалоговые окна перед выходом.

Модальные диалоговые окна Работа с окном Создаётся шаблон в редакторе ресурсов Разрабатывается функция диалогового Модальные диалоговые окна Работа с окном Создаётся шаблон в редакторе ресурсов Разрабатывается функция диалогового окна Окно создаётся функциями INT_PTR Dialog. Box(HINSTANCE h. Instance, LPCTSTR lp. Template, HWND h. Wnd. Parent, DLGPROC lp. Dialog. Func); или INT_PTR Dialog. Box. Param(HINSTANCE h. Instance, LPCTSTR lp. Template, HWND h. Wnd. Parent, DLGPROC lp. Dialog. Func, LPARAM dw. Init. Param ); Для завершения работы окна вызывается функция BOOL End. Dialog( HWND h. Dlg, INT_PTR n. Result ); Код возврата, переданный End. Dialog, возвращается функцией Dialog. Box/Dialog. Box. Param

Немодальные диалоговые окна Работа с окном Создаётся шаблон в редакторе ресурсов Разрабатывается функция диалогового Немодальные диалоговые окна Работа с окном Создаётся шаблон в редакторе ресурсов Разрабатывается функция диалогового окна Окно создаётся функциями HWND Create. Dialog(HINSTANCE h. Instance, LPCTSTR lp. Template, HWND h. Wnd. Parent, DLGPROC lp. Dialog. Func); или HWND Create. Dialog. Param(HINSTANCE h. Instance, LPCTSTR lp. Template, HWND h. Wnd. Parent, DLGPROC lp. Dialog. Func, LPARAM dw. Init. Param ); Для корректной работы окна в цикле обработки сообщений необходимо вызывать функцию BOOL Is. Dialog. Message( HWND h. Dlg, LPMSG lp. Msg); Окно уничтожается BOOL Destroy. Window(HWND h. Dlg)

Диалоговые окна Функция окна BOOL CALLBACK Dlg. Proc(HWND hwnd. Dlg, UINT message, WPARAM w. Диалоговые окна Функция окна BOOL CALLBACK Dlg. Proc(HWND hwnd. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) Обрабатывает сообщения, адресованные диалоговому окну, например: n WM_INITDIALOG Посылается после создания диалогового окна и всех контролов n WM_COMMAND Посылается окну контролами, когда пользователь выполняет над ними действие (нажимает на кнопку, …) Для необработанных сообщений возвращаем FALSE

Диалоговые окна Функции для работы с контролами Вместо дескриптора используется идентификатор дочернего окна, назначаемый Диалоговые окна Функции для работы с контролами Вместо дескриптора используется идентификатор дочернего окна, назначаемый в редакторе ресурсов. Получить дескриптор дочернего окна HWND Get. Dlg. Item( HWND h. Dlg, int n. IDDlg. Item); Установить/получить текст окна BOOL Set. Dlg. Item. Text( HWND h. Dlg, box int n. IDDlg. Item, LPCTSTR lp. String); UINT Get. Dlg. Item. Text( HWND h. Dlg, box int n. IDDlg. Item, LPTSTR lp. String, int n. Max. Count); Установить/получить состояние кнопки BOOL Check. Dlg. Button( HWND h. Dlg, int n. IDButton, UINT u. Check); UINT Is. Dlg. Button. Checked( HWND h. Dlg, int n. IDButton);

Пример Диалоговое окно IDD_DIALOG IDC_EDIT 1 IDCANCEL IDOK Пример Диалоговое окно IDD_DIALOG IDC_EDIT 1 IDCANCEL IDOK

Пример – модальный диалог Функция окна BOOL CALLBACK My_Dlg. Proc(HWND h. Dlg, UINT message, Пример – модальный диалог Функция окна BOOL CALLBACK My_Dlg. Proc(HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { bool ok; int val; switch (message) { case WM_INITDIALOG: Set. Dlg. Item. Int(h. Dlg, IDC_EDIT 1, 100, false); return TRUE; case WM_COMMAND: if (LOWORD(w. Param)==IDOK) { val=Get. Dlg. Item. Int(h. Dlg, IDC_EDIT 1, &ok, false); if(ok) End. Dialog(h. Dlg, val); else Message. Beep(0 x. FFFF); } else if (LOWORD(w. Param)==IDCANCEL) End. Dialog(h. Dlg, -1); return TRUE; default: return FALSE; } }

Пример – модальный диалог Использование диалогового окна int val; val=Dialog. Box(h. Instance, MAKEINTRESOURCE(IDD_DIALOG), h. Пример – модальный диалог Использование диалогового окна int val; val=Dialog. Box(h. Instance, MAKEINTRESOURCE(IDD_DIALOG), h. Main. Wnd, My_Dlg. Proc); if(val>0) { // пользователь ввёл число } else { // нажата кнопка отмена }

Пример – не модальный диалог Функция окна BOOL CALLBACK My_Dlg. Proc(HWND h. Dlg, UINT Пример – не модальный диалог Функция окна BOOL CALLBACK My_Dlg. Proc(HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { char str[100]; switch (message) { case WM_INITDIALOG: Set. Dlg. Item. Text(h. Dlg, IDC_EDIT 1, (char *)l. Param); return TRUE; case WM_COMMAND: if (LOWORD(w. Param)==IDOK) { Get. Dlg. Item. Text(h. Dlg, IDC_EDIT 1, str, 99); Send. Message(h. Main. Wnd, WM_USER, 0, (LPARAM)str); } if(LOWORD(w. Param)==IDCANCEL) Destroy. Window(h. Dlg); default: return FALSE; } }

Пример – не модальный диалог Создание и цикл сообщений … HWND h. Dlg=Create. Dialog. Пример – не модальный диалог Создание и цикл сообщений … HWND h. Dlg=Create. Dialog. Param(h. Instance, MAKEINTRESOURCE(IDD_DIALOG), h. Main. Wnd, My_Dlg. Proc, (LPARAM)“Default Text”); … MSG msg; while (Get. Message(&msg, NULL, 0, 0)) { if(!Is. Dialog. Message(h. Dlg, &msg)) { Translate. Message(&msg); Dispatch. Message(&msg); } }

Пользовательский ввод Пользовательский ввод

Пользовательский ввод Модель ввода с клавиатуры При нажатии на клавишу клавиатура генерирует два скан-кода: Пользовательский ввод Модель ввода с клавиатуры При нажатии на клавишу клавиатура генерирует два скан-кода: при нажатии и отпускании клавиши Драйвер клавиатуры транслирует скан-коды в виртуальный код клавиши. Сообщение, включающее скан-код, виртуальный код и другую информацию помещается в системную очередь ввода Из системной очереди сообщение перемещается в очередь одного из приложений Цикл сообщений приложения извлекает сообщение из очереди и передаёт его на обработку окну

Пользовательский ввод Фокус клавиатуры Фокус – временное свойство окна, которое определяет какому окну передаются Пользовательский ввод Фокус клавиатуры Фокус – временное свойство окна, которое определяет какому окну передаются сообщения о клавиатурном вводе Окно, которое обладает фокусом это либо активное окно, либо потомок активного окна Узнать/установить фокус можно функциями: HWND Get. Focus(VOID); HWND Set. Focus(VOID); Система уведомляет окна об изменении фокуса сообщениями WM_KILLFOCUS WM_SETFOCUS

Пользовательский ввод Виды сообщений клавиатуры Нажатие на системные клавиши (нажат ALT) n n WM_SYSKEYDOWN Пользовательский ввод Виды сообщений клавиатуры Нажатие на системные клавиши (нажат ALT) n n WM_SYSKEYDOWN WM_SYSKEYUP Cодержат виртуальный код, скан-код, счётчик повтора, … Нажатие на обычные клавиши n n WM_KEYDOWN WM_KEYUP Cодержат виртуальный код, скан-код, счётчик повтора, … Символьные сообщения n n WM_SYSCHAR WM_CHAR Генерируются функцией Translate. Message. Содержат код символа, скан-код, счётчик повтора, …

Пользовательский ввод Состояние клавиш Как узнать, нажат ли shift, ctrl, ещё какие-то клавиши? Во Пользовательский ввод Состояние клавиш Как узнать, нажат ли shift, ctrl, ещё какие-то клавиши? Во время генерации обрабатываемого сообщения: SHORT Get. Key. State( int n. Virt. Key // virtual-key code ); Сейчас: SHORT Get. Async. Key. State( int v. Key // virtual-key code );

Пользовательский ввод Сообщения мыши Активность мыши в клиентской области окна WM_MOUSEMOVE WM_[L, R, M, Пользовательский ввод Сообщения мыши Активность мыши в клиентской области окна WM_MOUSEMOVE WM_[L, R, M, X]BUTTONUP/WM_[L, R, M, X]BUTTONDOWN WM_[L, R, M, X]BUTTONDBLCLK Активность мыши в неклиентской области окна WM_NCMOUSEMOVE WM_NC[L, R, M, X]BUTTONUP/WM_NC[L, R, M, X]BUTTONDOWN Сообщение WM_NCHITTEST Отправляется системой при каждом действии мыши, для определения области окна, в которой находится мышь. Обрабатывается Def. Window. Proc. Колесо прокрутки WM_MOUSEWHEEL

Пользовательский ввод Захват мыши Обычно система отправляет сообщения о перемещении мыши тому окну, над Пользовательский ввод Захват мыши Обычно система отправляет сообщения о перемещении мыши тому окну, над которым находится указатель. Можно заставить систему направлять сообщения всегда одному окну с помощью HWND Set. Capture( HWND h. Wnd ); Отказаться от этого режима можно вызвав BOOL Release. Capture(VOID); Только активное окно может захватить мышь

Графика в окнах Графика в окнах

Графика в окнах За рисование в окнах отвечает модуль GDI Рисовать мы можем только Графика в окнах За рисование в окнах отвечает модуль GDI Рисовать мы можем только на графическом контексте. Контексты бывают n n n Для окна Для принтера Для рисования на битмапе в памяти Стили рисования задаются специальными объектами n n n Pen Brush Font

Графический контекст для рисования в окне Контекст для рисования в клиентской области HDC Get. Графический контекст для рисования в окне Контекст для рисования в клиентской области HDC Get. DC( HWND h. Wnd); Контекст для рисования во всём окне HDC Get. Window. DC( HWND h. Wnd); Освобождение контекста int Release. DC( HWND h. Wnd, HDC h. DC); Внутри обработчика WM_PAINT обязательно использовать: n n Для получения контекста w HDC Begin. Paint( HWND hwnd, LPPAINTSTRUCT lp. Paint); Для освобождения контекста w HDC End. Paint( HWND hwnd, CONST PAINTSTRUCT *lp. Paint);

Стили линий и контуров Стиль линий и контуров задаётся объектом Pen HPEN Create. Pen( Стили линий и контуров Стиль линий и контуров задаётся объектом Pen HPEN Create. Pen( int fn. Pen. Style, // pen style (PS_SOLID, PS_DOT, …) int n. Width, // pen width COLORREF cr. Color // pen color RGB(red, green, blue) ); Для активации стиля его нужно «выбрать» : HGDIOBJ Select. Object( HDC hdc, // handle to DC HGDIOBJ hgdiobj // handle to object ); После использования стиль нужно удалить BOOL Delete. Object( HGDIOBJ h. Object // handle to graphic object );

Стили заливки Стиль линий и контуров задаётся объектом Brush HBRUSH Create. Solid. Brush( COLORREF Стили заливки Стиль линий и контуров задаётся объектом Brush HBRUSH Create. Solid. Brush( COLORREF cr. Color // brush color value ); HBRUSH Create. Hatch. Brush( int fn. Style, // hatch style COLORREF clrref // foreground color ); HBRUSH Create. Pattern. Brush( HBITMAP hbmp // handle to bitmap ); …

Стандартные стили и цвета Стандартные стили HGDIOBJ Get. Stock. Object( int fn. Object); BLACK_BRUSH, Стандартные стили и цвета Стандартные стили HGDIOBJ Get. Stock. Object( int fn. Object); BLACK_BRUSH, DKGRAY_BRUSH, LTGRAY_BRUSH, WHITE_BRUSH, NULL_BRUSH BLACK_PEN, WHITE_PEN, … Системные цвета DWORD Get. Sys. Color( int n. Index); COLOR_3 DDKSHADOW, COLOR_ACTIVEBORDER, … Системные кисти HBRUSH Get. Sys. Color. Brush( int n. Index);

Система координат По умолчанию n n начало координат в верхнем левом углу ось x Система координат По умолчанию n n начало координат в верхнем левом углу ось x направлена направо ось у направлена вниз единица измерения соответствует 1 пикселю Могут быть заданы другие координатные системы, имеющие другую ориентацию осей, масштабы, … Преобразование координат происходит в три этапа n n n Пользовательская СК в СК страницы в СК устройства в физическую СК

Функции рисования Линии BOOL Move. To. Ex( HDC hdc, int X, int Y, LPPOINT Функции рисования Линии BOOL Move. To. Ex( HDC hdc, int X, int Y, LPPOINT lp. Old. Pos); BOOL Line. To( HDC hdc, int n. XEnd, int n. YEnd); Прямоугольники int Fill. Rect( HDC h. DC, CONST RECT *lprc, HBRUSH hbr); BOOL Round. Rect( HDC hdc, int n. Left. Rect, int n. Top. Rect, int n. Right. Rect, int n. Bottom. Rect, int n. Width, int n. Height); Эллипсы BOOL Ellipse( HDC hdc, int n. Left. Rect, int n. Top. Rect, int n. Right. Rect, int n. Bottom. Rect); …

Текст и шрифты Стиль шрифта задаётся объектом Font, создаваемым функцией Create. Font(). Цвет текста Текст и шрифты Стиль шрифта задаётся объектом Font, создаваемым функцией Create. Font(). Цвет текста и фона COLORREF Set. Text. Color( HDC hdc, COLORREF cr. Color); COLORREF Set. Bk. Color( HDC hdc, COLORREF cr. Color); Выравнивание UINT Set. Text. Align( HDC hdc, UINT f. Mode); TA_TOP, TA_BOTTOM, TA_LEFT, TA_RIGHT, … Вывод BOOL Text. Out( HDC hdc, int n. XStart, int n. YStart, LPCTSTR lp. String, int cb. String); BOOL Ext. Text. Out …

Порядок перерисовки окна Порядок поступления сообщений: WM_ERASEBACKGORUND По умолчанию обрабатывается Def. Window. Proc, которая Порядок перерисовки окна Порядок поступления сообщений: WM_ERASEBACKGORUND По умолчанию обрабатывается Def. Window. Proc, которая закрашивает всю клиентскую область цветом фона, указанным при регистрации класса окна. WM_PAINT Обрабатывается только функцией окна пользователя. Необходимо использовать Begin. Paint и End. Paint для того, чтобы Windows могла обновить информацию о корректно отрисованных областях окна. Такая двухуровневая схема приводит к мерцанию изображения в окне при перерисовке

Как избавиться от мерцания? Надо рисовать всё в одном месте: n n Перехватить WM_ERASEBACKGORUND Как избавиться от мерцания? Надо рисовать всё в одном месте: n n Перехватить WM_ERASEBACKGORUND и ничего не делать, всё рисовать (включая фон) при обработке WM_PAINT. Ничего не рисовать в обработке WM_PAINT, всё рисовать в обработчике WM_ERASEBACKGORUND. Мерцание может сохраниться, так как мы всё равно как правило сначала «стираем» фон, а затем рисуем на нём текст, линии, … Также может потребоваться рисование перекрывающихся объектов. n От этого спасет только двойная буферизация

Двойная буферизация 1. 2. 3. 4. Создаём графический контекст для памяти Создаём битмап размером Двойная буферизация 1. 2. 3. 4. Создаём графический контекст для памяти Создаём битмап размером с нашу клиентскую область (или картинку) и выбираем его в созданный контекст Долго рисуем на этом контексте сложную картинку - пользователь этого не видит Копируем получившееся изображение на графический контекст окна – вся картинка появляется единовременно Если изменений не было, то мы можем использовать готовую картинку в обработчике WM_PAINT / WM_ERASEBACKGROUND Небольшие динамические вещи (выделение объектов, отслеживание мыши) можно рисовать «обычным» способом после копирования или через второй буфер. В обработчике WM_SIZE (изменение размеров окна) пересоздаём битмап правильного размера

Двойная буферизация 1. Создаём графический контекст для памяти HDC Create. Compatible. DC( HDC hdc); Двойная буферизация 1. Создаём графический контекст для памяти HDC Create. Compatible. DC( HDC hdc); // hdc=NULL 2. Создаём битмап размером с нашу клиентскую область (или картинку) HBITMAP Create. Compatible. Bitmap( HDC hdc, int n. Width, int n. Height); HBITMAP Create. DIBSection(…); - если нам нужен прямой доступ к памяти изображения и выбираем его в созданный контекст HGDIOBJ Select. Object( HDC hdc, HGDIOBJ hgdiobj); 4. Копируем получившееся изображение на графический контекст окна BOOL Bit. Blt( … ); BOOL Stretch. BLT( … ); …

Очереди сообщений Очереди сообщений

Очереди сообщений Очередь сообщений создаётся для каждого потока, который использует функции USER или GDI Очереди сообщений Очередь сообщений создаётся для каждого потока, который использует функции USER или GDI Способы помещения сообщений в очередь: n n Post Send Как поместить сообщение в очередь, не указывая окно n n В очередь своего потока - задать NULL вместо идентификатора окна Использовать Post. Thread. Message(). Широковещательная передача n n Указать HWND_BROADCAST – всем окнам верхнего уровня Broadcast. System. Message – можно указать получателей (драйвера, . . . ) Некоторые сообщения доставляются напрямую процедуре окна

Очереди сообщений Порядок извлечения сообщений Отправленные Send Отправленные Post Сообщения аппаратного ввода и внутренние Очереди сообщений Порядок извлечения сообщений Отправленные Send Отправленные Post Сообщения аппаратного ввода и внутренние системные сообщения Отправленные Send WM_PAINT – если было несколько, объединяются; остаются в очереди пока не будут обработаны. WM_TIMER