Индивидуальные задания 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);
void OnPaint(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(WHITE_BRUSH); // Задний фон (кисть) берем со склада
	wc.hbrBackground= CreateSolidBrush(0x805B41);//415B80);//RGB(0,255,255)); - Работа с HTML-Colors - возвращает число с перемешанной последовательностью символов
	// нужно перевернуть число, используя пары чисел. Пример: 01 fc d5 - вернул HTML-Colors, переделываем: d5 fc 01. И еще: вместо # ставим 0x
	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);
	HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
	default:
		// Вызываем функцию стандартной обработки сообщений Windows
		return (DefWindowProc(hwnd,msg,wParam,lParam));
	}
}

// Не передаем параметр hwnd (используем только его описание), т.к. он нам не нужен
void OnDestroy(HWND) {
	PostQuitMessage(0);
}

// Тут уже параметр hwnd понадобится нам вовсю
void OnPaint(HWND hwnd) {
	char szText[] = "Строка для вывода в окно";
	PAINTSTRUCT ps; // Структура, требуемая для рисования рабочей области
	HDC hdc = BeginPaint(hwnd,&ps); // Получение контектса устройства
	TextOut(hdc,5,30,szText,strlen(szText)); // Вывод строки текста с точки 5, 30
	EndPaint(hwnd,&ps); // Освобождение контекста устройства
} // Конец функции OnPaint()

Эхо-печать

/*

  В результате получилась интересная программа. Ввод текста осуществляется как обычно (только переноса на следующую строку нет, можно использовать как программу памятку
  (допустим, нужно сделать такое-то дело), если нажать ПКМ по окну, то при нажатии клавиш программа станет выводить коды клавиш (причем комбинаций вида CTRL+S тоже),
  что самое интересное, что при нормальном вводе текста каким-то образом работает PuntoSwitcher. Также реализовал стирание текста (через BackSpace)

*/



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

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

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

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

/*
Лекция
// При запуске приложения, управление всегда передается функции 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[] = "Эхо-печать"; // Произвольный заголовок окна
	// 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=CreateSolidBrush(0xffffff);//GetStockBrush(BLACK_BRUSH); // Задний фон (кисть) берем со склада
	wc.lpszClassName = szClassName; // создаем имя (использует Windows)
	RegisterClass(&wc); // регистрируем класс окна
	// Cоздаем главное окно szClassName - имя окна (для винды), szTitle - имя окна (которое вверху слева)
	// стиль окна, левый верхний угол (координаты), далее координаты нижнего правого угла (или размеры),
	// дискриптор родительского окна, указатель на меню, дискриптор приложения, др. параметры (если они есть, у нас
	// их нет)
	HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW,10,10,500,250,HWND_DESKTOP,NULL,hInst,NULL); // создаем окно, функция возвращает дискриптор главного окна
	// Показываем окно, далее нужен дискриптор (какое окно показываем), sw - show window определяет, как показывать
	// окно (во весь экран, свернутое и т.д.)
	ShowWindow(hwnd,SW_SHOWNORMAL);

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

}

char str[80] = "";
int strApp(char ch) { // Функция добавления символа к строке, возвращает длину новой строки
	int i=strlen(str);
	str[i] = ch;
	str[++i] = '\0';
	return i;
}

bool flagOutText = true;

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
	HDC hdc;
	PAINTSTRUCT ps;
	// В зависимости, какое сообщение получили
	switch(msg) {
	// Обработка сообщения WM_DESTROY (выход из программы)
	case WM_RBUTTONDOWN:
		flagOutText = !flagOutText;
		//MessageBox(NULL,"!!!","Break",0);
		return 0;
	case WM_CHAR:
		hdc = GetDC(hwnd);
		//MessageBox(NULL,"!!!","Break",0);
		if(flagOutText) {
			if((char)wParam==VK_BACK) {
				if(strlen(str)!=0)
					str[strlen(str)-1]='\0';
			}// else if((char)wParam==VK_RETURN){
			//	TextOut(hdc, 10, 10, str, strApp('n'));
			//}
			else {
				TextOut(hdc, 10, 10, str, strApp((char)wParam)); // При сообщении WM_CHAR код символа передается в wParam
			}
		} else {
			unsigned int key = wParam; // Получаем код клавиши
			_itoa(key,str,10); // Перевод числа в строку
			TextOut(hdc, 10, 10, str, 10);
		}
		InvalidateRect(hwnd,NULL,1);
		ReleaseDC(hwnd,hdc);
		return 0;
	// Обязательно нужна перерисовка, т.к. в противном случае текст будет стираться с экрана
	case WM_PAINT:
		hdc = BeginPaint(hwnd,&ps);
		TextOut(hdc,10,10,str,strlen(str));
		EndPaint(hwnd,&ps);
		return 0;
	case WM_DESTROY:
		// Чистим память
		PostQuitMessage(0);
		// Завершаем работу (и выходим из цикла обработки сообщений, т.к. функция GetMessage вызывает эту функцию
		// и возвращаемое значение функции GetMessage есть, фактически, возвращаемое значение этой функции)
		return 0;
	// Обработка всех остальных сообщений (По умолчанию)
	default:
		// Вызываем функцию стандартной обработки сообщений Windows
		return (DefWindowProc(hwnd,msg,wParam,lParam));
	}
}

События мыши

	  /*

Обработка событий мыши

*/



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

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

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

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

/*
Лекция
// При запуске приложения, управление всегда передается функции 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[] = "Нажатие мыши"; // Произвольный заголовок окна
	// 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=CreateSolidBrush(0xffffff);//GetStockBrush(BLACK_BRUSH); // Задний фон (кисть) берем со склада
	wc.lpszClassName = szClassName; // создаем имя (использует Windows)
	RegisterClass(&wc); // регистрируем класс окна
	// Cоздаем главное окно szClassName - имя окна (для винды), szTitle - имя окна (которое вверху слева)
	// стиль окна, левый верхний угол (координаты), далее координаты нижнего правого угла (или размеры),
	// дискриптор родительского окна, указатель на меню, дискриптор приложения, др. параметры (если они есть, у нас
	// их нет)
	HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW,10,10,500,250,HWND_DESKTOP,NULL,hInst,NULL); // создаем окно, функция возвращает дискриптор главного окна
	// Показываем окно, далее нужен дискриптор (какое окно показываем), sw - show window определяет, как показывать
	// окно (во весь экран, свернутое и т.д.)
	ShowWindow(hwnd,SW_SHOWNORMAL);

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

}

char str[80] = "";
int x,y;
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
	HDC hdc;
	PAINTSTRUCT ps;
	// В зависимости, какое сообщение получили
	switch(msg) {
	// Обработка сообщения WM_DESTROY (выход из программы)
	case WM_LBUTTONDOWN:
		strcpy(str,"Нажата левая кнопка мыши");
		x = LOWORD(lParam); // В младшем слове выражения lParam содержится координата по x
		y = HIWORD(lParam); // В старшем слове выражения lParam содержится координата по y
		InvalidateRect(hwnd,NULL,1); // Генерируем перерисовку области экрана (рисуем все заново), в противном случае перерисовки не было
		
//(пока окно не было бы подвинуто) //MessageBox(NULL,"!!!","Break",0); return 0; // Обязательно нужна перерисовка, т.к. в противном случае текст будет стираться с экрана case WM_RBUTTONDOWN: strcpy(str,"Нажата правая кнопка мыши"); x = LOWORD(lParam); y = HIWORD(lParam); InvalidateRect(hwnd,NULL,1); // Перерисовываем все окно, hwnd - дескриптор приложения, NULL - указатель на границы област
//, которую будем перерисовывать, в случае NULL // перерисовываем все. 1 - флаг, говорящий о том, что область будем именно перерисовывать
// (т.е. старое изображение сотрем, новое нарисуем) return 0; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); TextOut(hdc,x,y,str,strlen(str)); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: // Чистим память PostQuitMessage(0); // Завершаем работу (и выходим из цикла обработки сообщений, т.к. функция GetMessage вызывает эту функцию // и возвращаемое значение функции GetMessage есть, фактически, возвращаемое значение этой функции) return 0; // Обработка всех остальных сообщений (По умолчанию) default: // Вызываем функцию стандартной обработки сообщений Windows return (DefWindowProc(hwnd,msg,wParam,lParam)); } }

 

 

Free Web Hosting