Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ и WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
#1

Линейная диаграмма (Прошу Помощи) - C++ WinAPI

17.05.2012, 15:45. Просмотров 2106. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2012, 15:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Линейная диаграмма (Прошу Помощи) (C++ WinAPI):

тема: C++ Visual Studio 2013 ПОМОЩИ ПРОШУ! А то уже сломаю голову скоро!
тема: C++ Visual Studio 2013 ПОМОЩИ ПРОШУ! А то уже сломаю голову скоро! ...

Линейная программа
Всем привет! прошу помощи: Целой переменной S присвоить сумму цифр...

Линейная диаграмма
Ребят, возникли трудности с созданием линейной горизонтальной диаграммы в...

Абрамов № 61, 85, 334(а), 374, 67(б,а). Прошу помочь, мне нужны эти задания для зачета прошу помощи.
Прошу помощи, скачайте файл Абрамов (пожалуйста), номер 61, 85, 334(а), 374,...

Линейная диаграмма жизни животных
Добрый вечер форумчане, сестра учится в школе и надо сделать задачу, сам не...

прошу помощи
Помогите получить зачетку. Надо написать токую програму на С : User вводит...

24
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
17.05.2012, 16:35 #2
Не знаю, что у тебя хранится в файле 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
Миниатюры
Линейная диаграмма (Прошу Помощи)  
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 16:58  [ТС] #3
У меня в Файле input.txt хранились данные в виде:
500 600
550 700
600 725
Каков должен быть файл для Вашей программы?
Хотелось бы полный текст Вашего творения, возникли некоторые проблемы с объявлениями. Знания нулевые (
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
17.05.2012, 17:07 #4
Цитата Сообщение от V.I.P Посмотреть сообщение
Хотелось бы полный текст Вашего творения
Вот полный текст, вместе в файлом проекта и txt-файлом (собиралось в Code::Blocks)
1
Вложения
Тип файла: zip arch.zip (2.1 Кб, 16 просмотров)
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 17:10  [ТС] #5
С объявлениями разобрался, Спасибо!
Но при отладке возникает следующее:
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
17.05.2012, 17:16 #6
Без понятия. У меня это выглядит так (см. аттач)

В крайнем случае можешь задать полное имя файла, если программа его не находит...
1
Миниатюры
Линейная диаграмма (Прошу Помощи)  
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 17:21  [ТС] #7
Эхм, за что отвечает файл t_strage.cbp?
strange файлов у меня в директории нет
0
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
17.05.2012, 17:29  [ТС] #8
Показывает ошибку в тексте "Требуется Выражение":
Каким образом избавиться?
Компилирую в MS Visual Studio 2010
0
Миниатюры
Линейная диаграмма (Прошу Помощи)  
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
17.05.2012, 17:44 #9
Цитата Сообщение от 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
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
18.05.2012, 15:45  [ТС] #10
Низкий поклон Вам, после изменения этой строчки ошибок нет, все замечательно работает!
Большое Спасибо за уделенное внимание и время!

Добавлено через 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
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
18.05.2012, 15:49 #11
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
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
18.05.2012, 16:11  [ТС] #12
Похоже я перегрелся, 80 и 100 для фиксированных иксов, когда ось начинается только на 300. Вашу Идею понял.
Большое Спасибо Вам!
0
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
26.05.2012, 21:35  [ТС] #13
Требуется добавить меню, а именно команды Файл -> Открыть и Файл -> Выход. Должен открывать txt файлы и выполнять чтение с них. Подскажите как реализовать?
Заранее Спасибо!
0
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
28.05.2012, 10:58  [ТС] #14
Обязательно ли добавлять файл ресурсов?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
28.05.2012, 11:10 #15
Нет, не обязательно. Можно динамически добавить меню: перед созданием окна
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
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
31.05.2012, 16:46  [ТС] #16
Подскажите, пожалуйста поподробнее, что нужно сделать? Не силен я, не силен.
Как определить идентификаторы IDM_OPEN И IDM_EXIT?
В часть:
case IDM_OPEN :
// Тут открываешь файл и читаешь из него
break;
Я должен как раз таки поставить открытие файла, чтение из файла и рисование?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
31.05.2012, 18:59 #17
Цитата Сообщение от 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
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
31.05.2012, 20:10  [ТС] #18
В какой последовательности должны идти 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
Digit@ll
Brainsbreaker
888 / 366 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
31.05.2012, 20:52 #19
SetMenu (hWnd, hMenu); Меняй дальше...
1
V.I.P
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 22
31.05.2012, 21:14  [ТС] #20
Где должна располагаться функция DestroyMenu (hWnd); ?
0
31.05.2012, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2012, 21:14
Привет! Вот еще темы с решениями:

Прошу помощи
Есть у меня отладочная плата на которой я экспериментирую. И вот возникла идея,...

Прошу помощи
Помогите пожалуйста... необходимо написать прогу, не понимаю как Создайте 2...

Прошу помощи!
Здравствуйте!Помогите если можете с задачами,знаю что задачи для человека...

Прошу помощи.
Доброго времени суток!! Помогите, если есть время, разобраться с проблемой -...


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

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

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