Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22

Создание линейной диаграммы

17.05.2012, 15:45. Показов 4629. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые, товарищи! Здраствуйте! Прошу помощи у Вас. Требуется создать линейную диаграмму, у меня возникли трудности, никак не получается ее нарисовать в системе координат, а так же сделать подписи. Требуется самая простая диаграмма, но с подписями. Мои наработки ниже. Прошу откликнуться на мою просьбу. Заранее Спасибо!
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
    
#include <windows.h>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <iostream>
 
int numData;
int res;
FILE* pFile;
int str[1];
float * buffer;
float * buffer2;
int i[10]={365, 430, 495, 560, 625, 690,755, 820, 885, 950};
int j;
 
 
 
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
TCHAR szProgName[] = TEXT("LineDiag");
 
int WINAPI WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, LPSTR lpszCmdLine, int nCmdShow)
{
WNDCLASS wndClass;
HWND hWnd;
MSG message;
 
wndClass.lpszClassName = szProgName;
wndClass.hInstance = hCurrentInst;
wndClass.lpfnWndProc = WndProc;
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.lpszMenuName = 0;
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
 
if (!RegisterClass(&wndClass))
return 0;
 
hWnd = CreateWindow(
szProgName,
TEXT("LineDiag"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hCurrentInst,
NULL
);
 
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
 
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
 
return message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rc;
 
switch (nMessage)
{
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
MoveToEx (hDC, 300, 650, NULL);
LineTo (hDC, 300, 100);
LineTo (hDC, 295, 115);
MoveToEx (hDC,300, 100, NULL);
LineTo (hDC,305, 115);
MoveToEx (hDC, 300, 650, NULL);
LineTo (hDC, 950, 650);
LineTo (hDC, 935, 645);
MoveToEx (hDC, 950, 650, NULL);
LineTo (hDC, 935, 655);
MoveToEx (hDC, 300, 650, NULL);
pFile = fopen ("input.txt","r");
for (int i=0; i<1000; i++)
{
res=fscanf(pFile,"%f %f",&str[10]);
if (res>0) numData++;
}
rewind (pFile);
buffer = (float*) malloc (sizeof(float)*numData);
buffer2 = (float*) malloc (sizeof(float)*numData);
for (int i=0; i<numData; i++)
{
fscanf(pFile,"%f %f", &buffer[i], &buffer2[i]);
}
for (int j=0; j<numData; j++)
{
    fscanf(pFile, "%f %f", &buffer[j], &buffer2[j]);
}
fclose (pFile);
//HPEN NewPen=CreatePen (PS_SOLID, 2, RGB(255,0,0)); 
//SelectObject
 
for (int j=0; j<numData; j++)
LineTo(hDC,   i[j], buffer[j]);
 
EndPaint(hWnd, &ps);
 
break;
 
case WM_DESTROY:
PostQuitMessage(0);
break;
 
default:
return DefWindowProc(hWnd, nMessage, wParam, lParam);
}
 
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.05.2012, 15:45
Ответы с готовыми решениями:

Создание линейной структуры данных типа очереди или стека
Здравствуйте, форумчане. Прошу помочь с заданием:

Создание диаграммы в C++ Builder 6.0
Люди помогите решить такую задачку. Нужно создать простую линейную диграмму Chart в главном окне. ОсьУ Кол-во линий=списку годов,...

Изменение линейной диаграммы
Привет. Есть обычная линейная диаграмма по оси х отложены числа 1, 2, 3, 4 и т д, по оси у некоторые значения. Как можно в оси х заменить...

24
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
17.05.2012, 16:35
Не знаю, что у тебя хранится в файле input.txt, но вот такая функция:

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
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rc;
 
    switch (nMessage)
    {
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 300, 100);
            LineTo (hDC, 295, 115);
            MoveToEx (hDC,300, 100, NULL);
            LineTo (hDC,305, 115);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 950, 650);
            LineTo (hDC, 935, 645);
            MoveToEx (hDC, 950, 650, NULL);
            LineTo (hDC, 935, 655);
            MoveToEx (hDC, 300, 650, NULL);
 
            for (int j=0; j<numData; j++) // а теперь просто проходим по всем точкам и рисуем ...
            {
                char s[10] = {0};
                LineTo(hDC,   ii[j], 650 - (int)(0.5 * buffer[j])); // линию,
                sprintf(s, "%0.0f", buffer[j]);
                rc = {ii[j] - 20, 650, ii[j] + 20, 670};
                DrawText (hDC, s, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER); // и подпись...
            }
            EndPaint(hWnd, &ps);
            break;
 
        case WM_CREATE: // не надо это делать в функции рисования, можно сделать один раз тут
            pFile = fopen ("input.txt","r");
            for (int i=0; i<1000; i++)
            {
                res=fscanf(pFile,"%f %f",&str1, &str2);
                if (res>0) numData++;
            }
            rewind (pFile);
            buffer = (float*) malloc (sizeof(float)*numData);
            buffer2 = (float*) malloc (sizeof(float)*numData);
            for (int i=0; i<numData; i++)
            {
                fscanf(pFile,"%f %f", &buffer[i], &buffer2[i]);
            }
            for (int j=0; j<numData; j++)
            {
                fscanf(pFile, "%f %f", &buffer[j], &buffer2[j]);
            }
            fclose (pFile);
            break;
 
        case WM_DESTROY: // и удалить выделенную память тут
            free(buffer);
            free(buffer2);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, nMessage, wParam, lParam);
    }
    return 0;
}
Выглядит - вот так (красоту наводи сам, цвета добавь, шрифт поменяй) :
Миниатюры
Создание линейной диаграммы  
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 16:58  [ТС]
У меня в Файле input.txt хранились данные в виде:
500 600
550 700
600 725
Каков должен быть файл для Вашей программы?
Хотелось бы полный текст Вашего творения, возникли некоторые проблемы с объявлениями. Знания нулевые (
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
17.05.2012, 17:07
Цитата Сообщение от V.I.P Посмотреть сообщение
Хотелось бы полный текст Вашего творения
Вот полный текст, вместе в файлом проекта и txt-файлом (собиралось в Code::Blocks)
Вложения
Тип файла: zip arch.zip (2.1 Кб, 40 просмотров)
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 17:10  [ТС]
С объявлениями разобрался, Спасибо!
Но при отладке возникает следующее:
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
17.05.2012, 17:16
Без понятия. У меня это выглядит так (см. аттач)

В крайнем случае можешь задать полное имя файла, если программа его не находит...
Миниатюры
Создание линейной диаграммы  
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 17:21  [ТС]
Эхм, за что отвечает файл t_strage.cbp?
strange файлов у меня в директории нет
0
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 17:29  [ТС]
Показывает ошибку в тексте "Требуется Выражение":
Каким образом избавиться?
Компилирую в MS Visual Studio 2010
Миниатюры
Создание линейной диаграммы  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
17.05.2012, 17:44
Цитата Сообщение от V.I.P Посмотреть сообщение
Эхм, за что отвечает файл t_strage.cbp?
cbp - это CodeBlocksProject, если у тебя MSVC - он тебе не нужен.
Цитата Сообщение от V.I.P Посмотреть сообщение
Показывает ошибку в тексте "Требуется Выражение":
Каким образом избавиться?
Я всегда знал, что VC не совсем адекватна

Заполни структуру так:
C++
1
SetRect(&rc, ii[j] - 20, 650, ii[j] + 20, 670);
- должно работать...
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
18.05.2012, 15:45  [ТС]
Низкий поклон Вам, после изменения этой строчки ошибок нет, все замечательно работает!
Большое Спасибо за уделенное внимание и время!

Добавлено через 21 час 22 минуты
Возникла еще одна проблема, а именно: нужно пронумеровать не только ось X для значений из файла, но и ось Y и в начало координат добавить 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
#include <windows.h>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <iostream>
 
int numData;
int res;
FILE* pFile;
int str[1];
float * buffer;
float * buffer2;
int ii[10]={365, 430, 495, 560, 625, 690,755, 820, 885, 950};
int j;
int i;
 
float str1, str2;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
TCHAR szProgName[] = TEXT("LineDiag");
 
int WINAPI WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, LPSTR lpszCmdLine, int nCmdShow)
{
WNDCLASS wndClass;
HWND hWnd;
MSG message;
 
wndClass.lpszClassName = szProgName;
wndClass.hInstance = hCurrentInst;
wndClass.lpfnWndProc = WndProc;
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.lpszMenuName = 0;
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
 
if (!RegisterClass(&wndClass))
return 0;
 
hWnd = CreateWindow(
szProgName,
TEXT("LineDiag"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hCurrentInst,
NULL
);
 
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
 
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
 
return message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rc;
    RECT rr;
    HPEN NewPen;
    HPEN OldPen;
 
    switch (nMessage)
    {
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 300, 100);
            LineTo (hDC, 295, 115);
            MoveToEx (hDC,300, 100, NULL);
            LineTo (hDC,305, 115);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 950, 650);
            LineTo (hDC, 935, 645);
            MoveToEx (hDC, 950, 650, NULL);
            LineTo (hDC, 935, 655);
            MoveToEx (hDC, 300, 650, NULL);
            NewPen = CreatePen (PS_SOLID, 2, RGB(255, 0, 0));
            SelectObject(hDC, NewPen);
            for (int j=0; j<numData; j++)
            {
                char s[10] = {0};
                LineTo(hDC,   ii[j], 650 - (int)(0.5 * buffer[j]));
                sprintf(s, "%0.0f", buffer[j]);
                SetRect(&rc, ii[j] - 20, 650, ii[j] + 20, 670);
 
                DrawText (hDC, s, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            }
            /*for (int i=0; i<numData; i++)
            {
                char ss[10] = {0};
                sprintf(ss, "%0.0f", buffer2[i]);
                SetRect(&rr, 80, i[j] - 20 , 100, i[j] +20 ); //// Не знаю, как задать координаты 
 
                DrawText (hDC, ss, -1, &rr,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            }*/
            DeleteObject (NewPen);
            ReleaseDC (hWnd, hDC);
            EndPaint(hWnd, &ps);
            break;
 
        case WM_CREATE:
            pFile = fopen ("input.txt","r");
            for (int i=0; i<1000; i++)
            {
                res=fscanf(pFile,"%f %f",&str1, &str2);
                if (res>0) numData++;
            }
            rewind (pFile);
            buffer = (float*) malloc (sizeof(float)*numData);
            buffer2 = (float*) malloc (sizeof(float)*numData);
            for (int i=0; i<numData; i++)
            {
                fscanf(pFile,"%f %f", &buffer[i], &buffer2[i]);
            }
            for (int j=0; j<numData; j++)
            {
                fscanf(pFile, "%f %f", &buffer[j], &buffer2[j]);
            }
            fclose (pFile);
            break;
 
        case WM_DESTROY:
            free(buffer);
            free(buffer2);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, nMessage, wParam, lParam);
    }
    return 0;
}
Добавлено через 30 минут
Исправил строку на:
SetRect(&rc, 80, i - 20 , 100, i +20 );
значения появляются, но они где то далеко наверху, а не сбоку графика, как нужно =(
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
18.05.2012, 15:49
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
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 300, 100);
            LineTo (hDC, 295, 115);
            MoveToEx (hDC,300, 100, NULL);
            LineTo (hDC,305, 115);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 950, 650);
            LineTo (hDC, 935, 645);
            MoveToEx (hDC, 950, 650, NULL);
            LineTo (hDC, 935, 655);
            MoveToEx (hDC, 300, 650, NULL);
            NewPen = CreatePen (PS_SOLID, 2, RGB(255, 0, 0));
            SelectObject(hDC, NewPen);
 
            SetRect(&rc, 280, 640, 300, 660); // Ноль в начале координат
            DrawText (hDC, "0", -1, &rc,
                      DT_SINGLELINE | DT_CENTER | DT_VCENTER);
 
            for (int j=0; j<numData; j++)
            {
                char s[10] = {0};
                int pnt_y = 650 - (int)(0.5 * buffer[j]);
                LineTo(hDC,   ii[j], pnt_y);
 
                sprintf(s, "%0.0f", buffer[j]);
                SetRect(&rc, ii[j] - 20, 650, ii[j] + 20, 670); // Метки на оси OX
                DrawText (hDC, s, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
 
                sprintf(s, "%0.0f", buffer[j]);
                SetRect(&rc, 250, pnt_y - 20, 290, pnt_y + 20); // Те же самые метки на оси OY
                DrawText (hDC, s, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            }
            DeleteObject (NewPen);
            ReleaseDC (hWnd, hDC);
            EndPaint(hWnd, &ps);
            break;
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
18.05.2012, 16:11  [ТС]
Похоже я перегрелся, 80 и 100 для фиксированных иксов, когда ось начинается только на 300. Вашу Идею понял.
Большое Спасибо Вам!
0
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
26.05.2012, 21:35  [ТС]
Требуется добавить меню, а именно команды Файл -> Открыть и Файл -> Выход. Должен открывать txt файлы и выполнять чтение с них. Подскажите как реализовать?
Заранее Спасибо!
0
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
28.05.2012, 10:58  [ТС]
Обязательно ли добавлять файл ресурсов?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
28.05.2012, 11:10
Нет, не обязательно. Можно динамически добавить меню: перед созданием окна
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if (!RegisterClass(&wndClass)) return 0;
    HMENU hMenu = CreateMenu();
    HMENU hPopupMenu = CreatePopupMenu();
    AppendMenu(hPopupMenu, MF_STRING, IDM_OPEN, TEXT("&Открыть файл")); // IDM_OPEN - мой #define
    AppendMenu(hPopupMenu, MF_STRING, IDM_EXIT, TEXT("&Выход")); // IDM_EXIT тоже 
    AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hPopupMenu, TEXT("&Файл"));
 
    hWnd = CreateWindow(szProgName,
                        TEXT("LineDiag"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL, hMenu, hCurrentInst, NULL);
, а потом в WM_COMMAND лови IDM_OPEN/IDM_EXIT и делай там то, что тебе нужно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        // ...
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDM_OPEN :
                // Тут открываешь файл и читаешь из него
                break;
 
                case IDM_EXIT : ; // break-а нет, "проваливаемся" на WM_DESTROY
            }
 
        case WM_DESTROY:
        // ...
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
31.05.2012, 16:46  [ТС]
Подскажите, пожалуйста поподробнее, что нужно сделать? Не силен я, не силен.
Как определить идентификаторы IDM_OPEN И IDM_EXIT?
В часть:
case IDM_OPEN :
// Тут открываешь файл и читаешь из него
break;
Я должен как раз таки поставить открытие файла, чтение из файла и рисование?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
31.05.2012, 18:59
Цитата Сообщение от V.I.P Посмотреть сообщение
Как определить идентификаторы IDM_OPEN И IDM_EXIT?
C++
1
2
#define IDM_OPEN 1010
#define IDM_EXIT 1011
Можешь поставить другие значения, если 1010 и 1011 уже используются в других define-ах.
Цитата Сообщение от V.I.P Посмотреть сообщение
Я должен как раз таки поставить открытие файла, чтение из файла и рисование?
На фиг там рисование? Рисование у тебя уже есть в WM_PAINT, по IDM_OPEN я бы сделал только открытие файла и чтение из него. Ну, и Invalidate окну, чтобы заставить его перерисоваться после получения новых данных.
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
31.05.2012, 20:10  [ТС]
В какой последовательности должны идти WM_CREATE, WM_PAINT, WM_COMMAND, WM_DESTROY ?
Открытие файла и чтение из файла до этого у меня было в WM_CREATE. Его нужно полностью удалить или оставить пустым?

Полный текст:
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
#include <windows.h>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <iostream>
#define IDM_OPEN 1010
#define IDM_EXIT 1011
 
 
int numData;
int res;
FILE* pFile;
int str[1];
float * buffer;
float * buffer2;
int ii[10]={365, 430, 495, 560, 625, 690,755, 820, 885, 950};
int j;
 
float str1, str2;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
TCHAR szProgName[] = TEXT("LineDiag");
 
int WINAPI WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, LPSTR lpszCmdLine, int nCmdShow)
{
WNDCLASS wndClass;
HWND hWnd;
MSG message;
 
wndClass.lpszClassName = szProgName;
wndClass.hInstance = hCurrentInst;
wndClass.lpfnWndProc = WndProc;
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.lpszMenuName = 0;
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
 
if (!RegisterClass(&wndClass)) return 0;
    HMENU hMenu = CreateMenu();
    HMENU hPopupMenu = CreatePopupMenu();
    AppendMenu(hPopupMenu, MF_STRING, IDM_OPEN, TEXT("&Открыть файл")); 
    AppendMenu(hPopupMenu, MF_STRING, IDM_EXIT, TEXT("&Выход"));
    AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hPopupMenu, TEXT("&Файл"));
 
hWnd = CreateWindow(
szProgName,
TEXT("LineDiag"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hCurrentInst,
NULL
);
 
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
 
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
 
return message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rc;
    HPEN NewPen;
    HPEN OldPen;
 
    switch (nMessage)
    {
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case IDM_OPEN :
                pFile = fopen ("input.txt","r");
            for (int i=0; i<1000; i++)
            {
                res=fscanf(pFile,"%f %f",&str1, &str2);
                if (res>0) numData++;
            }
            rewind (pFile);
            buffer = (float*) malloc (sizeof(float)*numData);
            buffer2 = (float*) malloc (sizeof(float)*numData);
            for (int i=0; i<numData; i++)
            {
                fscanf(pFile,"%f %f", &buffer[i], &buffer2[i]);
            }
            for (int j=0; j<numData; j++)
            {
                fscanf(pFile, "%f %f", &buffer[j], &buffer2[j]);
            }
            fclose (pFile);
            break;
 
            case IDM_EXIT : ;
 
            }
 
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 300, 100);
            LineTo (hDC, 295, 115);
            MoveToEx (hDC,300, 100, NULL);
            LineTo (hDC,305, 115);
            MoveToEx (hDC, 300, 650, NULL);
            LineTo (hDC, 950, 650);
            LineTo (hDC, 935, 645);
            MoveToEx (hDC, 950, 650, NULL);
            LineTo (hDC, 935, 655);
            MoveToEx (hDC, 300, 650, NULL);
            NewPen = CreatePen (PS_SOLID, 2, RGB(255, 0, 0));
            SelectObject(hDC, NewPen);
 
            SetRect(&rc, 280, 650, 300, 670); // Ноль в начале координат
            DrawText (hDC, "0", -1, &rc,
                      DT_SINGLELINE | DT_CENTER | DT_VCENTER);
 
            for (int j=0; j<numData; j++)
            {
                char s[10] = {0};
                int pnt_y = 650 - (int)(0.5 * buffer[j]);
                LineTo(hDC,   ii[j], pnt_y);
 
                sprintf(s, "%0.0f", buffer[j]);
                SetRect(&rc, ii[j] - 20, 650, ii[j] + 20, 670); // Метки на оси OX
                DrawText (hDC, s, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
 
                sprintf(s, "%0.0f", buffer[j]);
                SetRect(&rc, 250, pnt_y - 20, 290, pnt_y + 20); // Те же самые метки на оси OY
                DrawText (hDC, s, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            }
            DeleteObject (NewPen);
            ReleaseDC (hWnd, hDC);
            EndPaint(hWnd, &ps);
            break;
 
       /* case WM_CREATE:
            pFile = fopen ("input.txt","r");
            for (int i=0; i<1000; i++)
            {
                res=fscanf(pFile,"%f %f",&str1, &str2);
                if (res>0) numData++;
            }
            rewind (pFile);
 
            buffer = (float*) malloc (sizeof(float)*numData);
            buffer2 = (float*) malloc (sizeof(float)*numData);
            for (int i=0; i<numData; i++)
            {
                fscanf(pFile,"%f %f", &buffer[i], &buffer2[i]);
            }
            for (int j=0; j<numData; j++)
            {
                fscanf(pFile, "%f %f", &buffer[j], &buffer2[j]);
            }
            fclose (pFile);
            break;*/
 
        case WM_DESTROY:
            free(buffer);
            free(buffer2);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, nMessage, wParam, lParam);
    }
    return 0;
}
Как я ни менял их местами, ни комментировал - меню нет.
В чем ошибка?
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
31.05.2012, 20:52
SetMenu (hWnd, hMenu); Меняй дальше...
1
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
31.05.2012, 21:14  [ТС]
Где должна располагаться функция DestroyMenu (hWnd); ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.05.2012, 21:14
Помогаю со студенческими работами здесь

Создание круговой диаграммы брать данные для диаграммы из dataGridView1 ?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

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

Создание линейной нейронной сети
Нужен пример в GUI matlab создание и реализация линейной нейронной сети

Создание программ не линейной структуры
Доброе время суток, очень нужно решить 2 задачи, буду огромно благодарен за помощь: 1) Задано натуральное число, диапазон значений слово....

Создание er диаграммы
Доброго времени суток! Сделал еr диаграмму в sql по нижеописанной предметной области, хотел узнать у экспертов правильно ли сделал? ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru