В этом уроке мы с вами посмотрим, как можно создать просто окошко голыми ручками - безо всяких там 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 и т. п.) и многие другие полезные вещи. |