Функции перемещения окон

Для перемещения и изменения размеров окна hwnd вызывают функцию MoveWindow. Ей передают новые координаты окна.

Функция MoveWindow объявлена следующим образом:

BOOL MoveWindow(HWND hwnd,

int x, //новая координата левого края окна

int У, //новая координата верхнего края окна

int nWidth, //новая ширина окна

int nHeight, //новая высота окна

BOOL bRepaint //флажок перекрашивания окна

);

Если bRepaint = TRUE, немедленно после перемещения перерисовываются те части экрана, на которых отразилось перемещение окна. Иначе окно перерисовывает себя только после обработки всех поступивших к моменту перемещения сообщений. При успешном выполнении функция возвращает ненулевое значение, иначе – нуль.

Функция SetWindowPos изменяет координаты окна hwnd на экране и его расположение по отношению к другим окнам:

BOOL SetWindowPos(HWND hwnd,

HWND hWndInsertAfter, //дескриптор порядка размещения

int x, //новая координата левого края

int у, //новая координата верхнего края

int сх, //новая ширина

int су, //новая высота

UINT uFlags //флажок позиционирования

);

В случае успешного выполнения она возвращает ненулевое значение. Параметр hWndInsertAfter может быть дескриптором предшествующего окна или равным одному из следующих значений:

Значение Пояснение
HWND_BOTTOM Помещает окно ниже других окон
HWND_NOTOPMOST Помещает временное или дочернее окно выше временных и дочерних, но ниже перекрывающихся окон
HWND_TOP Помещает окно выше всех окон
HWND_TOPMOST То же, что HWND_NOTOPMOST, но окно сохраняет позицию после потери активности

Параметр uFlags может быть комбинацией значений из нижеследующей таблицы:

Значение Пояснение
SWP_DRAWFRAME Вокруг окна рисовать заданную в классе окна рамку
SWP_FRAMECHANGED Функции окна посылать сообщение об изменении размеров, даже если размер окна не изменяется
SWP_HIDEWINDOW Скрыть окно
SWP_NOACTIVATE Отменить активность окна
SWP_NOCOPYBITS Стереть содержимое рабочей области
SWP_NOMOVE Сохранить текущую позицию
SWP_NOOWNERZORDER или SWP_NOREPOSITION Не изменять расположение окна относительно других окон
SWP_NOREDRAW Не перерисовывать содержимое окна
SWP_NOSENDCHANGING Не сообщать об изменении позиции
SWP_NOSIZE Сохранить текущий размер
SWP_NOZORDER Не менять расположение
SWP_SHOWWINDOW Показать окно

При одновременной работе нескольких приложений одно из них можно вывести на передний план и передать его окну фокус ввода.

Для этих целей используют функцию SetForegroundWindow. Она помещает поток, который создал заданное окно, на передний план и активизирует это окно. Синтаксис этой функции:

BOOL SetForegroundWindow (HWND hwnd);

В случае успешного перемещения функция возвращает ненулевое значение, иначе – нуль.

Для перемещения окна важно знать системные метрики экрана и окна. Их получают с помощью функции GetSystemMetrics. Она возвращает метрики и текущие установки конфигурации системы. Метрики системы – это габариты (ширина и высота) отображаемых элементов Windows. Все габариты возвращаются в пикселях.

Функция GetSystemMetrics объявлена следующим образом:

int GetSystemMetrics (int nIndex);

Параметр nIndex указывает на возвращаемую метрику системы или установку конфигурации. Ниже приводится таблица некоторых имен для этого параметра:

Имя Возвращаемая характеристика
SM_CXMIN Минимальная ширина окна
SM_CYMIN Минимальная высота окна
SM_CXSCREEN Ширина экрана
SM_CYSCREEN Высота экрана
SM_CYCAPTION Высота заголовка
SM_CYMENU Высота полосы меню

Например, следующий оператор определяет ширину экрана:

int w=GetSystemMetrics(SM_CXSCREEN);

Следующая функция позволяет получить координаты обрамляющего окно hwnd прямоугольника:

BOOL GetWindowRect(HWND hwnd, LPRECT lpRect);

Параметр lpRect указывает на структуру типа RECT:

typedef struct

{ LONG left; //левый край

LONG top; //верхний край

LONG right; //правый край

LONG bottom; //нижний край

} RECT;

Координаты прямоугольника отсчитываются от левого верхнего угла экрана в пикселях. В случае успешного выполнения функция возвращает ненулевое значение. Следующий фрагмент демонстрирует получение экранных координат прямоугольника окна:

RECT rc;

GetWindowRect(hwnd, &rc);

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

BOOL GetClientRect(HWND hwnd, LPRECT lpRect);

При этом прямоугольник смещен в левый верхний угол экрана. То есть rc.left = rc.top = 0, а значения полей right и bottom равны соответственно ширине и высоте рабочей области.

1.6.3. Сообщения приложения для пользователя

Для вывода текстовых сообщений и получения ответа пользователя применяют окно сообщения. Функция MessageBox создает, отображает, обеспечивает работу и закрывает окно сообщения:

int WINAPI MessageBox (

HWND hwnd, //Дескриптор родительского окна

LPCTSTR lpText, //Адрес текста сообщения

LPCTSTR lpCaption, //Адрес заголовка окна сообщения

UINT uType //Стиль окна сообщения

);

Если hwnd = NULL, окно сообщения не имеет родительского окна. При lpCaption = NULL в заголовке по умолчанию выводится строка "Ошибка".

Параметр uType задают в виде комбинации флажков, определяющих содержание и поведение окна сообщения.

Следующие флаги определяют список кнопок окна сообщения:

Флаг Список имен кнопок
MB_ABORTRETRYIGNORE "Стоп", "Повтор" и "Пропустить"
МВ_ОК ОК
MB_OKCANCEL ОК и "Отмена"
MB_RETRYCANCEL "Повтор" и "Отмена"
MB_YESNO "Да" и "Нет"
MB_YESNOCANCEL "Да", "Нет" и "Отмена"

Жирным шрифтом выделены кнопки по умолчанию. По умолчанию активна первая кнопка. Следующие флаги могут назначить одну из кнопок активной по умолчанию:

Флаг Номер кнопки Флаг Номер кнопки
MB_DEFBUTTON1 Первая MB_DEFBUTTON3 Третья
MB_DEFBUTTON2 Вторая MB_DEFBUTTON4 Четвертая

Следующие флаги включают одну иконку в окно сообщения:

Флаги Вид иконки
MB_ICONEXCLAMATION, MB_ICONWARNING Восклицательный знак
MB_ICONINFORMATION, MB_ICONASTERISK Символ i
MB_ICONQUESTION Знак вопроса
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND Знак остановки

Следующие флаги определяют стиль окна сообщения:

Флаг Пояснение
MB_APPLMODAL Этот стиль по умолчанию. Окно hwnd переводится в неактивное состояние на время работы окна сообщения, но можно активизировать другие приложения или окна, не дочерние по отношению к hwnd
MB_SYSTEMMODAL На время работы окна сообщения все другие приложения в неактивном состоянии
MB_TASKMODAL Этот стиль подобен MB_APPLMODAL. Но если родительское окно не указано (hwnd = NULL), блокируются все перекрывающиеся окна этого приложения
MB_HELP Добавляет кнопку "Справка" в окне сообщения
MB_RIGHT Текст выравнивается по правому краю
MB_RTLREADING Отображает символы сообщения и текста заголовка в направлении справа налево
MB_SETFOREGROUND Окно сообщения выдвигается на передний план

Приложение может обработать ответ пользователя на сообщение, анализируя возвращаемое функцией MessageBox значение. В случае ошибки возвращается 0. Иначе функция MessageBox возвращает константу, соответствующую нажатой кнопке. Ниже перечислены имена констант, соответствующие кнопкам окна сообщения:

Константа Нажата кнопка Константа Нажата кнопка
IDABORT "Стоп" IDOK ОК
IDCANCEL "Отмена" IDRETRY "Повтор"
IDIGNORE "Пропустить" IDYES "Да"
IDNO "Нет"    

Если окно сообщения содержит кнопку "Отмена", то значение IDCANCEL может быть возвращено и при нажатии клавиши Esc.

Windows предусматривает возможность выдачи и звуковых "сообщений". Например, при вызове функции MessageBeep компьютер проигрывает "звук" из множества зарегистрированных в системе "звуков". Синтаксис этой функции:

BOOL MessageBeep(UINT uType);

Параметр uType этой функции определяет звуковой тип и принимает одно из следующих значений:

Значение Обозначение в файле win.ini
0xFFFFFFFF или -1 Стандартный звуковой сигнал
MB_ICONASTERISK SystemAsterisk
MB_ICONEXCLAMATION SystemExclamation
MB_ICONHAND SystemHand
MB_ICONQUESTION SystemQuestion
МВ_ОК или 0 SystemDefault

В случае успешного выполнения функция возвращает ненулевое значение, иначе – 0. После передачи сообщения о формировании звука, функция MessageBeep прекращает работу. Далее выполняются последующие операторы приложения, и одновременно проигрывается указанный звук.

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

Для этой цели используют функцию FlashWindow, которая за один вызов один раз изменяет подсветку указанного окна:

BOOL FlashWindow(

HWND hwnd, //Дескриптор подсвечиваемого окна

BOOL bInvert //Параметр подсветки

);

Если параметр bInvert = TRUE, окно меняет подсветку. Если же bInvert = FALSE, окно только возвращается к исходному состоянию.

При подсветке неактивное окно может принять внешний вид активного окна, но не получит фокуса ввода.

Если окно было активно до вызова FlashWindow, возвращается ненулевое значение. Если окно не было активно, возвращается 0.

Пример 1.1.

После нажатия левой клавиши мыши над окном hwnd 5 раз изменить подсветку неактивного окна OwnedHwnd.

Следующий фрагмент описывает версию решения этой задачи:

case WM_LBUTTONDOWN:

{ FlashWindow(OwnedHwnd, TRUE);

for (int i=0; i<9; i++)

{ for (long j=0;j<1e7;j++);

FlashWindow(OwnedHwnd, TRUE);

}

return 0;

}

После нажатия левой клавиши мыши окно OwnedHwnd примет вид активного окна:

FlashWindow(OwnedHwnd, TRUE);

При i = 0 выполняется некая "работа", обозначенная циклом

for (long j=0; j<1e7; j++);

Эта работа сводится к простой задержке времени. После этой паузы окно OwnedHwnd примет вид неактивного окна. При i = 1 после паузы окно OwnedHwnd примет вид активного окна, а при i = 2 после паузы окно OwnedHwnd примет вид неактивного окна... Таким образом, окно OwnedHwnd 5 раз изменяет свой внешний вид.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: