Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ и WinAPI
Войти
Регистрация
Восстановить пароль
 
georgiy2590
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 2
#1

Добавить координатные оси к графику - C++ WinAPI

04.04.2013, 15:11. Просмотров 799. Ответов 0
Метки нет (Все метки)

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
//TestGraphWinAPI.cpp
//
#include <windows.h>
#include <windowsx.h>
#include <math.h>
#include "TestGraphWinAPI.h"
 
HBRUSH hBrush; //Дескриптор используемой кисти 
HBRUSH hWhiteBrush, hRedBrush, hBlueBrush, hGreenBrush; //Дескрипторы кистей фона
HPEN hPen;  //Дескриптор используемого карандаша
int sw;    //Переключатель для управления фоном окна
 
//Прототип используемой в программе функции пользователя
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);    //Оконная процедура
//главная функция WinMain
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
   {
  char szClassName[] = "MainWindow";   //Произывольное имя класса главного окна
  char szTitle[] = "TestGraphWinAPI" ;   //Произвольный заголовок окна
  MSG Msg;       //Структура Msg типа MSG  для получения сообщений Windows
  WNDCLASS wc;   //Структура wc типа WNDCLASS для задания характеристик окна
//Зарегистрируем класс главного окна
  ZeroMemory(&wc, sizeof(wc)); //Обнуление всех члкенов структуры wc
  wc.lpfnWndProc = WndProc;    //Определяем оконную процедуру для главного окна
  wc.hInstance = hInst;        //Дескриптор приложения
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);      //Стандартная пиктограмма
//  wc.hCursor = LoadCursor(NULL, IDC_ARROW);        //Стандартный курсор мыши
  wc.hCursor = LoadCursor(NULL, IDC_CROSS);        //Крестообразный курсор мыши
//  wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH);  //светло-серый фон окна
  wc.hbrBackground=CreateSolidBrush(RGB(250,250,250));//Произвольный цвет фона окна
  wc.lpszMenuName="Main"; //Имя меню в файле ресурсов
  wc.lpszClassName = szClassName;                  //Имя класса окна
  RegisterClass(&wc);   //Вызов функции Windows регистрации класса окна
//Создадим главное окно и сделаем его видимым
  HWND hwnd = CreateWindow(szClassName, szTitle, //Класс и заголовок окна
     WS_OVERLAPPEDWINDOW, 10,20,500,600,   //Стиль окна, координаты, размеры
     HWND_DESKTOP, NULL, hInst, NULL);     //Родитель, меню, другие параметры
  ShowWindow(hwnd, SW_SHOWNORMAL);         //вызов функции Windows показа окна
//Организуем цикл обнаружения сообщений
  while(GetMessage(&Msg, NULL, 0,0))   //Если есть сообщение, передать его нам
        DispatchMessage(&Msg);         //и вызвать оконную процедуру WndProc
  return 0; //После выхода из цикла вернуться в Windows
} //Конец функции WinMain
 
//Оконная функция WndProc главного окна
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  switch(msg) {
    //Переход по значению msg - номеру сообщения
    HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
    HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
 
    HANDLE_MSG(hwnd, WM_PAINT, OnPaint);    
    HANDLE_MSG(hwnd, WM_MOUSEMOVE, OnMouseMove);
    HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);   
    default:
    //В случае всех остальных сообщений Windows обработка их по умолчанию
    return(DefWindowProc(hwnd, msg, wParam, lParam));
    } // Конец оператора switch
}   // Конец функции WndProc
 
//
BOOL OnCreate(HWND, LPCREATESTRUCT) {
    hWhiteBrush=CreateSolidBrush(RGB(255,255,255));
    hRedBrush=CreateSolidBrush(RGB(255,200,200));
    hGreenBrush=CreateSolidBrush(RGB(200,255,200));
    hBlueBrush=CreateSolidBrush(RGB(200,200,255));
    return TRUE;
    }
 
void OnCommand(HWND hwnd, int id, HWND, UINT) {
    switch(id) {
    case MI_WHITE:
        sw=1;
        hBrush=hWhiteBrush;
        InvalidateRect(hwnd, NULL, TRUE);
        break;
    case MI_RED:
        sw=2;
        hBrush=hRedBrush;
        InvalidateRect(hwnd, NULL, TRUE);
        break;
    case MI_GREEN:
        sw=3;
        hBrush=hGreenBrush;
        InvalidateRect(hwnd, NULL, TRUE);
        break;
    case MI_BLUE:
        sw=4;
        hBrush=hBlueBrush;
        InvalidateRect(hwnd, NULL, TRUE);
        break;
 
    case MI_CALCULATE1:     
        sw=11;
        InvalidateRect(hwnd, NULL, TRUE);
        break;
    case MI_CALCULATE2:     
        sw=12;
        InvalidateRect(hwnd, NULL, TRUE);
        break;
 
    case MI_EXIT:   
        DestroyWindow(hwnd);
    }
}
 
