//Эта директива на случай если по умолчанию в приложении используется 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