ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.06.2019
Просмотров: 117
Скачиваний: 2
Лабораторная работа № 11
Студента ИТ 14-1 Красовского Абхая
Реализация графического интерфейса пользователя в приложениях WinAPI
Вариант №9
Цель: Получить навыки в следующих предметных областях:
-
обработки сообщений с использованием функций WinAPI;
-
реализации графического интерфейса пользователя с использованием функций WinAPI
Индивидуальное задание
Добавить пункт меню или кнопку в диалоговом окне, в обработчике которого выполнить отрисовку графика функции, заданной в качестве индивидуального задания в лабораторной работе № 1.
Код программы:
#include "stdafx.h"
#include <windows.h>
#include <math.h>
// Прототип функции обработки сообщений с пользовательским названием:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
double x = 0, y = 0;
// Управляющая функция:
int WINAPI WinMain(HINSTANCE hInst, // дескриптор экземпляра приложения
HINSTANCE hPrevInst, // не используем
LPSTR lpCmdLine, // не используем
int nCmdShow) // режим отображения окна
{
TCHAR szClassName[] = "Мой класс"; // строка с именем класса
HWND hMainWnd; // создаём дескриптор будущего окна
MSG msg; // создём экземпляр структуры MSG для обработки сообщений
WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
wc.cbSize = sizeof(wc); // размер структуры (в байтах)
wc.style = CS_HREDRAW | CS_VREDRAW; // стиль класса окна
wc.lpfnWndProc = WndProc; // указатель на пользовательскую функцию
wc.lpszMenuName = NULL; // указатель на имя меню (у нас его нет)
wc.lpszClassName = szClassName; // указатель на имя класса
wc.cbWndExtra = NULL; // число освобождаемых байтов в конце структуры
wc.cbClsExtra = NULL; // число освобождаемых байтов при создании экземпляра приложения
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
wc.hInstance = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Не получилось зарегистрировать класс!", "Ошибка", MB_OK | MB_ICONSTOP);
return NULL; // выходим из WinMain
}
// Функция, создающая окна:
if (MessageBox(NULL, "Нарисовать график?", "Отрисовка графика", MB_YESNO) == IDYES)
hMainWnd = CreateWindow(
szClassName, // имя класса
"Полноценная оконная процедура", // имя окна
WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окна
CW_USEDEFAULT, // позиция окна по оси х
NULL, // позиция окна по оси у (раз дефолт в х, то писать не нужно)
CW_USEDEFAULT, // ширина окна
NULL, // высота окна (раз дефолт в ширине, то писать не нужно)
(HWND)NULL, // дескриптор родительского окна
NULL, // дескриптор меню
HINSTANCE(hInst), // дескриптор экземпляра приложения
NULL); // ничего не передаём из WndProc
else
{
MessageBox(NULL, "Не получилось создать окно!", "Ошибка", MB_OK | MB_ICONSTOP);
return NULL;
}
ShowWindow(hMainWnd, nCmdShow); // отображаем окна
UpdateWindow(hMainWnd); // обновляем окна
while(GetMessage( // извлекаем сообщения из очереди, посылаемые функциями ОС
&msg, // указатель на структуру MSG
NULL, // дескриптор окошка
NULL, // фильтры
NULL)) // фильтры для выборки сообщений
{
TranslateMessage(&msg); // интерпретируем сообщения
DispatchMessage(&msg); // передаём сообщения обратно ОС
}
return msg.wParam; // возвращаем код выхода из приложения
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC; // создаём дескриптор ориентации текста на экране
PAINTSTRUCT ps; // структура, содержащая информацию о клиентской области (размеры, цвет и тп)
RECT Rect; // структура, определяющая размер клиентской области
COLORREF colorText = RGB(255, 0, 0); // задаём цвет текста
switch(uMsg)
{
case WM_PAINT: // если нужно нарисовать, то:
hDC = BeginPaint(hWnd, &ps); // инициализируем контекст устройства
GetClientRect(hWnd, &Rect); // получаем ширину и высоту области для рисования
SetTextColor(hDC, colorText); // устанавливаем цвет контекстного устройства
Rectangle(hDC,Rect.left,Rect.top,Rect.right,Rect.bottom); // рисование прямоугольника
MoveToEx( // обновляет текущую позицию указанной точки(от которой рисуется линия...)
hDC,
Rect.right / 2, // координата x новой текущей позиции
Rect.top, // координата y новой текущей позиции
0); // старая текущая позиция
LineTo(hDC,Rect.right / 2,Rect.bottom);
MoveToEx(hDC,Rect.left,Rect.bottom / 2,0);
LineTo(hDC, // рисует линию до указанных коордиант
Rect.right, // по x
Rect.bottom / 2); // по y
for (double t = 0; t < 1000; t++)
{
x = 2 * 30 * cos(t) - 30 * cos(2 * t);
y = 2 * 30 * sin(t) - 30 * sin(2 * t);
SetPixel(hDC,x + 340,y + 185,RGB(255,97,97));
Sleep(5);
}
EndPaint(hWnd, &ps); // заканчиваем рисовать
break;
case WM_DESTROY: // если окно закрылось, то:
PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
break;
default: return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окно
}
return NULL; // возвращаем значение
}
Результат:
П ервое окно: При нажатии кнопки нет:
При нажатии кнопки да: