Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335

Передача сообщений между окнами. Как?

15.12.2012, 22:08. Показов 10181. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
задача такая есть два окна (дети одного окна)
- первое окно текстовое поле
- второе окно в котором рисуем (график)

когда срабатывает сообщение от кнопки информация с текстового поля отправляется и обрабатывается...
потом по очереди из функций обработки (которые лежат в заголовочных файлах) выходят значения (на каждый шаг цикла)
так вот эти значения (так же на каждый шаг этого же цикла) нужно передать в другое окно.
там эти значения должны приняться и соответственно обработаться.

как это сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2012, 22:08
Ответы с готовыми решениями:

Как сделать табуляцию между edit окнами
Есть много Edit окон.. хочу с помощью табуляции по ним двигаться. Что для этого необходимо?

Связь между окнами
Господа предположим , что есть некая программа "А" которая запускает другую не зависищую от программы "А" программу...

Передача сообщений в окно приложения
Добрый день. Есть приложение, которое запускается моей программой. Далее это приложение выдает окно для ввода пароля. Хочу сделать так,...

22
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
15.12.2012, 22:54
Цитата Сообщение от Gudsaf Посмотреть сообщение
так вот эти значения (так же на каждый шаг этого же цикла) нужно передать в другое окно.
там эти значения должны приняться и соответственно обработаться.
я не знаю чё там у тебя за значения, а ты не говоришь. Но допустим, какие-то хитрые значения:
C++
1
2
3
4
5
6
struct znach
{
 int x;
 bool y
 
};
Заполненный экземпляр такого типа должен обработаться в оконной процедуре. Для этого надо сгенерить своё авторское сообщение. И передать его в оконную процедуру того окна, которое это сообщение обработает, вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//во-первых НАШЕ СОБСТВЕННОЕ АВТОРСКОЕ сообщение
#define  WM_OURSOOBCHENIE  WM_USER+100h
 
//Тут определяем элемент типа znach, он должен быть глобальным
znach znach_;
 
if (<условие такое, что надо окну слать сообщение>) {
 
 //заполняем структуру
 znach_.x= 23;
 znach_.y= true;
 
 //или PostMessage, зависит от пожеланий.
 SendMessage(hWnd, WM_OURSOOBCHENIE,0, 0) 
 
}
ну вот так, теперь напиши в оконной процедуре обработчик сообщения WM_OURSOOBCHENIE и когда окно получит это сообщение, пусть что хочет со значениями, то и делает.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
15.12.2012, 23:25  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
я не знаю чё там у тебя за значения, а ты не говоришь. Но допустим, какие-то хитрые значения:
C++
1
2
3
4
5
6
struct znach
{
 int x;
 bool y
 
};
Заполненный экземпляр такого типа должен обработаться в оконной процедуре. Для этого надо сгенерить своё авторское сообщение. И передать его в оконную процедуру того окна, которое это сообщение обработает, вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//во-первых НАШЕ СОБСТВЕННОЕ АВТОРСКОЕ сообщение
#define  WM_OURSOOBCHENIE  WM_USER+100h
 
//Тут определяем элемент типа znach, он должен быть глобальным
znach znach_;
 
if (<условие такое, что надо окну слать сообщение>) {
 
 //заполняем структуру
 znach_.x= 23;
 znach_.y= true;
 
 //или PostMessage, зависит от пожеланий.
 SendMessage(hWnd, WM_OURSOOBCHENIE,0, 0) 
 
}
ну вот так, теперь напиши в оконной процедуре обработчик сообщения WM_OURSOOBCHENIE и когда окно получит это сообщение, пусть что хочет со значениями, то и делает.
угу, я кст так же написал сейчас)) слушай а такая проблема вот он сообщение отправит с помощью сендмсдж и потом по циклу вернётся за новым сообщением:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case MB_TAKETEXT:
                GetDlgItemText(hWnd, ID_HGRAFEDIT, buff,50);
                wcstombs(str,buff,50);      //сделали совместимую с ядром калькулятора строку
                f_create_string(str);
                
                while(1)
                {
                    res = CalculateCore (-10/*lBorder*/, 10/*rBorder*/, /*step*/2.0);
                    //рисовать
                    SendMessage(hGrafChart,OLOLO, res.x, res.y);
                    if (res.prevLBorder >= rBorder)
                        break;
                }
 
                break;
после шага сенд мессаг он входит - а мне надо чтоб оставался в цикле
Примерно так выглядит: получил значения отправил в окно другое, там быстренько прорисовал точки и потом вернулся в цикл (потому как важно значения сохранять)? или так не возможно?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
15.12.2012, 23:37
Цитата Сообщение от Gudsaf Посмотреть сообщение
после шага сенд мессаг он входит
куда он входит?

"Функция SendMessage отправляет заданное сообщение окну или окнам. Функция вызывает оконную процедуру для заданного окна и не возвращает значение до тех пор, пока оконная процедура не обработает сообщение. "

Это тебе надо?
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
15.12.2012, 23:48  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
куда он входит?

"Функция SendMessage отправляет заданное сообщение окну или окнам. Функция вызывает оконную процедуру для заданного окна и не возвращает значение до тех пор, пока оконная процедура не обработает сообщение. "

Это тебе надо?
Так точно!
Туплю - это всё сон)

Видишь в чём вся проблема - он успешно на каждый шаг цикла отправляет сообщение в окно другого класса, но не обрабатывает их - он просто проходит по циклу, отправляет их куда-то и всё. Я понимаю что должно отправлять в другую оконную процедуру, у меня есть класс - этот класс создан чисто под графикостроитель, у него своя функция обработки сообщений. Когда я пишу:
C++
1
SendMessage(hGrafChart,OLOLO, res.x, res.y);
то сообщение должно идити в:
chart.lpfnWndProc = PlotterProc;
который отличен от основного окна:
GrafClass.lpfnWndProc = GrafProc;

но оно не идёт.. и вот чё делать не знаю.
после того как он проходит весь цикл он дальше идёт почему-то WM_PAINT для главного окна (GrafProc).. может потому что он следующий по списку(???):
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
case MB_TAKETEXT:
                GetDlgItemText(hWnd, ID_HGRAFEDIT, buff,50);
                wcstombs(str,buff,50);                  //сделали совместимую с ядром калькулятора строку
                f_create_string(str);                   //передали строку в функцию создания выражения типа ОПН
                
                while(1)
                {
                    res = CalculateCore (lBorder, rBorder, step);
                    //рисовать
                    SendMessage(hGrafChart,OLOLO, res.x, res.y);
                    ;
                    if (res.prevLBorder >= rBorder)
                        break;
                    lBorder = res.prevLBorder;
                }
 
                break;
            }
        }
    case WM_PAINT:                                          //сообщение перерисовки окна, сделано будет следующее:
        hDC2 = BeginPaint(hWnd, &PaintS);                   //получение хэндла контекста, получаем контекст самого устройства
        Line(hDC2, 20, 50, 860, 50);
        GetClientRect(hWnd,&Rect);                          //определяем размер рабочей области окна
        DrawText (hDC2,L"Hello world!",-1,&Rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hWnd,&PaintS);                             //освобождаем основной контекст, завершая прорисовку окна
        break;
НИЖЕ ПРИКРЕПИЛ ВЕСЬ КОД ОКНА ( хедеры сливать не буду - там только от функции CalculateCore (lBorder, rBorder, step) приходит инфа и всё)

Кликните здесь для просмотра всего текста
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
#include <windows.h>
#include "CalkCore2.h"
 
#define ID_GrafExit     1333
#define ID_GrafMin      1332
#define ID_GrafPlotter  1331
#define ID_PAINTBUTTON  1334
#define ID_HGRAFEDIT    1335
#define MB_TAKETEXT     1336
#define OLOLO           1337
 
static wchar_t buff[50];
wchar_t Buf[2];
char str[50];
int xView, yView;
 
static HWND hGrafWnd;                                   //родительское окно
HINSTANCE hInstance;
 
LRESULT CALLBACK GrafProc ( HWND, UINT, UINT, LONG );
LRESULT CALLBACK ChildProc ( HWND, UINT, UINT, LONG ); 
LRESULT CALLBACK PlotterProc ( HWND, UINT, UINT, LONG );
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2);
 
 
int WINAPI WinMain (HINSTANCE hlnstance,                //хэндл текущей программы 
                    HINSTANCE hPrevInstance,            //хэндл предыдущей копии программы
                    LPSTR lpszCmdParam,                 //
                    int nCmdShow)                       //в каком виде появляется окно
{
    /*Определяем класс окна*/
    //HWND Buttom;
    WNDCLASS GrafClass;                                 //WndClass - так называется класс нашего окна
    WNDCLASS ol;                                        //ol -вспомогательная структура для регистрации класса AnimatedClass
    WNDCLASS chart;                                     //text - вспомогательна структура для отдельного текстового поля
    MSG MessageFromWind;
 
    /* Заполняем структуру типа WNDCLASS */
    GrafClass.style = CS_HREDRAW |                                      //перерисовать если изменили горизонталь
                        CS_VREDRAW;                                     //перерисовать если изменили вертикаль
                        //CS_GLOBALCLASS ;                              //клас, доступный всем приложениям (для длл)
                        //CS_NOCLOSE|                                   //нет значка закрыть
                        //CS_OWNDC                                      //выделение уникального контектса устроства для каждого окна созданного при помощи этого класса
    GrafClass.lpfnWndProc = GrafProc;                                   //указатель на оконную функцию обработки команд приходящих из окна
    GrafClass.cbClsExtra = 0;                                           //резервирование памяти/?
    GrafClass.cbWndExtra = 0;                                           //резервирование памяти/?
    GrafClass.hInstance = hlnstance;                                    //хэндл текущей программы (сообщается классу)
                                                                        //хэндл иконки для окон данного класса
    GrafClass.hIcon = LoadIcon(NULL,                                    //
                                IDI_SHIELD);                            //
                                                                        //хэндл курсора для данного класса
    GrafClass.hCursor = LoadCursor (NULL,                               //
                                IDC_ARROW);                             //
    GrafClass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH/*DKGRAY_BRUSH*/);    //хэндл кисти которой будет закрашен фон окна
    GrafClass.lpszMenuName = L"MyMenu";                                 //указатель на строку содержащюю имя нужного нам меню
    GrafClass.lpszClassName = L"GrafClass";                             //указатель на строку содержащюю имя создаваемого нами класса окна
 
    ol.style = CS_HREDRAW|CS_VREDRAW|CS_GLOBALCLASS;
    ol.lpfnWndProc = ChildProc;
    ol.cbClsExtra = 0;
    ol.cbWndExtra = 0;
    ol.hInstance = hlnstance;
    ol.hIcon = LoadIcon(NULL,IDI_SHIELD);
    ol.hCursor = LoadCursor (NULL,IDC_ARROW);
    ol.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    ol.lpszMenuName = NULL;
    ol.lpszClassName = L"AnimatedClass";
    
    chart.style = CS_HREDRAW|CS_VREDRAW|CS_GLOBALCLASS;
    chart.lpfnWndProc = PlotterProc;
    chart.cbClsExtra = 0;
    chart.cbWndExtra = 0;
    chart.hInstance = hlnstance;
    chart.hIcon = LoadIcon(NULL,IDI_SHIELD);
    chart.hCursor = LoadCursor (NULL,IDC_ARROW);
    chart.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    chart.lpszMenuName = NULL;
    chart.lpszClassName = L"PlotterClass";
 
    /*Регистрируем классs*/
    if ( !RegisterClass(&GrafClass))                                    //внутрь передаётся указатель на сруктуру регистрируемого класса
    {
        MessageBox(NULL,L"Cannot register class",L"Error",MB_OK); 
        return 0;
    }
    if ( !RegisterClass(&ol))                                           //внутрь передаётся указатель на сруктуру регистрируемого класса
    {
        MessageBox(NULL,L"Cannot register class",L"Error",MB_OK); 
        return 0;
    }
    if ( !RegisterClass(&chart))                                        //внутрь передаётся указатель на сруктуру регистрируемого класса
    {
        MessageBox(NULL,L"Cannot register class",L"Error",MB_OK); 
        return 0;
    }
 
    /*Создаём окно данного класса*/
    hGrafWnd = CreateWindow(L"GrafClass",       //указатель на строку с именем класса, к которому будет принадлежать созданое нами окно
                        NULL,                   //имя окна
                        WS_POPUP | WS_BORDER,   //стили принимаемые окном
                        200,                    //горизонтальная позиция
                        100,                    //вертикальная позиция
                        880,                    //ширина
                        530,                    //высота
                        NULL,                   //указатель на родительское окно
                        NULL,                   //указатель на меню
                        hlnstance,              //хэндл экземпляра программы которого мы запускаем (см выше)
                        NULL);                  //указатель на структуры с дополнительной информацией для этого окна
    if(!hGrafWnd)
    {
        MessageBox(NULL,L"Ololo",L"Error'ka",MB_OK); 
        return 0;
    }
 
    /* Функция отображения окна на экране */
    ShowWindow(hGrafWnd,                        //хэндл окна которое нужно тобразить
                nCmdShow);                      //вид отображения окна с данным хэндлом
 
    /* Функция обновления окна */
    UpdateWindow(hGrafWnd);
 
    /* Beginning of messages cycle */
    while(GetMessage(&MessageFromWind,          //&MessageFromWind - указатель на струтуру типа MSG, туда будет записана информация пришедшего сообщения
                    NULL,                       //NULL - хэндл окна созданного программой (NULL = обрабатываются сообщения из всех окон этой программы)
                    0,                          //нижняя граница диапазона
                    0))                         //верхняя граница диапазона
    {
        TranslateMessage(&MessageFromWind);     //преобразование сообщения в более удобный вид
        DispatchMessage(&MessageFromWind);      //передача преобразованного сообщения в оконную функцию
    }
    return MessageFromWind.wParam;
}
 
/* Оконная функция */
LRESULT CALLBACK GrafProc (HWND hWnd,UINT Message,UINT wParam, LONG lParam)
{
    static HWND hGrafButtonExit;
    static HWND hGrafButtonMinimise;
    static HWND hGraflol;
    static HWND hGrafEdit;
    static HWND hGrafTakeText;
    static HWND hGrafChart;
    HDC hDC2;
    PAINTSTRUCT PaintS;
    RECT Rect;
    RESULT res;
 
    int lBorder = -10;
    int rBorder = 10;
    double step = 1.0;
 
 
    switch(Message)
    {
    case WM_CREATE:
            hGrafButtonExit = CreateWindow(L"button",
                        L"ex",
                        WS_CHILD | WS_VISIBLE,
                        840,
                        5,
                        30,
                        30,
                        hWnd,
                        (HMENU)ID_GrafExit, 
                        hInstance,
                        NULL);
            hGrafButtonMinimise = CreateWindow(L"button",
                        L"min",
                        WS_CHILD | WS_VISIBLE,
                        805,
                        5,
                        30,
                        30,
                        hWnd,
                        (HMENU)ID_GrafMin, 
                        hInstance,
                        NULL);
            hGrafTakeText = CreateWindow (L"button",
                        L"Take Text",
                        WS_CHILD | WS_VISIBLE,
                        630,
                        120,
                        100,
                        40,
                        hWnd,
                        (HMENU)MB_TAKETEXT,
                        hInstance,
                        NULL);
            hGraflol = CreateWindow(L"AnimatedClass",
                        NULL,
                        WS_CHILD | WS_VISIBLE | WS_BORDER,
                        600,
                        5,
                        80,
                        30,
                        hWnd,
                        (HMENU)ID_GrafMin, 
                        hInstance,
                        NULL);
            hGrafEdit = CreateWindow (L"edit",
                        NULL, 
                        WS_CHILD|WS_VISIBLE|ES_CENTER|WS_BORDER, 
                        630, 
                        70, 
                        230, 
                        20, 
                        hWnd, 
                        (HMENU)ID_HGRAFEDIT, 
                        hInstance,
                        NULL);
            hGrafChart = CreateWindow(L"PlotterClass",
                        NULL,
                        WS_CHILD | WS_VISIBLE | WS_BORDER,
                        20,
                        70,
                        590,
                        440,
                        hWnd,
                        (HMENU)ID_GrafPlotter, 
                        hInstance,
                        NULL);
            break;
    case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
            case ID_GrafExit:
                PostQuitMessage(0);
                break;
            case ID_GrafMin:
                ShowWindow(hWnd, SW_MINIMIZE);
                break;
            case MB_TAKETEXT:
                GetDlgItemText(hWnd, ID_HGRAFEDIT, buff,50);
                wcstombs(str,buff,50);                  //сделали совместимую с ядром калькулятора строку
                f_create_string(str);                   //передали строку в функцию создания выражения типа ОПН
                
                while(1)
                {
                    res = CalculateCore (lBorder, rBorder, step);
                    //рисовать
                    SendMessage(hGrafChart,OLOLO, res.x, res.y);
                    ;
                    if (res.prevLBorder >= rBorder)
                        break;
                    lBorder = res.prevLBorder;
                }
 
                break;
            }
        }
    case WM_PAINT:                                          //сообщение перерисовки окна, сделано будет следующее:
        hDC2 = BeginPaint(hWnd, &PaintS);                   //получение хэндла контекста, получаем контекст самого устройства
        Line(hDC2, 20, 50, 860, 50);
        GetClientRect(hWnd,&Rect);                          //определяем размер рабочей области окна
        DrawText (hDC2,L"Hello world!",-1,&Rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hWnd,&PaintS);                             //освобождаем основной контекст, завершая прорисовку окна
        break;
    case WM_NCHITTEST:
        {
        LRESULT currentArea = DefWindowProc(hWnd,Message,wParam,lParam);
        if (HTCLIENT == currentArea)
        return HTCAPTION;
        return currentArea;
        }
        break;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);    //те сообщения которые не включены в оконную функцию обработки идут сюда
}
 
LRESULT CALLBACK ChildProc (HWND hWnd,UINT Message,UINT wParam, LONG lParam)
{
    HDC hDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    //HBRUSH SomeBrush;
 
    switch(Message)
    {
    case WM_LBUTTONDOWN:
        PostQuitMessage(0);
        break;
    case WM_MOUSEMOVE:
        break;
    case WM_PAINT:                                          //сообщение перерисовки окна, сделано будет следующее:
        hDC = BeginPaint(hWnd, &PaintStruct);                   //получение хэндла контекста, получаем контекст самого устройства
        GetClientRect(hWnd,&Rect);                          //определяем размер рабочей области окна
        DrawText (hDC,L"Asssa!",-1,&Rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hWnd,&PaintStruct);                                //освобождаем основной контекст, завершая прорисовку окна
        break;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);    //те сообщения которые не включены в оконную функцию обработки идут сюда
}
 
LRESULT CALLBACK PlotterProc (HWND hWnd,UINT Message,UINT wParam, LONG lParam)
{
    HDC hDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    HPEN hPen = CreatePen(1,4,RGB(255,25,0));
    double x = 0;
    double y = 0;
    //HBRUSH SomeBrush;
 
 
    switch(Message)
    {
    case WM_SIZE:
        xView=LOWORD(lParam);
        yView=HIWORD(lParam);
        break;
    case OLOLO:
        x = wParam;
        y = lParam;
        hDC = BeginPaint(hWnd, &PaintStruct);
        SetMapMode(hDC, MM_ISOTROPIC);                      //логические единицы отображаем, как физические
        SetViewportExtEx(hDC, xView, -yView, NULL);         //Определяем облась вывода
        SetViewportOrgEx(hDC, xView/6, yView/2, NULL);      //Начало координат
//Создание красного пера
        SelectObject(hDC, hPen);
        LineTo(hDC, x, (int)y);
//Делаем перо снова чёрным
        hPen=CreatePen(1,1,RGB(0,0,0));
        SelectObject(hDC, hPen);
//Наносим деления
        //for(x=-100; x<500; x+=100)
        //{
        //  Line(hDC, x, 3,x,-3);
        //  Line(hDC, -3, x,3,x);
        //  itoa(x, (char*) Buf, 10);
        //  TextOut(hDC, x-5, -5, Buf , strlen( (char*) Buf));
        //  TextOut(hDC, -5, x, Buf , strlen( (char*) Buf)); 
        //}
        ValidateRect(hWnd, NULL); //Обновляем экран
        EndPaint(hWnd, &PaintStruct);
        break;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &PaintStruct);
        SetMapMode(hDC, MM_ISOTROPIC);                      //логические единицы отображаем, как физические
        SetWindowExtEx(hDC, 500,500, NULL);                 //Длина осей
        SetViewportExtEx(hDC, xView, -yView, NULL);         //Определяем облась вывода
        SetViewportOrgEx(hDC, xView/6, yView/2, NULL);      //Начало координат
//Рисуем оси координат
        Line(hDC,0, 220,0,-220);                            //ось У
        Line(hDC, -100,0,500,0);                            //ось Х
        MoveToEx(hDC, 0,0,NULL);                            //перемещаемся в начало координат
        ValidateRect(hWnd, NULL); //Обновляем экран
        EndPaint(hWnd, &PaintStruct);
        break;
    case WM_MOUSEMOVE:
        break;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);    //те сообщения которые не включены в оконную функцию обработки идут сюда
}
 
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2)
{
    MoveToEx(hdc, x1, y1, NULL); //сделать текущими координаты x1, y1
    return LineTo(hdc, x2, y2); //нарисовать линию
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.12.2012, 00:21
Цитата Сообщение от Gudsaf Посмотреть сообщение
но оно не идёт.. и вот чё делать не знаю.
Ну допустим. Но скажи на милость, зачем мне весь код PlotterProc? Тем более. чтобы убедиться, что да, не идёт сообщение он на фиг не нужен. Достаточно оставить:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LRESULT CALLBACK PlotterProc (HWND hWnd,UINT Message,UINT wParam, LONG lParam)
{
    switch(Message)
    {
    case WM_SIZE:
    case OLOLO:
     printf ("тут отладочная надпись, чтобы убедиться- да, сообщение не приходит");    
   case WM_PAINT:
        break;
    case WM_MOUSEMOVE:
        break;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);    //те сообщения которые не включены в оконную функцию обработки идут сюда
}
Нормально? Ну или там минимум какой оставить, чтобы скомпилилось, я не вникал. Ещё раз: нам ни фига не надо рисовать, нам надо убедиться, что сообщение не приходит.

Если ты так будешь упрощать код, ты постепенно дойдёшь до ошибки сам, 99%

Ну и потом я не уверен, что ты правильно назначаешь процедуру окна PlotterProc. Я не знаю на самом деле, так это или нет, но я бы попробовал сабклассинг.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
16.12.2012, 00:42  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Ну допустим. Но скажи на милость, зачем мне весь код PlotterProc? Тем более. чтобы убедиться, что да, не идёт сообщение он на фиг не нужен. Достаточно оставить:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LRESULT CALLBACK PlotterProc (HWND hWnd,UINT Message,UINT wParam, LONG lParam)
{
    switch(Message)
    {
    case WM_SIZE:
    case OLOLO:
     printf ("тут отладочная надпись, чтобы убедиться- да, сообщение не приходит");    
   case WM_PAINT:
        break;
    case WM_MOUSEMOVE:
        break;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);    //те сообщения которые не включены в оконную функцию обработки идут сюда
}
Нормально? Ну или там минимум какой оставить, чтобы скомпилилось, я не вникал. Ещё раз: нам ни фига не надо рисовать, нам надо убедиться, что сообщение не приходит.

Если ты так будешь упрощать код, ты постепенно дойдёшь до ошибки сам, 99%

Ну и потом я не уверен, что ты правильно назначаешь процедуру окна PlotterProc. Я не знаю на самом деле, так это или нет, но я бы попробовал сабклассинг.
мне проще было скинуть всё и разом)))
сабклассинг - такого ещё не проходил))
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.12.2012, 01:22
Конечно проще, базара нет, кто же спорит. Только на фиг оно надо. Сабклассинг это легко, это когда ты создаёшь дочернее окно, а потом изменяешь его параметры, в частности оконную процедуру.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
            hGrafEdit = CreateWindow (L"edit",
                        NULL, 
                        WS_CHILD|WS_VISIBLE|ES_CENTER|WS_BORDER, 
                        630, 
                        70, 
                        230, 
                        20, 
                        hWnd, 
                        (HMENU)ID_HGRAFEDIT, 
                        hInstance,
                        NULL); 
 
          LONG OldWndProc = SetWindowLong (hGrafEdit,GWL_WNDPROC,addr PlotterProc)
Всё, новая оконная процедура установлена, теперь в OldWndProc адрес бывшей оконной процедуры, его надо использовать так:

C++
1
2
3
4
    case WM_MOUSEMOVE:
        break;
    }
 CallWindowProc (OldWndProc,hEdit,uMsg,wParam,lParam );
тут рабочий пример на асме

Я бы так попробовал только для того хотя бы, чтобы убедиться- да, это работает (не работает)

Здесь пацаны переписали этот пример на C, изучай не хочу (убери пробелы)
http://www. p r o g r a m m e r s f o r u m.ru/showthread.php?t=202764&page=2
1
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
16.12.2012, 15:08  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Конечно проще, базара нет, кто же спорит. Только на фиг оно надо. Сабклассинг это легко, это когда ты создаёшь дочернее окно, а потом изменяешь его параметры, в частности оконную процедуру.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
            hGrafEdit = CreateWindow (L"edit",
                        NULL, 
                        WS_CHILD|WS_VISIBLE|ES_CENTER|WS_BORDER, 
                        630, 
                        70, 
                        230, 
                        20, 
                        hWnd, 
                        (HMENU)ID_HGRAFEDIT, 
                        hInstance,
                        NULL); 
 
          LONG OldWndProc = SetWindowLong (hGrafEdit,GWL_WNDPROC,addr PlotterProc)
Всё, новая оконная процедура установлена, теперь в OldWndProc адрес бывшей оконной процедуры, его надо использовать так:

C++
1
2
3
4
    case WM_MOUSEMOVE:
        break;
    }
 CallWindowProc (OldWndProc,hEdit,uMsg,wParam,lParam );
тут рабочий пример на асме

Я бы так попробовал только для того хотя бы, чтобы убедиться- да, это работает (не работает)

Здесь пацаны переписали этот пример на C, изучай не хочу (убери пробелы)
http://www. p r o g r a m m e r s f o r u m.ru/showthread.php?t=202764&page=2
ЗБС, чё! а то я тут начал уже изучать многопоточность. Хотел параллельно поток запускать после первого шага цикла)) хотя это тоже мне кажется нормальная идея..
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.12.2012, 15:13
Да, многопоточность нормальная идея. Тем более если имеешь дело с окнами. Правда, в твоём случае это может быть преждевременно, т. к. насколько я могу судить родительскими и дочерними окнами управляет один поток.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
16.12.2012, 15:40  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Да, многопоточность нормальная идея. Тем более если имеешь дело с окнами. Правда, в твоём случае это может быть преждевременно, т. к. насколько я могу судить родительскими и дочерними окнами управляет один поток.
хм... тогда дело плохо - ведь моё окно где строится график - дочернее окно. Я хотел его изначально сделать не дочерним - но иначе оно не хочет показываться в плоскости окна-родителя... Слушай а разве в майкрософте не придумали что-то подобное как потоки, но только в переделах одного родителя: что-то на подобие "подпотока" для основного потока?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.12.2012, 16:20
Да как не придумали-то? Создаёшь поток, потом в нём хоть засоздавайся потоков-то. И каждый из них может создавать окна. 100 потоков сто окон

Но второй вопрос, что тебе эти окна надо как-то будет друг относительно друга расположить, я щас так понимаю, у тебя главное окно и в нём что-то типа редактора и тебя это устраивает.

Ну и пусть оно так и будет. У тебя щас один поток. Разберись сперва с простой вещью- почему окну не приходит сообщение. Всё. Дальше видно будет.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
16.12.2012, 17:18  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Да как не придумали-то? Создаёшь поток, потом в нём хоть засоздавайся потоков-то. И каждый из них может создавать окна. 100 потоков сто окон

Но второй вопрос, что тебе эти окна надо как-то будет друг относительно друга расположить, я щас так понимаю, у тебя главное окно и в нём что-то типа редактора и тебя это устраивает.

Ну и пусть оно так и будет. У тебя щас один поток. Разберись сперва с простой вещью- почему окну не приходит сообщение. Всё. Дальше видно будет.
отправил сообщение - в окно, причём как хотел значения правда передаются через глобальную переменную (сейчас ищу инфу - хочу значения засунуть в параметры переданного сообщения прямо в wParam или lParam)

решил проблему на удивление просто:
C++
1
2
3
4
5
6
7
8
9
while(1)
                {
                    res = CalculateCore (lBorder, rBorder, step);
                    //рисовать
                    CallWindowProc(PlotterProc, hGrafEdit,OLOLO, NULL, NULL);
                    if (res.prevLBorder >= rBorder)
                        break;
                    lBorder = res.prevLBorder;
                }
вызывал прямо из GrafProc. В итоге вышло что обрабатывается сообщение в PlotterProc и потом возвращается и читает условие
C++
1
2
if (res.prevLBorder >= rBorder)
                        break;
То что надо!
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
17.12.2012, 18:58  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Конечно проще, базара нет, кто же спорит. Только на фиг оно надо. Сабклассинг это легко, это когда ты создаёшь дочернее окно, а потом изменяешь его параметры, в частности оконную процедуру.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
            hGrafEdit = CreateWindow (L"edit",
                        NULL, 
                        WS_CHILD|WS_VISIBLE|ES_CENTER|WS_BORDER, 
                        630, 
                        70, 
                        230, 
                        20, 
                        hWnd, 
                        (HMENU)ID_HGRAFEDIT, 
                        hInstance,
                        NULL); 
 
          LONG OldWndProc = SetWindowLong (hGrafEdit,GWL_WNDPROC,addr PlotterProc)
Всё, новая оконная процедура установлена, теперь в OldWndProc адрес бывшей оконной процедуры, его надо использовать так:

C++
1
2
3
4
    case WM_MOUSEMOVE:
        break;
    }
 CallWindowProc (OldWndProc,hEdit,uMsg,wParam,lParam );
поюзал твою идею, подделал под своё:
C++
1
2
3
4
5
6
7
8
9
while(1)
                {
                    res = CalculateCore (lBorder, rBorder, step);
                    //рисовать
                    CallWindowProc(PlotterProc, hGrafEdit,OLOLO, NULL, NULL);
                    if (res.prevLBorder >= rBorder)
                        break;
                    lBorder = res.prevLBorder;
                }
Не хочет оно! Я не правильно что-то делаю. Сообщение отправляется в окно и начинается процесс, но фигня в том что когда отправляется сообщение в его параметре hWnd идёт пустота - в итоге оно рисует хрен поймёт где!
C++
1
2
3
CallWindowProc(PlotterProc, hGrafEdit,OLOLO, NULL, NULL);
//в hGrafEdit идёт очевидная хрень (НУЛИ)
//пробовал менять значение hWnd с hGrafEdit на другие - толку ноль идут те же нули!
и я не знаю как в hWnd переслать параметры именно нашего окна, окна hGrafChart
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.12.2012, 20:41
Какая IDE у тебя?
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
17.12.2012, 22:23  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Какая IDE у тебя?
VS12 x64
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.12.2012, 22:32
плохо, ну ладно всё равно скинь проект, я посмотрю чё там
1
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
18.12.2012, 00:11  [ТС]
На диск скинул
http://yadi.sk/d/xPtg5tPz1HxES

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
плохо, ну ладно всё равно скинь проект, я посмотрю чё там
вот оно
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.12.2012, 00:35
А в каком файле этот макрос определён? Чё-то я у себя не могу найти
IDI_SHIELD
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
18.12.2012, 11:38  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
А в каком файле этот макрос определён? Чё-то я у себя не могу найти
IDI_SHIELD
Что такое макрос? В файле Исходный код.срр - исходник окна, в СalkCore.cpp - калькулятор , он используется для получения координат точек.

Ты каким билдером пользуешься? Я лично VisualStudio - просто в ней открой проект WinGraf, а если другим то перенеси два файла .срр и запусти
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2012, 11:38
Помогаю со студенческими работами здесь

Конструкторы,передача сообщений объектам и реакции объектов на сообщения в С++
Привет всем! Тему чуть-чуть понимаю,но задачу сделать не могу, вы не могли бы мне помочь с этим? вот задача:Создаваемый объект должен...

Передача сообщений между окнами в программе
проблема в следующем: 1е окно выводит БД при нажатии на кнопку, появляется 2-е окно которое содержит некоторые данные. на этом окне...

Передача данных между Окнами
Добрый день! Есть приложение в Matlab Gui в главном окне по нажатию кнопки открывается вспомогательное окно, в нём задаётся матрица ,...

Передача переменных между окнами
Здравствуйте! Подскажите,пожалуйста, как можно передать значение переменной из главного окна в модальное?

Передача данных между окнами
Как из одного окна передать список в другое окно? С обычными переменами проблем нет, передавал через стат.класс, а как быть со списками?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru