Вызов функций управления окном

Пример 1. Приложение BUTTON

При нажатии на кнопку, родительское окно получает сообщение WM_COMMAND с кодом извещения, равным BN_CLICKED.

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

В параметре wParam сообщения WM_COMMAND хранится идентификатор органа управления.

Сообщение с кодом WM_COMMAND передается функции родительского окна от органа управления, созданного этим окном.

Сообщение WM_COMMAND

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

Старшее слово lParam содержит код извещения от органа управления (notification code), по которому можно судить о том, какое действие было выполнено над органом управления.


Приложение BUTTON демонстрирует способ создания стандартных кнопок и обработку сообщений от них. В главном окне приложения создается две кнопки с названием "Button 1" и "Button 2". Если нажать на одну из них, на экране появится диалоговая панель с сообщением о номере нажатой кнопки (рис. 3).

Рис. 3. Главное окно приложения BUTTON

Главный файл приложения BUTTON приведен в листинге.

#include <windows.h>

#include <stdio.h>

#include <string>

#include <tchar.h>

//#include <iostream>

using namespace std;

#define STRICT 1

#include <windows.h>

//#include <mem.h>

// Идентификаторы кнопок

#define IDB_Button1 1

#define IDB_Button2 2

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

TCHAR const szClassName[] = _T("ButtonAppClass");

// Заголовок окна

TCHAR const szWindowTitle[] = _T("Button Demo");

//================================================

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

HWND hWnd;

MSG msg;

TCHAR szClassName[] = _T("KWndClass");

// Описатели окон (кнопок)

HWND hButton1, hButton2;

WNDCLASS wc;

wc.style=CS_HREDRAW|CS_VREDRAW;

wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc=WndProc;

wc.hInstance=hInstance;

wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

wc.lpszMenuName=(LPCTSTR)NULL;

wc.lpszClassName=szClassName;

if (!RegisterClass(&wc))

{

MessageBox(NULL,_T("Не могу зарегестрировать класс"),_T("Error"),MB_OK);

return 0;

}

hWnd=CreateWindow(szClassName,_T("Program No"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,

hInstance,NULL);

if (!hWnd)

{

MessageBox(NULL,_T("Не могу создать окно"),_T("Error"),MB_OK);

return 0;

}

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

// Создаем первую кнопку

hButton1 = CreateWindow(_T("button"),_T("Button1"),

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

20, 20, 90, 30, hWnd,(HMENU)IDB_Button1,hInstance, NULL);

// Создаем вторую кнопку

hButton2 = CreateWindow(_T("button"),_T("Button2"),

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

20, 60, 90, 30, hWnd,(HMENU)IDB_Button2,hInstance, NULL);

while (GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

//=================================================

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch (uMsg)

{

case WM_COMMAND:

{

// Если нажата первая кнопка, выводим сообщение

if(wParam == IDB_Button1)

{

MessageBox(hWnd, _T("Нажата кнопка Button 1"),

_T("Message WM_COMMAND"),MB_OK);

}

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

else if(wParam == IDB_Button2)

{

MessageBox(hWnd, _T("Нажата кнопка Button 2"),

_T("Message WM_COMMAND"),MB_OK);

}

return 0;

}

case WM_DESTROY:

{

PostQuitMessage(0);

return 0;

}

}

return DefWindowProc(hWnd, uMsg, wParam, lParam);

}


Для блокирования и разблокирования органа управления следует пользоваться функцией EnableWindow:

BOOL WINAPI EnableWindow(HWND hWnd, BOOL fEnable);

Функция EnableWindow позволяет или запрещает поступление сообщений от клавиатуры или мыши в окно или орган управления, идентификатор которого задан параметром hWnd.

Параметр fEnable определяет, будет ли указанное окно заблокировано или наоборот, разблокировано.

Можно убрать орган управления из окна, скрыв его при помощи функции ShowWindow:

BOOL ShowWindow(HWND hwnd, int nCmdShow);

Для уничтожения органа управления следует вызвать функцию DestroyWindow:

BOOL WINAPI DestroyWindow(HWND hWnd);

Функция DestroyWindow уничтожает окно, идентификатор которого задан в качестве параметра hWnd, и освобождает все связанные с ним ресурсы. Возвращаемое значение равно TRUE в случае успеха или FALSE при ошибке.



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



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