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

MDI, многооконное приложение

09.12.2020, 11:21. Показов 2953. Ответов 1

Студворк — интернет-сервис помощи студентам
Реализовать windows-приложение, организующее MDI-интерфейс лю-бым способом:
1. Реализация MDI-интерфейса с использованием MDI-сообщений, MDI-структуры окон windows;
2. Реализация имитации MDI-интерфейса, организовав обработку со-ответствующих сообщений вручную.
В главном окне при использовании MDI-интерфейса реализовать многооконную обработку текстового интерфейса со следующими условиями: создать MDI-окна можно когда угодно и сколько угодно (происходит при нажатии на кнопку); в каждом MDI-окне открывается тот документ, кото-рый открыт во всех предыдущих; реализацию MDI-интерфейса организо-вать только через обработку MDI-сообщений (обновление содержимого окна через обновление через файл, буфер обмена и т.д. недопустимо).
В итоге у не получается считать новый текст с окон (метод (LPWSTR)GetWindowLongPtr(ChildWind, GWLP_USERDATA); почему-то не работает), прошу подсказать как считывать новый введенный текст с окон и выводить его в остальные окна

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
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <atlstr.h>
#include <stdio.h>
#include <string>
#include <synchapi.h>
 
//прототипы функций
 
BOOL ClassReg(HINSTANCE);
LRESULT CALLBACK WndFrameProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndChildProc(HWND, UINT, WPARAM, LPARAM);
 
 
enum
{
    IDM_FILE_NEW,
    IDM_FILE_OPEN
};
 
#define ID_FIRST_CHILD 10000
#define SIZE_BUFFER 1 << 20 //1Mb
 
 
LPWSTR Buffer;
HINSTANCE instance;
 
HWND Temp{};
 
HWND ClientWind{};
HWND ChildWind{};
HWND FrameWind{};
LPWSTR FileTitle = new WCHAR[512]{};
HMENU MenuCreate();
 
int CALLBACK wWinMain(HINSTANCE inst, HINSTANCE, PWSTR CmdLine, int nCmdShow)
{
 
    instance = inst;
 
    if (!ClassReg(inst))
 
        return FALSE;
 
    FrameWind = CreateWindowEx(
        WS_EX_ACCEPTFILES, //dwExStyle
        L"FrameClass", //lpClassName
        L"Лабораторная 3", //lpWindowName
        WS_OVERLAPPEDWINDOW, //dwStyle
        CW_USEDEFAULT, //x
        CW_USEDEFAULT, //y
        CW_USEDEFAULT, //nWidth
        CW_USEDEFAULT, //nHeight
        nullptr, //hWndParent
        MenuCreate(), //hMenu
        inst, //hInstance
        nullptr); //lpParam
 
    if (!FrameWind)
    {
        MessageBox((HWND)inst, L"Ошибка создания окна", L"Ошибка", MB_OK | MB_ICONERROR);
        return FALSE;
    }
 
 
    ShowWindow(FrameWind, nCmdShow);
    UpdateWindow(FrameWind);
 
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateMDISysAccel(ClientWind, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;
 
}
BOOL ClassReg(HINSTANCE inst)
{
 
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.cbClsExtra = 0; //cbClsExtra
    wc.cbWndExtra = 0; //cbWndExtra
    wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1); //hbrBackground
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW); //hCursor
    wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION); //hIcon
    wc.hInstance = inst; //hInstance
    wc.lpfnWndProc = WndFrameProc; //lpfnWndProc
    wc.lpszClassName = L"FrameClass"; //lpszClassName
    wc.lpszMenuName = nullptr; //lpszMenuName
    wc.style = CS_VREDRAW | CS_HREDRAW; //style
 
    if (!RegisterClass(&wc))
        return false;
 
    memset(&wc, 0, sizeof(wc));
    wc.cbClsExtra = 0; //cbClsExtra
    wc.cbWndExtra = DLGWINDOWEXTRA; //cbWndExtra
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //hbrBackground
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW); //hCursor
    wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION); //hIcon
    wc.hInstance = inst; //hInstance
    wc.lpfnWndProc = WndChildProc; //lpfnWndProc
    wc.lpszClassName = L"ChildClass"; //lpszClassName
    wc.lpszMenuName = nullptr; //lpszMenuName
    wc.style = CS_VREDRAW | CS_HREDRAW; //style
 
    if (!RegisterClass(&wc))
        return false;
 
    return true;
}
 
