Шаблон WinAPI GUI

/* Простейщее WinAPI приложение. Шаблон.

*/

#include <windows.h>

#include<tchar.h>



LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // прототип функции WndProc



int WINAPI _tWinMain(HINSTANCE hInstance, // дескриптор текущего экземпляра окна

                     HINSTANCE hPrevInstance, // дескриптор предыдущего экземпляра окна

                     LPTSTR    lpCmdLine, // указатель на командную строку

                     int       nCmdShow // показывает состояние окна

) 

{

	MSG uMsg;

	HWND hMainWnd;

	TCHAR szWindowClass[] = L"MyClass"; // имя класса

	WNDCLASSEX wcex; // объявление переменной типа структура оконного класса



	wcex.cbSize = sizeof(WNDCLASSEX); // размер структуры в байтах

	wcex.style			= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;	// стиль окна

	wcex.lpfnWndProc	= WndProc; //адрес оконной процедуры (WNDPROC)WndProc;

	wcex.cbClsExtra		= 0; // доп. поля, кот могут потребоваться дальше

	wcex.cbWndExtra		= 0; // доп. поля, кот могут потребоваться дальше

	wcex.hInstance		= hInstance;// описатель приложения, первый параметр функции _tWinMain

	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); // определение иконки

	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW); // определение курсора LoadCursor(NULL, IDC_CROSS);

	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1); // установка фона GetSysColorBrush(COLOR_DESKTOP);

	wcex.lpszMenuName	= NULL;		// определение меню

	wcex.lpszClassName	= szWindowClass; // имя класса

	wcex.hIconSm		= NULL; //определение маленькой иконки



		// Регистрируем класс окна 

	if (!RegisterClassEx(&wcex)) { 

		MessageBox(NULL, L"Cannot register class", L"Error", MB_OK); 

		return 0; 

	}



	// Создаем основное окно приложения 

	hMainWnd = CreateWindow(szWindowClass/*имя зарегистрированного или готового класса*/,

		L"A Hellol Application"/*имя окна*/,

		WS_OVERLAPPEDWINDOW/*| WS_VSCROLL*/  /*стили окна*/,

		CW_USEDEFAULT/*расположение окна Х*/,

		0/*расположение окна У*/,

		CW_USEDEFAULT/*ширина окна*/,

		0/*высота окна*/,

		(HWND)NULL/*родитель. если нет, то NULL*/,

		(HMENU)NULL/*дескриптор меню. если меню нет, то NULL*/,

		(HINSTANCE)hInstance/*описатель приложения*/,

		NULL/*исп. в многооконных приложениях. если однооконное, то NULL*/

	);//возвращает описатель окна и передает его в hMainWnd



	// Показываем наше окно 

	ShowWindow(hMainWnd/*описатель окна, кот нужно показать*/, SW_NORMAL/*как именно открыто окно, режимы*/); 

	UpdateWindow(hMainWnd); // Отображение окна



	// Выполняем цикл обработки сообщений до закрытия приложения 

	while (GetMessage(&uMsg/*адрес структуры, принемающей сообщения*/,

		NULL/*из каких окон принемать сообщения. если от всех, то NULL*/,

		0/*ограничение сообщений. если нет, то 0*/,

		0/*ограничение сообщений. если нет, то 0*/

		)/*функция, выбирающая сообщения из очереди cообщений программы*/)

	{ 

	TranslateMessage(&uMsg); /*преобразование нажатия симбольных клавиш (облегчение работы определения нажатой клавиши)*/

	DispatchMessage(&uMsg); //отсылает сообщения в оконную процедуру WndProc

	}



	return 0;

}



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

{

	//int wmId, wmEvent;

	PAINTSTRUCT ps;

	HDC hdc;



	switch (uMsg)

	{

	case WM_COMMAND:

//		wmId    = LOWORD(wParam);

//		wmEvent = HIWORD(wParam);

	case WM_PAINT:

		hdc = BeginPaint(hWnd, &ps);

		// TODO: Add any drawing code here...

		EndPaint(hWnd, &ps);

		break;

	case WM_DESTROY:

		PostQuitMessage(0);

		break;

	default:

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

	}

	return 0;

}