Создание окна без Wizard'ов

В этом уроке мы с вами посмотрим, как можно создать просто окошко голыми ручками - безо всяких там Wizard'ов и т. д. Создайте новый пустой проект типа Win32 Application.

Добавьте в него файл реализации (с расширением *.cpp). В файл внесите следующий код:
#include <windows.h>
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS w;
memset(&w,0,sizeof(WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
w.lpszClassName = "My Class";
RegisterClass(&w);
hwnd = CreateWindow("My Class", "My title", WS_OVERLAPPEDWINDOW,
300, 200, 200, 180, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
switch (Message){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wparam, lparam);
}
return 0;
}

Отомпилируйте и запустите программу.

Приступаем к обсуждению текста программы.

Любая программа на C/C++ для Windows должна иметь функцию WinMain (аналог main для консольных приложений). Эта функция у нас есть. Кроме того, должна присутствовать ещё одна функция - это так называемая оконная процедура. Она может называться как угодно (в нашем примере мы назвали её WndProc). Их задачи приблизительно следующие: WinMain отвечает за главное окно приложения - его создание, регистрация класса окна и т. п. Эта функция более-менее одинаковая во всех Windows -приложениях. Вторая функция (WinProc у нас) отвечает за обработку сообщений Windows. Вот эта-та часть и есть самая содержательная. Всё усложнение нашей программы будет идти именно здесь. Если мы хотим, что бы наша программа обращало на что-нибудь внимание, то мы должны добавить ещё одну веточку case для оператора switch в оконную процедуру (а именно так и называется функция WinProc). Например, хотим, чтобы наше приложение обращало внимание, что мы щелкаем в окошке левой кнопкой мыши - прибавляем веточку case WM_LBUTTONDOWN:. Хотим, чтобы что-нибудь делалось по таймеру - пишем код для веточки case WM_TIMER:. Сейчас в нашей оконной процедуре происходит только обработка сообщения WM_DESTROY. Это сообщение посылается окну, которое должно разрушиться. Больше наше окно пока ничего делать и не умеет.

Заголовочный файл windows.h нужем для любой традиционной Windows-программы на C. Именно в нём, скажем, содержаться разные определения констант (WM_DESTROY и т. п.) и многие другие полезные вещи.

 
« Предыдущая статья   Следующая статья »