HMENU MenuCreate()
{
    HMENU mainMenu = CreateMenu(),
        fileSubMenu = CreatePopupMenu(),
        editSubMenu = CreatePopupMenu(),
        windowsSubMenu = CreatePopupMenu();
 
    AppendMenu(fileSubMenu, MF_STRING, IDM_FILE_NEW, L"Создать");
    AppendMenu(fileSubMenu, MF_STRING, IDM_FILE_OPEN, L"Открыть");
 
    AppendMenu(mainMenu, MF_POPUP, (UINT_PTR)fileSubMenu, L"Файл");
    return mainMenu;
}
 
LRESULT CALLBACK WndFrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) //Главное окно
{
    CLIENTCREATESTRUCT clcs; // Структура для создания окна Client Window (Родительского для Document WIndow и дочернего для Frame Window)
 
    MDICREATESTRUCT mdics; // Структура для создания дочернего окна Document Window
 
    switch (msg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(EXIT_SUCCESS);
        break;
    }
    case WM_CREATE:
    {
 
        clcs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 2);
        clcs.idFirstChild = ID_FIRST_CHILD;
 
        ClientWind = CreateWindowEx(
            WS_EX_ACCEPTFILES,
            L"MDICLIENT",
            nullptr,
            WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL,
            0,
            0,
            0,
            0,
            hwnd,
            (HMENU)2,
            instance,
            (LPVOID)&clcs);
 
        if (ClientWind == INVALID_HANDLE_VALUE)
            MessageBox(hwnd, L"Ошибка создания Frame окна", L"Ошибка", MB_OK | MB_ICONERROR);
 
        break;
    }
 
 
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
 
        case IDM_FILE_NEW:
        {
            //MessageBox(hwnd, L"Ошибка регистрации класса окна", L"Ошибка", MB_OK | MB_ICONERROR)
            mdics.szClass = L"ChildClass";
            mdics.szTitle = L"Новый файл";
            mdics.hOwner = instance;
            mdics.x = CW_USEDEFAULT;
            mdics.y = CW_USEDEFAULT;
            mdics.cx = CW_USEDEFAULT;
            mdics.cy = CW_USEDEFAULT;
            mdics.style = MDIS_ALLCHILDSTYLES | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
            mdics.lParam = NULL;
            ChildWind = (HWND)SendMessage(ClientWind, WM_MDICREATE, 0, (LPARAM)&mdics);
            SetWindowTextA(GetWindow(ChildWind, GW_CHILD), (LPCSTR)Buffer);
            break;
 
        }
        case EN_CHANGE:
        {
            MessageBox(hwnd, L"Изменение", L"ok", MB_OK | MB_ICONERROR);
            break;
        }
 
 
        }
        break;
    }
    default:
        return DefFrameProc(hwnd, ClientWind, msg, wParam, lParam);
    }
    return 0;
 
}
 
BOOL test = true;
 
LRESULT CALLBACK WndChildProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HWND hChildEdit{};
    switch (msg)
    {
    case WM_DESTROY:
    {
 
        break;
    }
    case WM_CREATE:
    {
 
        RECT rect;
        GetClientRect(hwnd, &rect);
        hChildEdit = CreateWindow(
            L"EDIT",
            NULL,
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,
            0,
            0,
            rect.right,
            rect.bottom,
            hwnd,
            NULL,
            instance,
            NULL);
 
        if (hChildEdit == INVALID_HANDLE_VALUE)
            MessageBox(hwnd, L"Ошибка создания дочернего окна", L"Ошибка", MB_OK | MB_ICONERROR);
        break;
    }
    case WM_SETFOCUS:
    {
        ChildWind = hwnd;
        break;
    }
 
    case WM_COMMAND:
    {
    case EN_CHANGE:
    {
 
 
        Buffer = (LPWSTR)GetWindowLongPtr(ChildWind, GWLP_WNDPROC);
 
        //SetWindowLongPtr(ChildWind, GWLP_WNDPROC, (LONG_PTR)Buffer);
 
        //SetWindowText(GetWindow(ChildWind, GW_CHILD), (LPCWSTR)Buffer);
 
        /*for (;;)
        {
            // Получаем идентификатор дочернего окна
            // для окна Client Window
            Temp = GetWindow(ClientWind, GW_CHILD);
            // Если дочерних окон больше нет, выходим из цикла
            if (!Temp)
                break;
 
            // Пропускаем окна-заголовки
            while (Temp && GetWindow(Temp, GW_OWNER))
                Temp = GetWindow(Temp, GW_HWNDNEXT);
 
            // Удаляем дочернее окно Document Window
            if (Temp)
                SetWindowTextA(GetWindow(ChildWind, GW_CHILD), (LPCSTR)Buffer);
            else
                break;
        }*/
 
 
        /*MessageBox(hwnd, L"Ошибка регистрации класса окна", L"Ошибка", MB_OK | MB_ICONERROR);
        int Size= GetWindowTextW(ChildWind, Buffer, 100);
 
 
        Buffer=(LPWSTR)GetWindowLongPtr(GetWindow(ChildWind, GW_CHILD), GWLP_USERDATA);
 
        MessageBox(hwnd, (LPCWSTR)Size, L"Ошибка", MB_OK | MB_ICONERROR);
        LPSTR TextWindow{};
        LPSTR Buffer = TextWindow; //заполнение буфера содержимым
        if (Buffer != nullptr) //Если буфер не пустой
        {
            //MessageBox(hwnd, L"Ошибка регистрации класса окна", L"Ошибка", MB_OK | MB_ICONERROR);
            //mdics.szTitle = FileTitle; //задаём заголовок
            //ChildWind = (HWND)SendMessage(ClientWind, WM_MDICREATE, 0, (LPARAM)&mdics);
            SetWindowTextA(GetWindow(ChildWind, GW_CHILD), (LPCSTR)Buffer);
            delete Buffer;
 
        }*/
 
        break;
    }
    break;
    }
 
    case WM_SIZE: //изменение размеров рабочей области дочернего окна
    {
        hChildEdit = GetWindow(hwnd, GW_CHILD);
        if (!SetWindowPos(hChildEdit, nullptr, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER)) //если не получилось изменить размер окна
            MessageBox(hwnd, L"Ошибка изменения размера окна окна", L"Ошибка", MB_OK | MB_ICONERROR);
        break;
    }
    default:
        break;
 
    }
    return DefMDIChildProc(hwnd, msg, wParam, lParam);
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2020, 11:21
Ответы с готовыми решениями:

Многооконное приложение win32
Поделитесь пожалуйста исходником на многооконное приложение win32, (например программа-тест на знания)

Многопоточное MDI приложение
Необходимо создать многопоточный текстовый редактор, чтобы каждое окно выполнялось в своем потоке. У меня есть пример обычного...

Сделать многооконное приложение MDI
Сделать многооконное приложение MDI с помощью контейнера vector создать динамический массив из элементов {float z, char c}. Определить...

1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.12.2020, 12:07
Цитата Сообщение от _SS_ Посмотреть сообщение
В итоге у не получается считать новый текст с окон (метод (LPWSTR)GetWindowLongPtr(ChildWind, GWLP_USERDATA); почему-то не работает), прошу подсказать как считывать новый введенный текст с окон и выводить его в остальные окна
В обработчиках WM_CREATE сделай
C++
1
2
wchar_t  *buf = new wchar_t[1024];
::SetWindowLongPtr(hWnd, GWLP_USERDATA, buf);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2020, 12:07
Помогаю со студенческими работами здесь

Многооконное приложение
вопрос возможно простой, но много оконные приложения, где у каждого окна свой cpp, это автоматически много поточные приложения, и их cpp...

Многооконное приложение
Привет всем, в общем интересует один вопрос, а точнее несколько:D Есть многооконная программа, и несколько мониторов, возможно ли сделать...

Многооконное приложение
Доброго времени суток всем. Прошу дать несколько советов. У меня есть опыт написания таких вещей на дотнете на шарпе. В программе будет...

Многооконное приложение
Помогите сделать проверку на открытую вторую форму. Примерно так : if(Form2-&gt;Visible ==true) N21-&gt;Checked=false; else ...

многооконное приложение
Разботать многооконное приложение в ОС Windows, реализующее “попиксельное ” изображение цветного графического объекта по точкам координат,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru