Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

Диалоговые панели

05.01.2023, 22:56. Показов 8068. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не знаю, как решить следующую задачу.
Создать модальную диалоговую панель для ввода размерности и элементов
m*n-матрицы(m, n <= 10). После нажатия кнопки ОК построчно отобразить элементы введённой матрицы.
Не знаю, как создать на одной панели и объекты для ввода размерности и тут же объекты для ввода значений матрицы. Пока я сделал следующее:
Кликните здесь для просмотра всего текста
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
#include<windows.h>
#include<tchar.h>
//#include "CreateDlg.h"
 
#define ID_STATIC_SIZEN  2000
#define ID_STATIC_VALUE  2001
#define ID_EDIT_ROWS     2002
#define ID_EDIT_COLS     2003
#define ID_EDIT_VALUES   2004
#define ID_BUTTON_OK     2005
#define CM_ARRAY_CREATE  2006
#define CM_ARRAY_EXIT    2007
 
BOOL       RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
 
int CreateDlg(HWND);
LPWORD lpwAlign(LPWORD lpIn)
{
    ULONG ui = (ULONG)lpIn;
    ui += 3;
    ui >>= 2;
    ui <<= 2;
    return (LPWORD)ui;
}
 
int nCopyAnsiToWideChar(LPWORD lpWCStr, LPSTR lpAnsi)
{
    int cch = strlen(lpAnsi);
    return MultiByteToWideChar(GetACP(), MB_PRECOMPOSED,
        lpAnsi, cch, (LPWSTR)lpWCStr, cch)
        + 1;
}
 
 
HINSTANCE hInstance = NULL;
 
TCHAR szMainClass[] = TEXT("WindowAppClass");
 
int Rows, Cols;
 
int* aInts = NULL;
 
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG msg = { 0 };
    HWND hwnd = NULL;
    hInstance = hInst;
 
    if (!RegClass(WndProc, szMainClass, COLOR_DESKTOP))
        return FALSE;
 
    int wScreen = GetSystemMetrics(SM_CXSCREEN);
    int hScreen = GetSystemMetrics(SM_CYSCREEN);
 
    hwnd = CreateWindow(szMainClass, TEXT("Create a dialog box"),
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        0, 0, wScreen, hScreen, 0, 0, hInstance, NULL);
    if (!hwnd)
        return FALSE;
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
BOOL RegClass(WNDPROC proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc = { 0 };
    wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = proc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(brBackground + 1);
    wc.lpszMenuName = (LPCTSTR)NULL;
    wc.lpszClassName = szName;
    return (RegisterClass(&wc) != 0);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HMENU hMainMenu, hArrayMenu;
    static MENUITEMINFO mii;
    switch (msg)
    {
    case WM_CREATE:
    {
        mii.cbSize = sizeof(mii);
 
        hMainMenu = CreateMenu();
        SetMenu(hwnd, hMainMenu);
        mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_SUBMENU;
 
        hArrayMenu = CreatePopupMenu();
        mii.fType = MFT_STRING;
        mii.fState = MFS_ENABLED;
        mii.wID = CM_ARRAY_CREATE;
        mii.dwTypeData = (LPTSTR)TEXT("СОЗДАТЬ МАССИВ");
        mii.cch = lstrlen(TEXT("СОЗДАТЬ МАССИВ"));
        mii.hSubMenu = 0;
        if (!InsertMenuItem(hArrayMenu, CM_ARRAY_CREATE, FALSE, &mii))
        {
            DWORD er = GetLastError();
        }
 
        mii.fMask = MIIM_TYPE | MIIM_STATE;
        mii.fType = MFT_SEPARATOR;
        mii.fState = MFS_ENABLED;
        mii.wID = 0;
        mii.dwTypeData = NULL;
        mii.cch = 0;
        InsertMenuItem(hArrayMenu, 0, FALSE, &mii);
 
        mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_SUBMENU;
        mii.fType = MFT_STRING;
        mii.fState = MFS_ENABLED;
        mii.wID = CM_ARRAY_EXIT;
        mii.dwTypeData = (LPTSTR)TEXT("Выход");
        mii.cch = lstrlen(TEXT("Выход"));
        mii.hSubMenu = 0;
        InsertMenuItem(hArrayMenu, CM_ARRAY_EXIT, FALSE, &mii);
        mii.hSubMenu = hArrayMenu;
        mii.dwTypeData = (LPTSTR)TEXT("Действия с диалогом");
        mii.cch = lstrlen(TEXT("Действия с диалогом"));
        InsertMenuItem(hMainMenu, 0, TRUE, &mii);
        DrawMenuBar(hwnd);
 
        return 0;
    }
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case CM_ARRAY_CREATE:
        {
            CreateDlg(hwnd);
            break;
        }
        case CM_ARRAY_EXIT:
        {
            DestroyWindow(hwnd);
            break;
        }
        }
        return 0;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
int CreateDlg(HWND hwnd)
{
    char const caption[] = "Заполнить массив целых числел.";
    TCHAR TextStatic1[] = TEXT("Введите кличество строк и столбцов массива");
 
 
    TEXTMETRIC tm;
    int cxChar, cyChar;
    {
        HDC hdc = GetDC(hwnd);
        GetTextMetrics(hdc, &tm);
        ReleaseDC(hwnd, hdc);
        cxChar = tm.tmAveCharWidth;
        cyChar = tm.tmHeight + tm.tmExternalLeading;
    }
 
    DWORD dlgUnit = GetDialogBaseUnits();
    int cxDlg = LOWORD(dlgUnit);
    int cyDlg = HIWORD(dlgUnit);
 
    cxChar = cxChar * 4 / cxDlg;
    cyChar = cyChar * 8 / cyDlg;
 
    WORD* p, * pdlgTemp;
    pdlgTemp = p = (PWORD)LocalAlloc(LPTR, 2000);
    if (!p || !pdlgTemp)
        return FALSE;
 
    //DLGTEMPLATE dlgTmp;
    DWORD lStyle = DS_CENTER | DS_MODALFRAME | WS_POPUPWINDOW |
        WS_CAPTION;
 
    int wDlg, hDlg, wItem, hItem, left, top;
    wItem = 8 * cxChar;
    hItem = cyChar + 2;
    left = top = 0;
 
    wDlg = wItem * 10;
    hDlg = hItem * 10;
    *p++ = LOWORD(lStyle);
    *p++ = HIWORD(lStyle);
    *p++ = 0;
    *p++ = 0;
    *p++ = 3;
    *p++ = left;
    *p++ = top;
    *p++ = wDlg;
    *p++ = hDlg;
    *p++ = 0;
    *p++ = 0;
    //int nChar = lstrlen(caption);
    int nChar = nCopyAnsiToWideChar(p, (LPSTR)caption);
    p += nChar;
    p = lpwAlign((LPWORD)p);
 
    //---------------------------
    lStyle = WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_AUTOHSCROLL |
        WS_BORDER | WS_TABSTOP;
    left = wDlg / 2 - (wItem + wItem / 2);
    top = 5;
    *p++ = LOWORD(lStyle);
    *p++ = HIWORD(lStyle);
    *p++ = 0;
    *p++ = 0;
    *p++ = left;
    *p++ = top;
    *p++ = wItem;
    *p++ = hItem;
    *p++ = ID_EDIT_ROWS;
    //nChar = lstrlen(TEXT("edit"));
    nChar = nCopyAnsiToWideChar(p, (LPSTR)"edit");
    p += nChar;
    //nChar = lstrlen(TEXT("Rows"));
    nChar = nCopyAnsiToWideChar(p, (LPSTR)"Rows");
    p += nChar;
    *p++ = 0;
    p = lpwAlign((LPWORD)p);
 
    //-------------------------------------
 
    lStyle = WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_AUTOHSCROLL |
             WS_BORDER | WS_TABSTOP;
    left = wDlg / 2 + (wItem / 2);
    //top += hItem;
    *p++ = LOWORD(lStyle);
    *p++ = HIWORD(lStyle);
    *p++ = 0;
    *p++ = 0;
    *p++ = left;
    *p++ = top;
    *p++ = wItem;
    *p++ = hItem;
    *p++ = ID_EDIT_COLS;
    //nChar = lstrlen(TEXT("edit"));
    nChar = nCopyAnsiToWideChar(p, (LPSTR)"edit");
    p += nChar;
    //nChar = lstrlen(TEXT("cols"));
    nChar = nCopyAnsiToWideChar(p, (LPSTR)"Cols");
    p += nChar;
    *p++ = 0;
    p = lpwAlign((LPWORD)p);
 
    //----------------------------------------
    lStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER;
 
    int wButton = 6 * cxChar;
    int hButton = 3 * cyChar / 2;
 
    left = wDlg / 2 - (wButton / 2);
    top = hDlg - hButton - 5;
    *p++ = LOWORD(lStyle);
    *p++ = HIWORD(lStyle);
    *p++ = 0;
    *p++ = 0;
    *p++ = left;
    *p++ = top;
    *p++ = wButton;
    *p++ = hButton;
    *p++ = ID_BUTTON_OK;
    //nChar = lstrlen(TEXT("button"));
    nChar = nCopyAnsiToWideChar(p, (LPSTR)"button");
    p += nChar;
    //nChar = lstrlen(TEXT("OK"));
    nChar = nCopyAnsiToWideChar(p, (LPSTR)"OK");
    p += nChar;
    *p++ = 0;
    p = lpwAlign((LPWORD)p);
 
    int Ret = DialogBoxIndirect(hInstance, (LPCDLGTEMPLATE)pdlgTemp,
        hwnd, (DLGPROC)DlgProc);
 
    //--------------------------
 
    LocalFree(LocalHandle(pdlgTemp));
 
    return Ret;
}
 
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
            TCHAR buf1[16], buf2[16];
 
        case ID_EDIT_ROWS:
        {
            if (HIWORD(wParam) == EN_SETFOCUS)
                SetWindowText(GetDlgItem(hDlg, ID_EDIT_ROWS), TEXT(""));
 
            return TRUE;
        }
        case ID_EDIT_COLS:
        {
            if (HIWORD(wParam) == EN_SETFOCUS)
                SetWindowText(GetDlgItem(hDlg, ID_EDIT_COLS), TEXT(""));
            return TRUE;
        }
        
        case ID_BUTTON_OK:
        {
            Rows = SendMessage(GetDlgItem(hDlg, ID_EDIT_ROWS),
                EM_GETLINE, 0, (LPARAM)buf1);
            Cols = SendMessage(GetDlgItem(hDlg, ID_EDIT_COLS),
                EM_GETLINE, 0, (LPARAM)buf2);
            if (Rows)
            {
                buf1[Rows] = '\0';
                Rows = _tcstol(buf1, NULL, 10);
            }
            if (Cols)
            {
                buf2[Cols] = '\0';
                Cols = _tcstol(buf2, NULL, 10);
            }
            EndDialog(hDlg, TRUE);
            return TRUE;
        }
        }
        return FALSE;
    }
    }
    return FALSE;
}


Может быть сразу же в функции CreateDlg создать 10x10 объектов "edit" и сделать их не отображаемыми, но это, на мой взгляд, как-то убого. Есть ещё вариант, не знаю возможно ли и допустимо ли такое, но после того как отработает функция DialogBoxIndirect() в CreateDlg(), создать нужное количество объектов "edit" ведь тогда я уже знаю сколько нужно строк и столбцов данных. Хотя в этом случае тоже есть сложности и к тому же не уверен, что такое вообще допустимо. В общем не знаю, как решить эту задачу ещё и с диалоговыми панелями мне не совсем всё очевидно. Есть мысли...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2023, 22:56
Ответы с готовыми решениями:

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

Диалоговые окна
Создать диалоговое окно, отображающее график функции. Функцию считывать из файла имя которого выбирается пользователем с помощью объекта...

Диалоговые окна
Здравствуйте. Подскажите, пожалуйста: 1). можно ли немодальное диалоговое окно отобразить на поверхности основного окна как, например,...

63
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
22.01.2023, 21:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
Да, мне нравится, интересное предложение, учту.
Структура — это не массив.
Это в массиве у вас все элементы фиксированного размера:
Code
1
2
3
4
5
╔═════════════════════════╗
║┌──┬──┬──┬──┬──┬──┬──┬──┐║
║│00│01│02│03│04│05│06│07│║
║└──┴──┴──┴──┴──┴──┴──┴──┘║
╚═════════════════════════╝
И когда вы делаете p+=1 или p++, это значит, что указатель сдвигается на фиксированное значение.

А в структуре так:
Code
1
2
3
4
5
╔══════════════════════╗
║┌────┬──┬────┬────┬──┐║
║│0000│01│0002│0003│04│║
║└────┴──┴────┴────┴──┘║
╚══════════════════════╝
Когда вы будете делать p+=1 или p++ здесь, как мы будете сдвигать указатель на плавающее значение? У вас же p после первого ++ будет указывать не на начало поля, а на середину.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
22.01.2023, 22:42  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
А в структуре так:
Разве не так, если мы выделяем блок памяти размером, скажем, WORD* p = (LPWORD)(4 * WORD);то ++p; не приведёт к смещению указателя на одно слово?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Когда вы будете делать p+=1 или p++ здесь, как мы будете сдвигать указатель на плавающее значение?
Что значит плавающее значение? Разные типы данных...
Миниатюры
Диалоговые панели  
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
22.01.2023, 23:15
Цитата Сообщение от Liss29 Посмотреть сообщение
не приведёт к смещению указателя на одно слово?
Приведёт к смещению на WORD.
А если вам нужно сместиться не на WORD, а на половину или на два WORD? Или на три четверти WORD? Откуда вы взяли, что у вас все поля в структуре будут WORD?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
23.01.2023, 04:33  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
А если вам нужно сместиться не на WORD, а на половину
LPBYTE bP = (LPBYTE)p;
++bP;

Цитата Сообщение от Замабувараев Посмотреть сообщение
или на два WORD?
LPDWORD dP = (LPDWORD)p;
++dP;

Цитата Сообщение от Замабувараев Посмотреть сообщение
Или на три четверти WORD?
А это зачем нужно?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Откуда вы взяли, что у вас все поля в структуре будут WORD?
Ни от куда, есть данные структуры они стандартные они известны.

Добавлено через 3 часа 56 минут
C++
1
2
3
4
5
6
7
8
9
10
11
lpw = lpwAlign (lpw); // выравниваем DLGITEMTEMPLATE
                          // по границе DWORD
    lpdit = (LPDLGITEMTEMPLATE) lpw;
    lpdit->x  = 10; lpdit->y  = 70;
    lpdit->cx = 80; lpdit->cy = 20;
    lpdit->id = IDOK;  // идентификатор кнопки OK
    lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
 
    lpw = (LPWORD) (lpdit + 1);
    *lpw++ = 0xFFFF;
    *lpw++ = 0x0080;    // класс кнопки
В данном случае lpdit = (LPDLGITEMTEMPLATE) lpw; значение указателя lpdit равен dword или unsigned int так? Но что значит (lpdti + 1) т.е. lpw - смещается на значение следующее за lpdit->style, но как так?!
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
23.01.2023, 08:07
Цитата Сообщение от Liss29 Посмотреть сообщение
Но что значит (lpdti + 1) т.е. lpw - смещается на значение следующее за lpdit->style, но как так?!
Просто повезло:
PowerShell
1
cat ./name.cpp; ./name ;$LastExitCode
C++
1
2
3
4
5
6
7
8
#include <windows.h>
#include <type_traits>
 
int
main()
{
        return std::alignment_of<DLGITEMTEMPLATE>();
}
2

А чтобы везло чаще, кто-то зачем-то вставил где-то в <winuser.h>
C
1
2
3
4
5
6
/*                                                                                                                                             
* WARNING:                                                                                                                                    
* The following structures must NOT be DWORD padded because they are                                                                          
* followed by strings, etc that do not have to be DWORD aligned.                                                                              
*/                                                                                                                                           
#include <pshpack2.h>
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
23.01.2023, 13:44  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Просто повезло:
Я так и подумал. Давай, удиви меня ещё каким-нибудь суперкодом.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
24.01.2023, 15:33
Цитата Сообщение от Liss29 Посмотреть сообщение
Как по мне для того что бы проработать тему, в данном случае диалоговые окна.
Модальное диалоговое окно создаётся Вашей функцией CreateDlg().
Почему бы не вызвать эту функцию прямо из wWinMain() или main() ?

Не вижу в процитированном Вами тексте задачи указаний регистрировать класс главного окна, создавать его и явно кодировать цикл обработки сообщений.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
24.01.2023, 23:16  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Не вижу в процитированном Вами тексте задачи указаний регистрировать класс главного окна, создавать его и явно кодировать цикл обработки сообщений.
В тексте задачи так же не говорится об обратном чтобы не не регистрировать класс окна, не создавать его и явно не кодировать цикл обработки сообщений.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
26.01.2023, 14:03
Цитата Сообщение от Liss29 Посмотреть сообщение
Создание шаблона в памяти в процессе работы приложения.

Приложение в зависимости от содержания требуемых и предоставляемых данных и способа обмена изменяет вид панели. Функция окна диалоговой панели при этом содержит обработку необходимого и достаточного набора сообщений. Команды, которые не задействованы в текущей конфигурации панели, обычно блокируют. С ростом потребности оперативного обмена данными с различными источниками информации этот способ находит всё более широкое применение.
Ср.
Цитата Сообщение от Майкрософт
Applications sometimes adapt or modify the content of dialog boxes depending on the current state of the data being processed. In such cases, it is not practical to provide all possible dialog box templates as resources in the application's executable file. But creating templates in memory gives the application more flexibility to adapt to any circumstances.
https://learn.microsoft.com/en... -in-memory
Цитата Сообщение от Майкрософт в переводе ишкушштвенного интеллекта с Алиэксресс
Приложения иногда адаптируют или изменяют содержимое диалоговых окон в зависимости от текущего состояния обрабатываемых данных. В таких случаях нецелесообразно предоставлять все возможные шаблоны диалоговых окон как ресурсы в исполняемом файле приложения. Но создание шаблонов в памяти дает приложению большую гибкость в адаптации к любым обстоятельствам.
https://learn.microsoft.com/ru... -in-memory

Цитата Сообщение от Liss29 Посмотреть сообщение
Я правильно понимаю эту цитату, если мне нужно, то во время работы приложения я могу добавить какие-то объекты в панель или наоборот удалить их с панели? И, если это так, то каким образом это делается?
До создания диалогового окна можете поменять или подменить шаблон.
После создания диалогового окна Вы можете добавлять на него дочерние окна с помощью вероятно известных Вам функций CreateWindowExW() https://learn.microsoft.com/ru... ewindowexw и CreateDialogIndirectParamW()
https://learn.microsoft.com/ru... rectparamw
https://learn.microsoft.com/en... dialog-box

и удалять ненужные окна с помощью DestroyWindow()
https://learn.microsoft.com/en... troywindow
https://learn.microsoft.com/ru... g-a-window
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
27.01.2023, 04:48  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
До создания диалогового окна можете поменять или подменить шаблон.
Чисто теоретически я это понимаю, но на практике ничего путного не получается.

Цитата Сообщение от politoto Посмотреть сообщение
После создания диалогового окна Вы можете добавлять на него дочерние окна с помощью вероятно известных Вам функций
Зачем, если речь идёт о стандартных элементах управления, то зачем CreateWindowEx, если и так всё добавляется в шаблоне. Если бы что-то нестандартное можно было прикрутить, то это совсем другое дело.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
27.01.2023, 07:00
Если при создании шаблона диалога ещё не известно, какие стандартные элементы нужно добавить или куда.
Например, если это выясняется в ходе диалога с пользователем.
Дочернее диалоговое окно в шаблон можно добавить, но как задать для самого дочернего диалога шаблон?
А после создания диалогового окна уже известны размеры и расположение других дочерних окон.

Добавлено через 12 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
если речь идёт о стандартных элементах управления, то зачем CreateWindowEx, если и так всё добавляется в шаблоне.
Ресурсы диалогов позволяют добавлять дочерние окна любых загрегистрированных классов, а не только стандартные элементы управления.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
28.01.2023, 05:02  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Ресурсы диалогов позволяют добавлять дочерние окна любых загрегистрированных классов, а не только стандартные элементы управления.
Ну, я пробую добавить окно созданное с помощью функции CreateWindow(), но пока что успеха это не принесло.

Цитата Сообщение от politoto Посмотреть сообщение
Дочернее диалоговое окно в шаблон можно добавить, но как задать для самого дочернего диалога шаблон?
Это вы у меня спросили?)
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
28.01.2023, 12:22
Цитата Сообщение от Liss29 Посмотреть сообщение
я пробую добавить окно
Почуднокодим?
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
#include <windows.h>
#include <stdio.h>
 
int
test(){
    //static const WCHAR className[] = L"Red75";
    struct NoName{
        DLGTEMPLATE header;
        // https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-dlgtemplate#remarks
        WORD noMenu, defaultClass;
        WCHAR title[6];
        WORD align; DLGITEMTEMPLATE redItem;
        //WORD wcEdit[2];
        WCHAR redClass[6], redText[4];
        WORD nodata;
    }template = {
        { 
            DS_CENTER | WS_VISIBLE, 0,
            1, //0, //1, // controls
            0, 0, 'x', 'y',
 
        }, 0, 0,
        L"Reddy", 0,
        { WS_CHILD | WS_VISIBLE, 0,
            0, 0, 'X', 'Y',  'R' // id
        },
        // { ~0, 129,}, // WC_EDIT
        L"RED75",        L"Red",
        0
    };
 
    WNDCLASSEXW wc = { sizeof wc };
    wc.hbrBackground = CreateSolidBrush(RGB(0300,10,10));
//    wc.lpszClassName = className;
    wc.lpszClassName = template.redClass;
    wc.lpfnWndProc = DefWindowProcW;
 
    {
        printf ("Registering...");
 
        ATOM redClass  = RegisterClassExW(&wc); //or ..A()
        if (0 == redClass)
            //return GetLastError();
            return printf  ( "%x :(\n", 
                GetLastError()
            );
        
        printf ("Creating window...  %x" "\n",  (int)redClass );
        CreateWindowExW( 0,
            (LPCWSTR)redClass, 
            L"Красное окошко",
            WS_VISIBLE | WS_SIZEBOX,
            'x', 'y', 2*'X', 2*'Y',
            0, 0, 0, 0
        );
    }
 
    printf ("Creating... (%zd)\n",
        offsetof(struct NoName, redItem));
 
    INT_PTR result =  DialogBoxIndirectParamW( 0,
        &template.header,
        0,  // hWndParent
        0,  // lpDialogFunc
        0   // dwInitParam
    );
 
    if ( result <= 0 )
    {
        DWORD error = GetLastError();
        return printf  ( "%x %d:[\n", 
            error, (int)result
        );
    }
 
    return result;
 
}
 
 
int
main()
{
    return test();
}
 
#pragma comment(lib, "user32")
#pragma comment(lib, "gdi32")
Миниатюры
Диалоговые панели  
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
28.01.2023, 22:42  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Почуднокодим?
Да, то что надо, интересный вариант. Только зачем всё в кучу и объявление и инициализация структур, мне итак сложно разбираться с диалогами, а тут ещё нагорожено...


Не по теме:

Почему у тебя функция main() приложения же Window?

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
28.01.2023, 22:54  [ТС]
Окно в диалог я встроил, получилось! Не знаю, правильно ли я всё делал или нет, но, вот результат.
Название: Window1.png
Просмотров: 86

Размер: 1.4 Кб

Теперь нужно понять всё ли я дела правильно или что-то нужно подкорректировать. Вот код, то что на данный момент есть.
Ex6_3.rar
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.01.2023, 07:44
Цитата Сообщение от Liss29 Посмотреть сообщение
зачем всё в кучу и объявление и инициализация структур, мне итак сложно разбираться с диалогами
Я думал, что Вы уже наизусть знаете расположение членов в структурах Win32.

Не по теме:

Вы Си предпочитаете или c++ ?


Цитата Сообщение от Liss29 Посмотреть сообщение
Почему у тебя функция main() приложения же Window?
Потому что хотелось сделать консольное приложение win32 с stdout и stderr.
Потому что это Си.
Потому что так можно писать короче.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
29.01.2023, 21:39  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Я думал, что Вы уже наизусть знаете расположение членов в структурах Win32.
Это смотря в каких, если речь идёт о DLGTEMPLATE..., ТО ДА, а так в win32 структур много, как я могу их все знать, да ещё и наизусть.)

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Вы Си предпочитаете или c++ ?
Без разницы, могу и так и так, но сильно сложные конструкции из С++ вроде мудрёных шаблонов всё же плохо понимаю.



