Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h"
struct POINT2
{
double x, y;
};
//прототип функции окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Ex1(HWND);
void Ex3(HWND hwnd);
void Ex2(HWND hwnd);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdParam, int nCmdShow)
{
WCHAR cname[] = L"Class"; // Имя класса окна
WCHAR title[] = L"Hello API Windows"; // Заголовок окна
MSG msg; // структура для работы с сообщениями
//регистрация класса окна приложения
//----------------------------------------------------------------
WNDCLASS wc; // структура для регистрации класса окна приложения
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProc; //адрес функции окна
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; //идентификатор приложения
wc.hIcon = LoadIcon(hInstance, (LPCTSTR) IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = (LPCTSTR) IDR_MENU1;
wc.lpszClassName = cname;
if (!RegisterClass(&wc)) //регистрация класса окна приложения
return 0;
//создание окна приложения
//-------------------------------------------------------------
HWND hWnd; // дескриптор окна приложения
hWnd = CreateWindow(
cname,
title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, //идентификатор окна-родителя
NULL, //идентификатор меню
hInstance, //идентификатор приложения
NULL);
if (!hWnd)
return 0;
// Рисуем окно ShowWindow,
// вызываем функцию UpdateWindow,
// и посылаем сообщение WM_PAINT в функцию окна
//------------------------------------------------------------
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Запускаем цикл обработки сообщений
//--------------------------------------------------------
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//функция окна, обрабатывающая сообщения
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_PAINT:
//Ex1(hWnd); //наша функция рисования
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_FILE_EXIT:
PostQuitMessage(0);
break;
case ID_EX1:
InvalidateRect(hWnd, NULL, TRUE);
Ex1(hWnd);
break;
case ID_EX2:
InvalidateRect(hWnd, NULL, TRUE);
Ex2(hWnd);
break;
case ID_EX3:
InvalidateRect(hWnd, NULL, TRUE);
Ex3(hWnd);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0); //выход из цикла сообщений
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
//размеры окна вывода в мировой системе координат
double xLeft, xRight, yBottom, yTop;
//размеры окна вывода в пикселях на экране монитора
int nLeft, nRight, mBottom, mTop;
//переход от x к пикселю n
inline int xn(double x)
{
return (int) ((x - xLeft) / (xRight - xLeft) * (nRight - nLeft)) + nLeft;
}
//переход от y к пикселю m
inline int ym(double y)
{
return (int) ((y - yBottom) / (yTop - yBottom) * (mTop - mBottom)) + mBottom;
}
//функция обрабатывающая сообщение WM_PAINT
void Ex1(HWND hwnd)
{
//размеры окна в мировых координатах и в пикселях
xLeft = -2; xRight = 10; yBottom = -10; yTop = 10;
nLeft = 100; nRight = 450; mBottom = 350; mTop = 50;
//создаем массивы точек для аргумента x и функции y = sin(x)
const int N = 5000;
double corX1[N], corY1[N];
double corX2[N], corY2[N];
double x1, y1, dx1 = (xRight - xLeft) / (N - 1);
double x2, y2, dx2 = (xRight - xLeft) / (N - 1);
for (int i = 0; i < N; i++) {
x1 = xLeft + dx1 * i; y1 = x1 * sin(x1);
corX1[i] = x1; corY1[i] = y1;
}
for (int i = 0; i < N; i++) {
x2 = xLeft + dx2 * i; y2 = (int) 1.0f / (x2 * x2 + 1);
corX2[i] = x2; corY2[i] = y2;
}
HDC hdc; //идентификтор контекста устройства
PAINTSTRUCT ps; //структура для работы контеста
hdc = BeginPaint(hwnd, &ps); //получаем контекст <hdc> для окна <hwnd>
//hdc = GetDC(hwnd); //получаем контекст <hdc> для окна <hwnd>
HBRUSH hbrush, hbrushOld; //идентификаторы кистей
HPEN hpen1, hpen2, hpen3, hpenOld; //идентификаторы перьев
//создаем кисть <hbrush1>, стиль - сплошной, цвет - синий
hbrush = CreateSolidBrush(RGB(0, 0, 200));
//выбираем кисть <hbrush> в контекст устройства <hdc>,
//запоминаем идентификтор старой кисти <hbrushOld>
hbrushOld = (HBRUSH) SelectObject(hdc, hbrush);
//создаем перо <hpen1>, стиль сплошной, толщина 3 пикселя, цвет желтый
hpen1 = CreatePen(PS_SOLID, 3, RGB(255, 255, 0));
//выбираем перо <hpen1> в контекст устройства <hdc>,
//запоминаем идентификтор старого пера <hpenOld>
hpenOld = (HPEN) SelectObject(hdc, hpen1);
Rectangle(hdc, nLeft, mBottom, nRight, mTop);
//создаем перо <hpen2>, стиль сплошной, толщина 1 пиксел, цвет голубой
hpen2 = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
//выбираем перо <hpen2> в контекст устройства <hdc>
SelectObject(hdc, hpen2);
int nb, ne, mb, me;
POINT pt;
//рисуем ось OX
nb = xn(xLeft); mb = ym(0);
MoveToEx(hdc, nb, mb, &pt);
ne = xn(xRight); me = ym(0);
LineTo(hdc, ne, me);
//рисуем ось OY
nb = xn(0); mb = ym(yBottom);
MoveToEx(hdc, nb, mb, &pt);
ne = xn(0); me = ym(yTop);
LineTo(hdc, ne, me);
//название графика и осей
SetTextColor(hdc, RGB(255, 255, 255));
SetBkColor(hdc, RGB(127, 127, 127));
TextOut(hdc, nLeft - 35, (mBottom + mTop) / 2, _T("Y"), 1);
TextOut(hdc, (nLeft + nRight) / 2, mBottom + 25, _T("X"), 1);
//выводим числа вдоль осей
TCHAR ss[10];
swprintf_s(ss, 10, L"%6.1lf", xLeft);
TextOut(hdc, nLeft - 30, mBottom + 7, ss, 6);
swprintf_s(ss, 10, L"%6.1lf", xRight);
TextOut(hdc, nRight - 30, mBottom + 7, ss, 6);
swprintf_s(ss, 10, L"%6.1lf", yBottom);
TextOut(hdc, nLeft - 55, mBottom - 7, ss, 6);
swprintf_s(ss, 10, L"%6.1lf", yTop);
TextOut(hdc, nLeft - 55, mTop + 3, ss, 6);
//рисуем график по двум массивам
//создаем перо <hpen3>, стиль сплошной, толщина 2 пиксел, цвет красный
hpen3 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
//выбираем перо <hpen3> в контекст устройства <hdc>
SelectObject(hdc, hpen3);
nb = xn(corX1[0]); mb = ym(corY1[0]);
MoveToEx(hdc, nb, mb, &pt);
for (int i = 1; i < N; i++) {
nb = xn(corX1[i]); mb = ym(corY1[i]);
if ((mb <= mBottom) && (mb >= mTop))
LineTo(hdc, nb, mb);
else
MoveToEx(hdc, nb, mb, &pt);
}
DeleteObject(hpen3);
hpen3 = CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
//выбираем перо <hpen3> в контекст устройства <hdc>
SelectObject(hdc, hpen3);
nb = xn(corX2[0]); mb = ym(corY2[0]);
MoveToEx(hdc, nb, mb, &pt);
for (int i = 1; i < N; i++) {
if (mb > mTop) {
nb = xn(corX2[i]); mb = ym(corY2[i]);
LineTo(hdc, nb, mb);
}
}
//выбираем старую кисть <hbrushOld> в контекст устройства <hdc>
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush); //уничтожаем кисть <hbrush>
//выбираем старое перо <hpenOld> в контекст устройства <hdc>
SelectObject(hdc, hpenOld);
DeleteObject(hpen1); //уничтожаем перо <hpen1>
DeleteObject(hpen2); //уничтожаем перо <hpen2>
DeleteObject(hpen3); //уничтожаем перо <hpen3>
//освобождаем контекст устройства <hdc> в окне <hwnd>
EndPaint(hwnd, &ps);
//ReleaseDC(hwnd, hdc);
}
void Ex2(HWND hwnd)
{
RECT rc;
GetClientRect(hwnd, &rc); //дает размеры клиентской области окна <hwnd>
//размеры окна в мировых координатах и в пикселях
xLeft = -10; xRight = 10; yBottom = -6; yTop = 6;
nLeft = (5 * rc.left + rc.right) / 6;
nRight = (5 * rc.right + rc.left) / 6;
mBottom = (7 * rc.bottom + rc.top) / 8;
mTop = (7 * rc.top + rc.bottom) / 8;
//HDC hdc = GetDC(hwnd);
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
//создание прямоугольной области поля вывода
HRGN hrgn1 = CreateRectRgn(nLeft, mTop, nRight, mBottom);
//заливаем выделенную область белым цветом
HBRUSH hbrush1 = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF));
FillRgn(hdc, hrgn1, hbrush1);
//ограничиваем область вывода изображения
SelectClipRgn(hdc, hrgn1);
LOGFONT lf;
HFONT hFont1, hFontOld;
//создаем шрифт, выбираем его в контекст устройства и рисуем надпись
memset(&lf, 0, sizeof(LOGFONT));
wcscpy_s(lf.lfFaceName, L"Arial");
lf.lfHeight = 45;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = 900;
hFont1 = CreateFontIndirect(&lf);
hFontOld = (HFONT) SelectObject(hdc, hFont1);
TextOut(hdc, xn(-5), ym(-2), _T(" E l l i p s e "), 15);
HPEN hpen1, hpenOld;
hpen1 = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
hpenOld = (HPEN) SelectObject(hdc, hpen1);
int nb, ne, mb, me;
//рисуем ось OX
nb = xn(xLeft); mb = ym(0);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(xRight); me = ym(0);
LineTo(hdc, ne, me);
//рисуем ось OY
nb = xn(0); mb = ym(yBottom);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(0); me = ym(yTop);
LineTo(hdc, ne, me);
//размеры эллипса
double x1 = -7, x2 = 7, y1 = 4, y2 = -4, xSt = -1, ySt = -1, xEn = -1, yEn = 1;
HPEN hpen2 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
SelectObject(hdc, hpen2);
HBRUSH hbrush2, hbrushOld;
hbrush2 = CreateSolidBrush(RGB(0, 200, 255));
hbrushOld = (HBRUSH) SelectObject(hdc, hbrush2);
//Ellipse(hdc, xn(x1), ym(y1), xn(x2), ym(y2));
Chord(hdc, xn(x1), ym(y1), xn(x2), ym(y2), xn(xEn), ym(yEn), xn(xSt), ym(ySt));
//восстанавливаем контекст по умолчанию и уничтожаем созданные GDI-объекты
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush1);
DeleteObject(hbrush2);
SelectObject(hdc, hpenOld);
DeleteObject(hpen1);
DeleteObject(hpen2);
SelectObject(hdc, hFontOld);
DeleteObject(hFont1);
DeleteObject(hrgn1);
//ReleaseDC(hwnd, hdc);
EndPaint(hwnd, &ps);
}
void Ex3(HWND hwnd)
{
RECT rc;
GetClientRect(hwnd, &rc); //дает размеры клиентской области окна <hwnd>
//размеры окна в мировых координатах и в пикселях
xLeft = -10; xRight = 10; yBottom = -6; yTop = 6;
nLeft = rc.left; nRight = rc.right; mBottom = rc.bottom; mTop = rc.top;
double masht; //коэффициент угловой деформации при переходе
//от мировых к экранным координатам
masht = (xRight - xLeft) * (mBottom - mTop) / (yTop - yBottom) / (nRight - nLeft);
HDC hdc;
//hdc = GetDC(hwnd);
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps);
HBRUSH hbrush, hbrushOld;
HPEN hpen1, hpen2, hpenOld;
hpen1 = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
hpenOld = (HPEN) SelectObject(hdc, hpen1);
int nb, ne, mb, me;
//рисуем ось OX
nb = xn(xLeft); mb = ym(0);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(xRight); me = ym(0);
LineTo(hdc, ne, me);
//рисуем ось OY
nb = xn(0); mb = ym(yBottom);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(0); me = ym(yTop);
LineTo(hdc, ne, me);
POINT2 Vt[10];
Vt[0].x = 0; Vt[0].y = 4;
Vt[1].x = 1; Vt[1].y = 2;
Vt[2].x = 3; Vt[2].y = 2;
Vt[3].x = 1; Vt[3].y = 0;
Vt[4].x = 2; Vt[4].y = -3;
Vt[5].x = 0; Vt[5].y = -1;
Vt[6].x = -2; Vt[6].y = -3;
Vt[7].x = -1; Vt[7].y = 0;
Vt[8].x = -3; Vt[8].y = 2;
Vt[9].x = -1; Vt[9].y = 2;
POINT P[10];
for (int i = 0; i < 10; i++)
{
P[i].x = xn(Vt[i].x); P[i].y = ym(Vt[i].y);
}
hpen2 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
SelectObject(hdc, hpen2);
hbrush = CreateSolidBrush(RGB(0, 200, 255));
hbrushOld = (HBRUSH) SelectObject(hdc, hbrush);
Polygon(hdc, P, 10);
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush);
SelectObject(hdc, hpenOld);
DeleteObject(hpen1);
DeleteObject(hpen2);
LOGFONT lf;
HFONT hFont, hFontOld;
double dx, dy, alf;
for (int j = 0; j < 10; j++)
{
dx = ((j < 9) ? Vt[j + 1].x : Vt[0].x) - Vt[j].x;
dy = ((j < 9) ? Vt[j + 1].y : Vt[0].y) - Vt[j].y;
alf = atan2(dy * masht, dx);
memset(&lf, 0, sizeof(LOGFONT));
wcscpy_s(lf.lfFaceName, L"Courier New");
lf.lfHeight = 18;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = LONG(573 * alf);
hFont = CreateFontIndirect(&lf);
if (j == 0)
hFontOld = (HFONT) SelectObject(hdc, hFont);
else
SelectObject(hdc, hFont);
SetBkColor(hdc, RGB(192, 192, 192));
SetTextColor(hdc, RGB(255, 255, 255));
TextOut(hdc, xn(Vt[j].x - 0.25*sin(alf)),
ym(Vt[j].y +0.25*cos(alf)), _T(" Polygon "), 9);
}
SelectObject(hdc, hFontOld);
DeleteObject(hFont);
//ReleaseDC(hwnd, hdc);
EndPaint(hwnd, &ps);
}