ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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; // возвращаем значение

}


Результат:

П ервое окно: При нажатии кнопки нет:

При нажатии кнопки да:




















Смотрите также файлы