В прошлых статьях был рассмотрен пример рисования графиков функций на 
языке 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);

Комментариев нет:
Отправить комментарий