Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для Kombova
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 3

API/MFC работа с графом

06.04.2014, 00:40. Показов 1763. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите пожалуйста найти ошибку или дописать недостающее. только недавно полез в апи и мфс,поэтому могу не до конца все понимать. написал прогу, в которой, пока что, при нажатии кнопки должна происходить отрисовка вершины, соединение вершины и перетаскивание мышкой графа, вместе с ребрами. скорее всего дело в том, что не передаются параметры wndproc. вот код:
........................................ .......................
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
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
//ClassName.h
#pragma once
class ClassName
{
public:
    ClassName();
    ~ClassName();
};
class  MultiMatrix
{
public:
    MultiMatrix();
    ~MultiMatrix();
 
    void DrawGraph();
    void DrawNode();
    void DrawLink();
    void ChangeNodePlace();
    
    int a[6][10000];
    HWND hWnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    HDC hdc;
};
///////////////////////////////////
//ClassName.cpp
#include "stdafx.h"
#include "ClassName.h"
#include <windowsx.h>
#define MAX_SIZE = 100000
ClassName::ClassName()
{
}
MultiMatrix::MultiMatrix()      
{
}
 
MultiMatrix::~MultiMatrix()     
{
}
 
ClassName::~ClassName()
{
}
 
    BOOL DrawLine(HDC hdc, int x, int y, int x1, int y1)
    {
        POINT pt;
        MoveToEx(hdc, x, y, &pt);
        return LineTo(hdc, x1, y1);
    }
    
        void MultiMatrix::DrawGraph()
    {
        int i, j, x, y, x1, y1;
        //for (i = 0; i < 6; i++)
        for (j = 0; j < 10000; j++)
        {
            if (a[1][j] != 0 && a[2][j] != 0)
            {
                x = a[1][j];
                y = a[2][j];
                Ellipse(hdc, x-5, y-5, x+5, y+5);
                
            }
            for (i = 0; i < 10000; i++)
            if (a[3][j] = a[3][i])
            {
                x = a[1][i];
                y = a[2][i];
                x1 = a[1][j];
                y1 = a[2][j];
                DrawLine(hdc, x, y, x1, y1);
            }
        }
        };
 
        void MultiMatrix::DrawNode()
    {
        
 
        int i,  m;  //j
        static int x, y;
        m = 0;
   
        switch (message)
        {
 
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
            m = m + 1;
            int b, c, d, e;
 
            x = GET_X_LPARAM(lParam);
            y = GET_Y_LPARAM(lParam);
 
 
            for (i = 0; i < 2; i++)
            {
                a[1][m] = x;
                a[2][m] = y;
            }
            MoveToEx(hdc, x, y, NULL);
            b = x - 5;
            c = y - 5;
            d = x + 5;
            e = y + 5;
            Ellipse(hdc, b, c, d, e);
 
            break;
 
        }
        };;
 
        void MultiMatrix::DrawLink()
    {
        int  j, b, c, d, e, q, p;  //i
        static int x, y, x1, y1;
        
        switch (message)
        {
 
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
 
            x = GET_X_LPARAM(lParam);
            y = GET_Y_LPARAM(lParam);
 
            b = x - 5;
            c = y - 5;
            d = x + 5;
            e = y + 5;
            for (j = 0; j < 10000; j++)
            {
                if (a[1][j]<d && a[1][j]>b && a[2][j]<c && a[2][j]>e)
                {
                    q = j;
                    
        case WM_LBUTTONDBLCLK:
            
            x1 = GET_X_LPARAM(lParam);
            y1 = GET_Y_LPARAM(lParam);
            b = x1 - 5;
            c = y1 - 5;
            d = x1 + 5;
            e = y1 + 5;
 
            for (j = 0; j < 10000; j++)
            {
                if (a[1][j]<d && a[1][j]>b && a[2][j]<c && a[2][j]>e)
                {
                    p = j;
                 DrawLine(hdc, x, y, x1, y1);
                }
            }
            a[3][q] = p;
            a[3][p] = q;
                }
            }
        }
        };
 
        void MultiMatrix::ChangeNodePlace()
    {
        int  j, b, c, d, e;  //i
        static int x, y, x1, y1;
        MultiMatrix m;
 
        switch (message)
        {
 
        case WM_LBUTTONDOWN:
            x = GET_X_LPARAM(lParam);
            y = GET_Y_LPARAM(lParam);
            b = x - 5;
            c = y - 5;
            d = x + 5;
            e = y + 5;
 
            for (j = 0; j < 10000; j++)
            {
                if (a[1][j]<d && a[1][j]>b && a[2][j]<c && a[2][j]>e)
                {
        case WM_MOUSEMOVE:
        case WM_LBUTTONUP:
            x1 = GET_X_LPARAM(lParam);
            y1 = GET_Y_LPARAM(lParam);
            a[1][j] = x1;
            a[2][j] = y1;
 
                }
            }
            m.DrawGraph();
        }
    }
///////////////////////////////////////////////////////
 
// progaDlg.cpp : файл реализации
//
 
#include "stdafx.h"
#include "proga.h"
#include "progaDlg.h"
#include "afxdialogex.h"
#include "ClassName.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// Диалоговое окно CAboutDlg используется для описания сведений о приложении
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    MultiMatrix m;
    switch (message)
    {
    case WM_CREATE:
        HDC hdc;
        hdc = GetDC(hWnd);
        m.hWnd = hWnd;
        m.hdc = hdc;
        m.message = message;
        m.wParam = wParam;
        m.lParam = lParam;
        break;
    case WM_DESTROY: PostQuitMessage(0);
        break;
    default: return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();
 
// Данные диалогового окна
    enum { IDD = IDD_ABOUTBOX };
 
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV
 
// Реализация
protected:
    DECLARE_MESSAGE_MAP()
};
 
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
 
 
// диалоговое окно CprogaDlg
 
 
 
CprogaDlg::CprogaDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CprogaDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
 
void CprogaDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CprogaDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CprogaDlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CprogaDlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON3, &CprogaDlg::OnBnClickedButton3)
    ON_NOTIFY(NM_THEMECHANGED, IDC_SCROLLBAR2, &CprogaDlg::OnNMThemeChangedScrollbar2)
    ON_NOTIFY(NM_THEMECHANGED, IDC_SCROLLBAR1, &CprogaDlg::OnNMThemeChangedScrollbar1)
END_MESSAGE_MAP()
 
 
// обработчики сообщений CprogaDlg
 
BOOL CprogaDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    // Добавление пункта "О программе..." в системное меню.
 
    // IDM_ABOUTBOX должен быть в пределах системной команды.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
 
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }
 
    // Задает значок для этого диалогового окна.  Среда делает это автоматически,
    //  если главное окно приложения не является диалоговым
    SetIcon(m_hIcon, TRUE);         // Крупный значок
    SetIcon(m_hIcon, FALSE);        // Мелкий значок
 
    // TODO: добавьте дополнительную инициализацию
 
    return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}
 
void CprogaDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}
 
// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.
 
void CprogaDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // контекст устройства для рисования
 
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // Выравнивание значка по центру клиентского прямоугольника
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
 
        // Нарисуйте значок
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}
 
// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CprogaDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}
 
 
 
void CprogaDlg::OnBnClickedButton1()
{
    // TODO: добавьте свой код обработчика уведомлений
    MultiMatrix m;
    m.DrawNode();
}
 
 
void CprogaDlg::OnBnClickedButton2()
{
    // TODO: добавьте свой код обработчика уведомлений
    MultiMatrix m;
    m.DrawLink();
}
 
 
void CprogaDlg::OnBnClickedButton3()
{
    // TODO: добавьте свой код обработчика уведомлений
    MultiMatrix m;
    m.ChangeNodePlace();
}
 
 
void CprogaDlg::OnNMThemeChangedScrollbar1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // Для этого средства требуется Windows XP или более поздняя версия.
    // Символ _WIN32_WINNT должен быть >= 0x0501.
    // TODO: добавьте свой код обработчика уведомлений
    *pResult = 0;
}
 
void CprogaDlg::OnNMThemeChangedScrollbar2(NMHDR *pNMHDR, LRESULT *pResult)
{
    // Для этого средства требуется Windows XP или более поздняя версия.
    // Символ _WIN32_WINNT должен быть >= 0x0501.
    // TODO: добавьте свой код обработчика уведомлений
    *pResult = 0;
}
и да, я понимаю, что в WM_CREATE есть неслабая чушь, но я просто не знаю, как можно передать значения wndproc ><
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2014, 00:40
Ответы с готовыми решениями:

особенности STL, MFC и API
я совсем недолго занимаюсь программированием на Си и когда начала вникать в подробности использования языка совсем запуталась. Объясните...

Win API vs MFC с APP Wizard
Стало вот интересно, какие есть мнения насчет плюсов и минусов одного и другого: использовать простую в использовании оболочку (MFC и APP...

Односвязный список на MFC или API
делаю курсовую, но никак не могу сладить с односвязным списком, видимо где-то ошибка в обращении с памятью.Помогите на писать программу(на...

3
 Аватар для zvoronz
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
06.04.2014, 00:53
Зачем у Вас WndProc если у Вас MFC приложение?
В OnInitDialog инициализируйте экземпляр своего класса, сделайте его глобальной переменной или членом класса.

Потому что вот здесь и в аналогичных местах
C++
1
2
3
4
5
6
void CprogaDlg::OnBnClickedButton1()
{
    // TODO: добавьте свой код обработчика уведомлений
    MultiMatrix m;
    m.DrawNode();
}
Вы создаёте новый экземпляр класса, не инициализированный.
1
 Аватар для Kombova
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 3
07.04.2014, 00:13  [ТС]
Простите, но мне пока что не удавалось работать с классами, поэтому я сложно понимаю что нужно сделать(с инициализацией) и еще у меня проблема в том, что при использовании wndproc я посылал значения переменных, которые эта функция доставала, и как мне получить эти значения сейчас встает большим вопросом. и тут я получается совмещаю api c mfc, т.к. это допустимо и программа в апи работала, поэтому не хочу переводить все в мфс
0
 Аватар для zvoronz
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
07.04.2014, 00:44
У Вас сейчас wndproc не вызывается т. к. не принадлежит ни одному классу окна.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2014, 00:44
Помогаю со студенческими работами здесь

Как программно в Visual C++ (MFC или API) установить связь ODBC драйвера с файлом Access?
Здравствуйте. Подскажите пожалуйста, как программно в Visual C++ (MFC или API) установить связь ODBC драйвера с файлом Access базы данных...

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

Работа с графом
Здравствуйте, у меня такая проблема ,по матрице смежности (7x7) со случайными числами я получил граф в котором присутствуют треугольники,...

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

Работа с неориентированным графом
Есть неориентированный граф 4х4, нужно составить алгоритм, который бы находил пути в которых принимают участие все элементы графа. Граф...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru