В прошлых статьях был рассмотрен пример рисования графиков функций на
языке Java. Что касается WinAPI - в некоторых
моментах тут все проще, а в некоторых сложнее. Сложнее конечно это -
создание окон и кнопок. Проще - тут нет стилей
размещения элементов (на подобии HTML/CSS) как в Java: создал кнопку
нужных размеров в нужном месте и этого достаточно. Не
нужно "вешать" слушателей на кнопки - есть оконная функция которая
принимает все сообщения, а программа только отбирает
нужное сообщение, его анализирует и предпринимает нужные действия. Все
приложение будет состоять из четырех файлов: главного файла main, а
также "paintfone.h" "button.h" "graphfunc.h"
Традиционно первое что создается это главное окно и оконная функция в файле main.c:
Новые присутствующие методы это CreateSolidBrush() при заполнении структуры главного окна WNDCLASSEX wincl. Этой функцией устанавливается цвет главного окна удобным методом. Глобальные переменные x_center, y_center, zoom, step, vertex, и func задают общие первоначальные настройки: центр главной точки графика, состояние масштабирования, количество вершин кривых, и выбранный график в данный момент.
wParam определяет какая именно была нажата кнопка, и вносит изменения в глобальные переменные управления графиками, после которых вызывает функции рисования фона, шкалу деления, и выбранный график функции getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
Традиционно первое что создается это главное окно и оконная функция в файле main.c:
- #if defined(UNICODE) && !defined(_UNICODE)
- #define _UNICODE
- #elif defined(_UNICODE) && !defined(UNICODE)
- #define UNICODE
- #endif
- #include <tchar.h>
- #include <windows.h>
- #include <cmath>
- #include "paintfone.h"
- #include "button.h"
- #include "graphfunc.h"
- LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
- char szClassName[ ] = "iVARIOUS.COM";
- int WINAPI WinMain (HINSTANCE hThisInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpszArgument,
- int nCmdShow)
- {
- HWND hwnd;
- MSG messages;
- WNDCLASSEX wincl;
- wincl.hInstance = hThisInstance;
- wincl.lpszClassName = szClassName;
- wincl.lpfnWndProc = WindowProcedure;
- wincl.style = CS_DBLCLKS;
- wincl.cbSize = sizeof (WNDCLASSEX);
- wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
- wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
- wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
- wincl.lpszMenuName = NULL;
- wincl.cbClsExtra = 0;
- wincl.cbWndExtra = 0;
- wincl.hbrBackground = CreateSolidBrush(RGB(190,190,195));
- if (!RegisterClassEx (&wincl))
- return 0;
- hwnd = CreateWindowEx (
- 0,
- szClassName,
- _T("iVARIOUS Graph"),
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- 700,
- 600,
- HWND_DESKTOP,
- NULL,
- hThisInstance,
- NULL
- );
- ShowWindow (hwnd, nCmdShow);
- button_func(hwnd,hThisInstance);
- paint_fon(hwnd);
- while (GetMessage (&messages, NULL, 0, 0))
- {
- TranslateMessage(&messages);
- DispatchMessage(&messages);
- }
- return messages.wParam;
- }
- int x_center=290, y_center=260, zoom=5, step=5;
- float vertex=0.1;
- int func=0;
- LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- { case WM_COMMAND:
- if(wParam==3001) {x_center+=step; InvalidateRect(hwnd, NULL, NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3002) {x_center-=step; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3003) {y_center+=step; InvalidateRect(hwnd, NULL, NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3009) {x_center=290; y_center=260; zoom=5; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- vertex=0.1;
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3004) {y_center-=step; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3005) {zoom+=5; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3006) {if(zoom>5)zoom-=5; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3007) {vertex+=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
- if(wParam==3008) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom);
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
- }
- if(wParam==3010) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom); func=0;
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
- if(wParam==3011) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom); func=1;
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
- if(wParam==3012) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom); func=2;
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
- if(wParam==3013) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom); func=3;
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
- if(wParam==3014) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
- paint_fon(hwnd);
- meredian(hwnd, x_center, y_center, zoom); func=4;
- getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
- break;
- case WM_DESTROY:
- PostQuitMessage (0);
- break;
- default:
- return DefWindowProc (hwnd, message, wParam, lParam);
- }
- return 0;
- }
Новые присутствующие методы это CreateSolidBrush() при заполнении структуры главного окна WNDCLASSEX wincl. Этой функцией устанавливается цвет главного окна удобным методом. Глобальные переменные x_center, y_center, zoom, step, vertex, и func задают общие первоначальные настройки: центр главной точки графика, состояние масштабирования, количество вершин кривых, и выбранный график в данный момент.
wParam определяет какая именно была нажата кнопка, и вносит изменения в глобальные переменные управления графиками, после которых вызывает функции рисования фона, шкалу деления, и выбранный график функции getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
Комментариев нет:
Отправить комментарий