Цитата Сообщение от politoto Посмотреть сообщение
Потому что это Си.
и что в С++ тоже самое, но есть определённые стандарты для windows-приложений и для консольных, я про это.

P.S.
А по сути вопроса опять ничего.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
30.01.2023, 13:06
Цитата Сообщение от Liss29 Посмотреть сообщение
по сути вопроса опять ничего.
А в чём суть вопроса?
Цитата Сообщение от Liss29 Посмотреть сообщение
Вот код, то что на данный момент
Вы бы вставили в сообщение фрагменты кода, функции или небольшие программки целиком, которые вызывают сомнение.
Незарегистрированные пользователи, даже если захотят найти unrar, не смогут скачать Ваш .RAR

В целом - многовато-с строчек в Ваших примерах.

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
#include <windows.h>
 
int
main()
{
    HMENU hmenu = 0; 
    HWND hwnd = CreateWindowExW( WS_EX_TOPMOST,
        L"EDIT", 
        L"Noname",
        WS_VISIBLE | WS_SIZEBOX | WS_SYSMENU //| WS_MAXIMIZE
        | ES_MULTILINE,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        0, 
        hmenu = LoadMenuIndirectW( L"\0\0" // C99 allows us to concatenate wide and narrow literals
            "\20"   "File"          "\0"
                "\0"    "O" "&Open" "\0"
                "\0"    "S" "&Save" "\0"
                " "     "?" "&About""\0"
                L"\200" "x" "E&xit" "\0"
            L"\200" "H" "&Help"
        ),
        0, 0 
    );
 
    HMENU popup = GetSubMenu(hmenu, 2);
    SetWindowTextW ( hwnd, L"Press Esc to Exit" "\r\n"
    "or edit this text and then close the window with Alt-F4"
    );
 
    MessageBoxW(0, L"Переключитесь в окно Noname, не закрывая MessageBox", 0, 0);
 
}
#pragma comment(lib, "user32")
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    printf ( "%p %p" "\n", popup, hwnd );
 
    __try {
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
    }
 
    printf ( "%x" "\n", GetLastError() );
 
/*
    return TrackPopupMenu( 
        hmenu, 
        //popup,
        TPM_NONOTIFY | TPM_RETURNCMD,
        100, 100,
        0,
        hwnd, // HWMND
        0
    );
*/


Добавлено через 3 часа 4 минуты

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
в С++ тоже самое, но есть определённые стандарты для windows-приложений и для консольных
Что покажет MessageBox?
C++
1
2
3
4
5
6
7
8
#include <windows.h>
void show ( const char * m){MessageBoxA(0, m, 0, 0 );}
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, char*, int ){
    show (__FUNCTION__);
}
 
int main(){ show (__FUNCTION__); }

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
30.01.2023, 21:34  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
А в чём суть вопроса?
Где нужно регистрировать класс окна и создавать окно, это я про окно, которое встраиваю в диалоговое окно? Возможно, лучше создавать встраиваемое окно непосредственно в функции того диалогового окна, в которое оно встраивается, в сообщении WM_DIALOGINIT:... А регистрировать класс окна, видимо, всё же нужно в главной функции?

Цитата Сообщение от politoto Посмотреть сообщение
В целом - многовато-с строчек в Ваших примерах.
В целом да, много кода, я именно поэтому его в архив запихал.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.01.2023, 13:32
Можно регистрировать классы окон непосредственно перед их первым использованием.

https://github.com/microsoftar... s.cpp#L149

Зарегистрировать впрок при инициализации приложаения все классы, даже если они не понадобятся, конечно, проще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2023, 13:32

Диалоговые окна
Здравствуйте. У меня возник такой вопрос, как генерировать строку в Edit Control в завесимости от выбора Check Box. Допустим если я выбрал...

Диалоговые окна
Я новичок в Win32 API, как впрочем и в С++. У меня уже который час не получается создать простейшее окно с кнопкой, которая на щелчок будет...

Не создаются диалоговые окна
Опять я со своей змейкой :) Хочу добавить диалоговые окна в программу. Вроде бы все делаю правильно: создал окно в ресурсах, написал...

Диалоговые окна на WinAPI
Не могу создать диалоговое окно. Пример из книги ганеева не компилируется. Если несложно скиньте примерчик.

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru