Int winapi winmain hinstance IH. Hinstance TP. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Int winapi winmain hinstance IH. Hinstance TP.



LPSTR cmdline, int cmd_show) {

// код главной функции приложения

}

где: th - дескриптор экземпляра применения, который можно использовать для идентификации выполняемой копии применения;

cmdline - командная строка, заданная во время запуска применения;

cmd_show - код, который определяет, как предусмотрено отображать главное окно применения (Sw_maximize, Sw_minimize и тому подобное).

В коде Winmain() в первую очередь нужно зарегистрировать класс главного окна применение. Класс окна отображают структурой WNDCLASS, для которой нужно задать ряд полей, в частности:

· LpszClassName - имя класса, под которым он будет зарегистрирован;

· LpfnWndProc - адрес процедуры окна, которую система будет вызывать с появлением сообщений, адресованных этому окну;

· hIcon - дескриптор пиктограммы этого окна (она будет отображаться в его заглавии или на панели задач; для получения такого дескриптора используют функцию LoadIcon());

· hCursor - дескриптор курсорa, который будет отображаться над окном; для его получения используют функцию LoadCursor());

· hbrBackground - дескриптор специального объекта { кисти, brash), что определяет фоновый цвет этого окна (стандартный цвет фона может быть задан добавлением единице к заранее определенной константе COLOR_WINDOW).

Регистрация класса окна дает возможность размещать в памяти и отображать окна такого класса. Для размещения окна в памяти используют функцию Create-Window():

HWND CreateWindow(LPCTSTR classname. LPCTSTR title. DWORD style,

Int x. int y. int width, int height. HWND ph. HMENU mh.

HINSTANCE ih. LPVOID param);

где: classname - имя, под которым был зарегистрирован класс этого окна;

title - текст, видображуваний в заглавии окна;

style - стиль окна, который определяет способ его отображения (WS_OVERLAPPED-WIND0W - стандартное окно с заглавием и керуючим меню);

х и y - координаты левого верхнего угла окна,

width и height - его ширина и высота (эти величины задают в специальных виртуальных единицах, которые упрощают масштабирование);

ih - дескриптор применения, которое создает окно (как значения передают соответствующий параметр WinMain()).

Эта функция возвращает дескриптор окна (значение типа HWND), с помощью которого можно получить доступ к размещенному в памяти объекту окна, например для его отображения.

HWND hwnd - CreateWindow("myclass". "Пример применения".

WS_OVERLAPPEDWINDOW. 0. 0. 300. 200. NULL. NULL, hinst. NULL);

Для отображения окна используют функцию ShowWindow():

ShowWindow(hwnd. cmd_show);

После того как окно было отображено, нужно организовать цикл обработки сообщений. В нем необходимо получить сообщение с помощью функции GetMessage(), превратить его с помощью функции TransLateMessage() и передать в функцию окна для последующей обработки вызовом DispatchMessage(). Все эти функции используют структуру сообщения, которое принадлежит к типа MSG.

Использование функции TransLateMessage() необходимо во время обработки сообщений от клавиатуры (нажатия клавиш превращаются в сообщения, которые содержат введешь символы).

Цикл завершается, когда у него поступает сообщение завершения (с кодом WM_QUIT), в результате чего GetMessage() повернет нуль.

MSG msg:

while(GetMessage(&msg. NULL. 0. 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

Значением, которое повернет WinMain(), должно быть значение поля wparam структуры сообщения:

return (int)msg.wParam:

Разработка функции окна

Функция окна определяется так:

long CALLBACK wnd_proc(HWND hwnd. UINT msgcode. WPARAM wp. LPARAM lp) {

// обработка сообщений, адресованных окну

}

где: hwnd - дескриптор соответствующего окна;

msgcode - код сообщения, которое поступило;

wp, lp - дополнительные данные, которые могут сопровождать сообщение (отвечают полям wParam и lParam структуры сообщения).

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

switch (msgcode) {

case код-уведомление 1:

// действия по обработке уведомления

case код-уведомления2:

// действия по обработке уведомления2 и т.д.

}

Есть много разных сообщений, здесь реализуем выполнение действий в случае получения двух из них:

Wm_PAINT - поступает окну каждый раз, когда его содержание нужно изменить (в случае отображения, активизации, перемещения и тому подобное);

Wm_CLOSE - поступает в случае закрытия окна пользователем.

Об обработке WM_PAINT будет идти речь отдельно, а пока еще остановимся на действиях по получении WM_PAINT и обработке сообщений по умалчанию.

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

Стандартный способ реализовать такое прерывание - воспользоваться функцией PostQuitMessage(), которая помещает в цикл сообщение с кодом WM_QUIT.

Как параметр эта функция принимает значение, которое станет кодом возвращения применения.

switch (msgcode) {

case WM_CLOSE:

PostQuitMessage(O):

return 0;

}

Когда в окно поступило сообщение, которое функция окна не может обработать, в ней нужно обеспечить обработку такого сообщения, предусмотренную ОС (обработка по умолчанию). Для ее реализации необходимо вызывать стандартную функцию окна, то есть выполнить функцию DefWindowProc(), куда передать те же параметры, которые были получены функцией окна.

switch (msgcode) {

// обработка известных сообщений

}

// обработка всех других сообщений

return DefWindowProc(hwnd. msgcode. wp. lp);



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 134; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.240.142 (0.007 с.)