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

Вывод переменных из Диалогового Окна в главное окно

31.03.2018, 23:23. Показов 2250. Ответов 4

Студворк — интернет-сервис помощи студентам
В общем задача такая, нужно создавать главное вин окно, по нажатию на пункт меню вызывать Диалоговое окно. В нем мы вводим значения переменных, нажимаем на кнопку и в главном окне должно рисоваться.

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

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
#include <Windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <cmath>
#include <tchar.h>
#include <math.h>
#include "resource.h"
 
#define BALKA 300
 
HINSTANCE hInst;
HDC hdc;
HWND hwnd;
 
HWND hProlet, hSila, hPolozenie, hMoment, hModul, hwnd_d;
CHAR L[] = { 0 }, P[] = { 0 }, x[] = { 0 }, I[] = { 0 }, E[] = { 0 };
int pr_epura = 0;
 
 
LPCTSTR 
pc_WindowClassName = _T("WindowClassName"),
pc_wndTitle = _T("Created by Kovalev");
 
//Прототипы функций для Главного окна
BOOL RegisterWndClasses(void);
void UnregisterWndClasses(void);
BOOL CreateWindows(void);
LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);
BOOL MainOnCreate(HWND, LPCREATESTRUCT);
BOOL MainOnCommand(HWND, int, HWND, UINT);
BOOL MainOnPaint(HWND);
BOOL MainOnDestroy(HWND);
BOOL InitializeApp(void);
void UninitializeApp(void);
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
//Прототипы функций для Модального диалогового окна
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
 
BOOL RegisterWndClasses()
{
    WNDCLASSEX wce_main;
    memset(&wce_main, 0, sizeof(WNDCLASSEX));
    wce_main.cbSize = sizeof(WNDCLASSEX);
    wce_main.hInstance = hInst;
    wce_main.style = CS_VREDRAW | CS_HREDRAW;
    wce_main.lpfnWndProc = (WNDPROC)MainWindowProc;
    wce_main.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
    wce_main.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    wce_main.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wce_main.lpszClassName = pc_WindowClassName;
    return RegisterClassEx(&wce_main);
}
 
void UnregisterWndClasses()
{
    UnregisterClass(pc_WindowClassName, hInst);
}
 
BOOL CreateWindows()
{
    int scrw2 = GetSystemMetrics(SM_CXSCREEN) / 2,
        scrh2 = GetSystemMetrics(SM_CYSCREEN) / 2;
 
    hwnd = CreateWindow(pc_WindowClassName, pc_wndTitle, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CLIPCHILDREN,
        scrw2 - 400, scrh2 - 300, 800, 600, NULL, NULL, hInst, 0);
    if (!hwnd)
        return FALSE;
    return TRUE;
}
 
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg) 
    {
            case WM_CREATE:
                return MainOnCreate(hwnd, (LPCREATESTRUCT)lParam);
 
                break;
 
            case WM_COMMAND:
                return MainOnCommand(hwnd, LOWORD(wParam), HWND(lParam), HIWORD(wParam));
                break;
 
            case WM_PAINT:
            return MainOnPaint(hwnd);
                break;
 
            case WM_DESTROY:
                return MainOnDestroy(hwnd);
 
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0L;
}
 
BOOL MainOnCreate(HWND hwnd, LPCREATESTRUCT p_cs)
{
    hInst = GetModuleHandle(NULL);
    return TRUE;
}
 
BOOL MainOnCommand(HWND hwnd, int cmdId, HWND hwndCtrlItem, UINT ntfCode)
{
 
    HMENU  hm;
    hm = GetMenu(hwnd);
 
    switch (cmdId)
    {
        case ID_DIALOG:
        {
 
            DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG), hwnd, DlgProc, 0);
        }
        break;
    }
 
    return FALSE;
}
 
BOOL MainOnPaint(HWND hwnd)
{
    
    PAINTSTRUCT ps;
    hdc = BeginPaint(hwnd, &ps);
    double x = 100, y = 100;
    HPEN hpen_black, hpen_blue;
    hpen_black = CreatePen(PS_SOLID | PS_GEOMETRIC, 3, RGB(0, 0, 0));
    hpen_blue = CreatePen(PS_SOLID | PS_GEOMETRIC, 3, RGB(0, 102, 255));
    SelectObject(hdc, hpen_black);
 
 
    EndPaint(hwnd, &ps);
    
    return TRUE;
}
 
 
BOOL MainOnDestroy(HWND hwnd)
{
    PostQuitMessage(0);
    return TRUE;
}
 
BOOL CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_INITDIALOG:
        {
            HICON hIcon1 = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
            SendMessage(hwnd, WM_SETICON, 1, (LPARAM)hIcon1);
 
            hProlet = GetDlgItem(hwnd, IDC_EDIT1);
            hSila = GetDlgItem(hwnd, IDC_EDIT2);
            hPolozenie = GetDlgItem(hwnd, IDC_EDIT3);
            hMoment = GetDlgItem(hwnd, IDC_EDIT4);
            hModul = GetDlgItem(hwnd, IDC_EDIT5);
 
        }
        break;
        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                    case IDC_EPURAM:
                    {
                        
                        SendMessage(hProlet, WM_GETTEXT, (WPARAM)5, (LPARAM)L);
                        SendMessage(hSila, WM_GETTEXT, (WPARAM)5, (LPARAM)P);
                        SendMessage(hPolozenie, WM_GETTEXT, (WPARAM)5, (LPARAM)x);
                        SendMessage(hMoment, WM_GETTEXT, (WPARAM)5, (LPARAM)I);
                        SendMessage(hModul, WM_GETTEXT, (WPARAM)5, (LPARAM)E);
                        
                    }
                    MessageBox(NULL, L, NULL, MB_OK);
                    break;
                    case IDC_EPURAV:
                    {
                        
                        SendMessage(hProlet, WM_GETTEXT, (WPARAM)5, (LPARAM)L);
                        SendMessage(hSila, WM_GETTEXT, (WPARAM)5, (LPARAM)P);
                        SendMessage(hPolozenie, WM_GETTEXT, (WPARAM)5, (LPARAM)x);
                        SendMessage(hMoment, WM_GETTEXT, (WPARAM)5, (LPARAM)I);
                        SendMessage(hModul, WM_GETTEXT, (WPARAM)5, (LPARAM)E);
                        
                    }
                    break;
                    case IDC_EXIT:
                    
                        EndDialog(hwnd, 0);
                        return TRUE;
            }
            return InvalidateRect(hwnd, NULL, TRUE);
        }
        break;
        case WM_CLOSE:
            EndDialog(hwnd, 0);
            return TRUE;
    }
    return FALSE;
}
 
BOOL InitializeApp()
{
 
    if (!RegisterWndClasses()) {
        MessageBox(NULL, "Ошибка регистрации классов окон.", pc_wndTitle, MB_OK);
        return FALSE;
    }
    CreateWindows();
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
    return TRUE;
}
 
void UninitializeApp()
{
    UnregisterWndClasses();
}
 
int APIENTRY WinMain(HINSTANCE hi_crr, HINSTANCE hi_prv, LPSTR pc_cmdLine, int cmdShow)
{
    MSG msg;
    hInst = hi_crr;
    InitializeApp();
    while (GetMessage(&msg, NULL, 0, 0))
        DispatchMessage(&msg);
    UninitializeApp();
    return msg.wParam;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2018, 23:23
Ответы с готовыми решениями:

Передать сигнал из диалогового окна с номером N в главное окно
Если описать полную конструкцию то получится. При старте попадаем в главное окно ---&gt; диалоговое окно 1 ---&gt; диалоговое окно 2...

Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое
Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое)) ) и как можно...

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

4
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
01.04.2018, 11:48
Эта строчка при компиляции создаёт массивы, с одним символов в каждом. Такие массивы не пригодны для хранения строк.
C++
1
CHAR L[] = { 0 }, P[] = { 0 }, x[] = { 0 }, I[] = { 0 }, E[] = { 0 };
Сделайте хотя бы по 16 символов на переменную.
C++
1
CHAR L[16] = { 0 }, P[16] = { 0 }, x[16] = { 0 }, I[16] = { 0 }, E[16] = { 0 };
Если требуется при запуске диалога показать предыдущие значения полей ввода, то это делается в обработчике сообщения WM_INITDIALOG. При закрытии диалога по кнопке ОК нужно забрать значения из полей ввода обратно в переменные.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_INITDIALOG:
            SetDlgItemText(hwnd, IDC_EDIT1, L);
            SetDlgItemText(hwnd, IDC_EDIT2, P);
            SetDlgItemText(hwnd, IDC_EDIT3, x);
            SetDlgItemText(hwnd, IDC_EDIT4, I);
            SetDlgItemText(hwnd, IDC_EDIT5, E);
            return TRUE;
        case WM_CLOSE:// это не обработчик ОК, код просто для примера
            GetDlgItemText(hwnd, IDC_EDIT1, L, 16);
            GetDlgItemText(hwnd, IDC_EDIT2, P, 16);
            GetDlgItemText(hwnd, IDC_EDIT3, x, 16);
            GetDlgItemText(hwnd, IDC_EDIT4, I, 16);
            GetDlgItemText(hwnd, IDC_EDIT5, E, 16);
            EndDialog(hwnd, IDOK);
            return TRUE;
1
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 6
01.04.2018, 12:47  [ТС]
Понял,спасибо!

Добавлено через 10 минут
И еще такой вопрос, как потом после забора новых переменных нарисовать допустим линию в главном окне?
Смысл в том, что в диалоговом вводим значение переменной, а потом идем в рисование.
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
01.04.2018, 13:38
Лучший ответ Сообщение было отмечено makccom как решение

Решение

После завершения диалога можно вызвать InvalidateRect, это приведёт к последующей генерации сообщения WM_PAINT.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOL MainOnCommand(HWND hwnd, int cmdId, HWND hwndCtrlItem, UINT ntfCode)
{
 
    HMENU  hm;
    hm = GetMenu(hwnd);
 
    switch (cmdId)
    {
        case ID_DIALOG:
        {
            DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG), hwnd, DlgProc, 0);
            //+++
            InvalidateRect(hwnd, 0, TRUE);
            //+++
        }
        break;
    }
 
    return FALSE;
}
В обработчике WM_PAINT добавить отрисовку основанную на значениях переменных из диалога.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
BOOL MainOnPaint(HWND hwnd)
{
    
    PAINTSTRUCT ps;
    hdc = BeginPaint(hwnd, &ps);
    double x = 100, y = 100;
    HPEN hpen_black, hpen_blue;
    hpen_black = CreatePen(PS_SOLID | PS_GEOMETRIC, 3, RGB(0, 0, 0));
    hpen_blue = CreatePen(PS_SOLID | PS_GEOMETRIC, 3, RGB(0, 102, 255));
    SelectObject(hdc, hpen_black);
 
    //+++
    int l = atoi(L);
    int p = atoi(P);
    MoveToEx(hdc, 100, 100, 0);
    LineTo(hdc, l, p);
    //+++
 
    EndPaint(hwnd, &ps);
    
    return TRUE;
}
1
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 6
01.04.2018, 14:35  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2018, 14:35
Помогаю со студенческими работами здесь

Qt. Не могу перейти с окна с StackedWidjets на главное окно
В общем проблема состоит в том что я не могу перейти с окна task_for_11class на hellowindow. пишет вот что: 1)In function...

Передача данных из второго окна в главное окно
Добрый день! Передаю данные из главного окна во второе окно: myform = new Dialog(); connect(ui-&gt;pushButton_2,...

Как присвоить переменную одного диалогового окна к переменной другого диалогового окна? (ООП)
Вот у меня есть результат вычисления и я его присваиваю переменной в первом диалоговом окне, но я хочу выдать результат во второе...

Можно ли вызвать диалоговое окно из диалогового окна?
Можно ли, используя AWT, вызвать диалоговое окно из диалогового окна? В ответ на некое действие в программе выскакивает диалоговое окно, а...

При закрытии дочернего окна закрывается еще и главное окно
#include &lt;Windows.h&gt;//подключение winAPI #include &lt;tchar.h&gt; HWND hChildWnd1; HWND hButton1; HWND edit; TCHAR WinName =...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru