//Эта директива на случай если по умолчанию в приложении используется Unicode версии функции - мы работает с ANSI
//Если убрать эту директиву - скорее всего при вызове макросов, скажем CreateWindow(да да это макрос на самом деле)
//Будет вызван CreateWindowW (все UNICODE функции имеют окончание W), а если не убирать - CreateWindowA
//О самом Юникоде и прочих особенностях можно почитать попозже - сейчас это не так важно.
#undef UNICODE
#include <windows.h>
LRESULT WINAPI WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgs,int nCmdShow)
{
MSG msg;
/*
Разберем что же это за структура такая:
HWND hwnd; - хендл окна к которому пришло сообщение - дескриптор или индетификатор если угодно.
UINT message; - номер сообщения которое пришло.
WPARAM wParam; - первый параметр
LPARAM lParam; - второй параметр
DWORD time; - штамп времени
POINT pt; - кординаты курсора в момент события.
*/
HWND hWnd;
WNDCLASS wc;
wc.cbClsExtra=0; //Неиспользуемый параметр но надо заполнить нулем
wc.cbWndExtra=0; //Неиспользуемый параметр но надо заполнить нулем
wc.hbrBackground=(HBRUSH)COLOR_WINDOW+1; //Этот параметр задает цвет фона. Есть набор цветов для фона окна.
wc.hCursor=LoadCursor(0,IDC_ARROW); //Загружаем в прогрумму курсор из системы.
wc.hIcon=LoadIcon(0,IDI_APPLICATION); //Тоже самое и иконкой. Она отображается в левом верхнем углу рамки окна.
wc.hInstance=hInstance; //Тут думаю понятно - мало ли какой внутренней функции понадобится дескриптор нашего приложения.
wc.lpfnWndProc=WndProc; //Далее параметру lpfnWndProc присваивается АДРЕСС функции обработки сообщений.
wc.lpszClassName="HelloWorldWindowClass"; //Заполняем поле названия нашего класса.
wc.lpszMenuName=0; //Заполняем нулем, т.к. меню у нас нет.
wc.style=CS_HREDRAW|CS_VREDRAW; //Эти параметры сигнализируют системе что наше окно будет перерисовано при вертикальных и горизонтальных изменениях.
RegisterClass(&wc;);
//Отныне в системе есть наш зарегистрированный класс окна.
CreateWindow("HelloWorldWindowClass", //Мы обращаемся к системе, она нам создаст окно класса имя которого указывается в этом параметре.
"Hello, World!", //Имя нашего окна - отображается на рамке окна.
WS_VISIBLE|WS_SYSMENU, //Это стили окна. WS_VISIBLE - окно создается уже видимым. И WS_SYSMENU создает в правом вехнем углу кнопочку закрыть(крестик т.е.)
0,0 //Начальные кординаты окна создадим в левом верхнем углу экрана - там начинается отсчет кординат.
,320,240, //Размер окна. 320 в ширину и 240 в высоту
0,0, // два неиспользуемых параметра
hInstance, // дадим и окну дескриптор нашего приложения
0); //Последний параметр тоже не используется
//А вот теперь начинается самое интересное:
//Когда вы что ни будь делаете мышкой клавиатурой итд, т.е. взаимодействуете с компьютером
//Система региструрет как сообщение и всем окнам на которые оно могло повлиять - рассылается сообщение.
//Функция GetMessage постоянно спрашивает систему - не было ли для нее сообщений.
//Как только сообщения закончатся - функция вернет 0 и цикл прекратится.
//Но система постоянно отдает этой функции сообщения болванки - что б она не возвращала 0.
//Если в систему послать сообщение о том что окну пора закрытся - система перестанет отдавать сообщения болванки.
//Get Message получает сообщение и параметры для него и записывает в структуру msg - мы ее адрес передаем первым параметром.
while(GetMessage(&msg;,0,0,0)!=NULL)
{
//А вот это уже ближе к делу: эта функция вызывает нашу процедуру обработки сообщений с параметрами из структуры MSG
DispatchMessage(&msg;);
}
return 0;
};
LRESULT WINAPI WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
//Все очень просто. То что нам надо мы обрабатываем.
switch(uMsg)
{
//А нужно нам обрабатывать только сообщение WM_CLOSE
//Система его присылает окну, когда окно пытаются закрыть.
//Скажем когда пользователь жмет на "Крестик".
case WM_CLOSE:
{
//Эта функция сообщает системе что нам пора закрыватся.
//Единственный параметр - это код ошибки.
// 0 означает "Нет Ошибки".
PostQuitMessage(0);
}return 0; //После обработки сообщения - возвращаем результат.
default:
//То что не надо - передаем системе и она делает работу за нас.
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
}
Add a code snippet to your website: www.paste.org