void OnPaint(HWND hwnd) {
    RECT rect;
    PAINTSTRUCT ps;
    POINT pt[NUM];  //Точки графика
    GetClientRect(hwnd, &rect);
    HDC hdc=BeginPaint(hwnd, &ps);
    HPEN hPen=CreatePen(PS_SOLID, 1, RGB(0,0,255));
    HPEN hOldPen=SelectPen(hdc, hPen);
    int i, x, y; 
    int Nx=20, Ny=20; //Количество координатных линий по x и y
 
    //  Шаги приращений координатных линий по x и y
    int StepX=(int)(rect.right-rect.left)/Nx;
    int StepY=(int)(rect.bottom-rect.top)/Ny;
 
    //Проверяем, чтобы шаги приращений по x и y были ненулевыми
    if(StepX<1) StepX=1;
    if(StepY<1) StepY=1;
 
    //Закрашиваем фон
    FillRect(hdc, &ps.rcPaint, hBrush);
    //Рисуем оси 
    
 
    //Рисуем координатную сетку
    for (x=rect.left; x<=rect.right; x+=StepX)
        {
            MoveToEx(hdc, x, rect.top, NULL);
            LineTo(hdc,x,rect.bottom);
        }
 
    for (y=rect.top; y<=rect.bottom; y+=StepY)
        {
            MoveToEx(hdc, rect.left, y, NULL);
            LineTo(hdc, rect.right, y);
        }
    if(sw==1) 
        FillRect(hdc, &ps.rcPaint, hWhiteBrush);
    if(sw==2) 
        FillRect(hdc, &ps.rcPaint, hRedBrush);
    if(sw==3) 
        FillRect(hdc, &ps.rcPaint, hGreenBrush);
    if(sw==4) 
        FillRect(hdc, &ps.rcPaint, hBlueBrush);
 
    if(sw==11)
    {
    //Рассчитываем значения функции, масштабируем и заносим их в структуру pt
    //При масштабировании по x используем Nx*StepX, а не rect.right-rect.lef, 
    //чтобы не сказывались ошибки округления. Аналогично по y.
        for (i=0; i<NUM; i++)
        {
            pt[i].x=i*(Nx*StepX)/NUM;
            pt[i].y=(int)  ((Ny*StepY)/sin(TWOPI*i*8/NUM)-exp(-0.01*TWOPI*i/NUM)*pow(cos(TWOPI*6*i/NUM),2));
        }
        hPen=CreatePen(PS_SOLID, 1, RGB(0,0,0));
        SelectPen(hdc, hPen);
        Polyline(hdc, pt, NUM);
    }
    if(sw==12)
    {
    //Рассчитываем значения функции, масштабируем и заносим их в структуру pt
    //При масштабировании по x используем Nx*StepX, а не rect.right-rect.lef, 
    //чтобы не сказывались ошибки округления. Аналогично по y.
        for (i=0; i<NUM; i++)
        {
            pt[i].x=i*(Nx*StepX)/NUM;
            pt[i].y=(int) ((Ny*StepY)/sin(TWOPI*8*i/NUM));
        }
        hPen=CreatePen(PS_SOLID, 1, RGB(0,0,0));
        SelectPen(hdc, hPen);
        Polyline(hdc, pt, NUM); 
    }
 
    SelectPen(hdc, hOldPen);
    EndPaint(hwnd, &ps);
}
 
 
void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
{
    char szTextX[80], szTextY[80];  
    HDC hdc;
    hdc=GetDC(hwnd);
    RECT rect;
    GetClientRect(hwnd, &rect);
 
    wsprintf(szTextX, "x = %d", x);
    TextOut(hdc, rect.right-80, 5, szTextX, strlen(szTextX)+1);
    wsprintf(szTextY, "y = %d", y);
    TextOut(hdc, rect.right-80, 20, szTextY, strlen(szTextY)+1);
 
    ReleaseDC(hwnd, hdc);   
}
 
void OnDestroy(HWND) {
    PostQuitMessage(0);
}
Нужно добавить оси к графику и можно ли сделать что бы масштаб подстраивался если функцию изменить подскажите пожалуйста люди добрые как это сделать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2013, 15:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Добавить координатные оси к графику (C++ WinAPI):

координатные оси
Даны координаты точки, не лежащей на координатных осях OX и OY. Определит номер...

Координатные Оси в qt c++
Добрый вечер! Подскажите, пожалуйста, как подписать оси и единичные отрезки на...

Координатные оси
Уважаемые коллеги программисты ! Помогите пожалуйста разобраться начинающему...

координатные оси
Даны координаты точки, не лежащей на координатных осях OX и OY. Определит номер...

Начертить координатные оси и отрезки
Пожалуйста, помогите) У меня вот в чем проблема: Имеется код (прикреплён...

Нарисовать координатные оси, с засечками, и цифрами
Здравствуйте, форумчане. У меня есть вот такая программа: Program LR12;...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 15:11
Привет! Вот еще темы с решениями:

Нарисовать координатные оси и построить график
1 . Очистить экран монитора и при необходимости установить желаемый цвет фона....

Изобразить на экране координатные оси X и Y с размеченной шкале и проставленными числами
помогите доделать: Изобразить на экране координатные оси X и Y с размеченной...

Построить графики зависимости координат камня от времени, а также проекций его скорости на координатные оси
Камень брошен с вышки в горизонтальном направлении со скоростью 30 м/с....

Нарисовать координатные оси, подписать их, подписать деления осей
Построить графики указанных функций. При построении графика функции выбрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru