Макросы на Win32Api

 

// Операторы препроцессора
#define STRICT // Объявляет имя STRICT определенным. В этом случае осуществляется
// более сложная проверка типов. Особенно важно для проверки дикрипторов

// В этих двух файлов содержатся определение макросов и прототипа функции Windows
#include <windows.h> // 
#include <windowsx.h> // хранит 16-ти разрядные функции

// Прототип используемой в программе функции пользователя

// Пишем прототипы функций

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // Это прототип оконной функции, формат оконной функции
// и тип возвращаемого значения определены системой Windows
// HWND - Handle Window
// UINT - unsigned int - код сообщения (номер), каждое устройство имеет номер
// Остальное - доп. парамеры, которые могут быть использованы

void OnDestroy(HWND);

/*
Лекция
// При запуске приложения, управление всегда передается функции WinMain (аналог main)
// Основное назначение функции WinMain выполнение инициализирующих действий и организация цикла
// обраобтки сообщений
// Выполнив инициализирующие действия, функция WinMain входит в цикл обработки сообщений
// Сообщение - винд. сообщает приложению о нажатии клавиши
// Оконная функция состоит из стольких фрагментов, сколько конкретных сообщений предполагается обрабатывать
// Это означает, что если хочу обрабатывать сообщения мыши, то нужно вставить фрагмент отслеживания координат
// мыши
*/

// HINSTANCE - handle instance - экземпляр приложения
// Второй параметр не используется (был дескриптором предыдущего экземпляра приложения), юзался в 16-чной версии
// LPSTR - указатель на параметры командной строки (если мы не хотим юзать командную строку, то не юзаем)
// последний параметр - константа, характеризующая начальный вид окна (выводить полностью, свернутым, сложенным)
// Т.о. менять можно имя WinMain и имя hInst
// Имена кодируются в соответствии с венгерской нотацией - у нас h - Handle, далее имя (для удобства)
// Прототип описан в файле WINBASE.h

/*
1-й параметр, поступающий в локальную переменную hInst представляет дискриптор данного экземпляра приложения
Он назначается приложением при его запуске в системе Windows и служит для идендификации
	Дискриптор нужен для того, чтобы винда знала, куда (в какую прогу) посылается сообщение
Второй параметр того же типа в 32-х разрядных и выше системах не используется, поэтому пишут только тип
  (раньше это был дискриптор предыдущего окна)
Третий параметр - это указатель на строку, содержащую параметры командной строки, если при запуске были указаны
параметры (в нашем курсе мы этого делать не будем, поэтому не пишем имя этого параметра)

  Состоит функция из нескольких частей
  Сначала регистрируется класс окна
  Потом создается окно
*/
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
	// Строка, оканчивающаяся нулем
	char szClassName[]="MainWindow"; // Произвольное имя класса главного окна
	char szTitle[] = "Программа 1"; // Произвольный заголовок окна
	// Message - MSG
	MSG msg; // структура msg типа MSG для получения сообщений Windows
	WNDCLASS wc; // структура типа WNDCLASS для задания характеристик окна

	// Регистрируем класс окна
	// Заполняем структуру wc, рекомендуется сначала обнулить ее
	memset(&wc,0,sizeof(wc)); // Обнуление всех членов структуры, параметры: ссылка на элемент, значение, размер
	// структуры
	wc.lpfnWndProc=WndProc; // функция, которая обрабатывает сообщения (как обрабатывать сообщения - будем
	// прописывать в функции WndProc
	wc.hInstance=hInst; // дискриптор приложения
	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); // курсор
	//wc.hCursor=LoadCursor(NULL,IDC_ARROW); // курсор (в виде стрелочки)
	// Меняем курсор
	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground=GetStockBrush(BLACK_BRUSH); // Задний фон (кисть) берем со склада
	wc.lpszClassName = szClassName; // создаем имя (использует Windows)
	RegisterClass(&wc); // регистрируем класс окна
	// Cоздаем главное окно szClassName - имя окна (для винды), szTitle - имя окна (которое вверху слева)
	// стиль окна, левый верхний угол (координаты), далее координаты нижнего правого угла (или размеры),
	// дискриптор родительского окна, указатель на меню, дискриптор приложения, др. параметры (если они есть, у нас
	// их нет)
	HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW,10,10,250,100,HWND_DESKTOP,NULL,hInst,NULL); // создаем окно, функция возвращает дискриптор главного окна
	// Показываем окно, далее нужен дискриптор (какое окно показываем), sw - show window определяет, как показывать
	// окно (во весь экран, свернутое и т.д.)
	ShowWindow(hwnd,SW_SHOWNORMAL);

	// Организуем цикл обработки сообщений (вертится все время, пока запущена программа), если есть
	// сообщение, то он его обрабатывает
	while(GetMessage(&msg,NULL,0,0)){ // цикл обработки сообщений
		DispatchMessage(&msg); // получает сообщение и передает в оконную функцию (у нас WndProc)
	}
	return 0;

}

bool flag = false;
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
	
	if(!flag) {
		//MessageBox(NULL,"!!!","Break",0);
		flag = true;
	}
	
	// В зависимости, какое сообщение получили
	switch(msg) {
	HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
	default:
		// Вызываем функцию стандартной обработки сообщений Windows
		return (DefWindowProc(hwnd,msg,wParam,lParam));
	}
}

void OnDestroy(HWND) {
	PostQuitMessage(0);
}

 

Free Web Hosting