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

Функция диалогового окна

16.02.2023, 13:15. Показов 5214. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! В книге и не только написано, что функция окна диалоговой панели НЕ ОБРАБАТЫВАЕТ СООБЩЕНИЯ WM_PAINT, WM_CREATE и WM_DESTROY, а так же не вызывается функция DefWindowProc(), если сообщение не обрабатывается, но почему так, я для себя ответа не нашёл, собственно вопрос, почему?

И как обновлять окно диалога InvalidateRect(), UpdateWindow(), но WM_PAINT НЕ ОБРАБАТЫВАЕТСЯ, как быть?! Если я рисую геометрическую фигуру и она меняет свои размеры увеличивается/уменьшается. Если я вызываю InvalidateRect(), то ничего не происходит или просто фигура исчезает, если после InvalidateRect() вызвать UpdateWindow(), то работает, но возникает вопрос, а как правильно обновлять рабочую область окна диалога. Да и вообще, как выполнять отрисовку графики в диалоговых окнах?
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2023, 13:15
Ответы с готовыми решениями:

Создание окна из диалогового окна
Есть необходимость создавать новое окно прямо из диалогового по происхождению некоторого события, например нажатия кнопки, вопрос: как...

Создание диалогового окна
В ресурсах у меня есть диалог(IDD_DIALOG1) и я хочу его вывести на экран, но выскакивает ошибка: 'WinMain' : function cannot be...

Закрытие диалогового окна
https://cloud.mail.ru/public/ecb33703bd5b%2Ftestv2.zip вот его процедура LRESULT CALLBACK OptionsProc (HWND hwnd, UINT message,...

32
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
18.02.2023, 10:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
После создания модального диалогового окна, и запуска цикла обработки сообщений для него окно получает сообщения, а те, которые не обрабатывает, они куда отправляются, назад в ОС, в очередь основного окна(родителя)...
Цикл обработки сообщений работает не для окна, а для всех окон созданных в рамках одного потока. Очередь сообщений одна на поток, у окон нет каких-то своих персональных очередей. Сообщения достаются из очереди (GetMessage) и перенаправляются в функцию окна, которому они были предназначены (DispatchMessage). Все окна заблокированные модальным запуском диалога продолжают получать и обрабатывать сообщения, но они не могут быть активированы и получить фокус ввода.

Создание нового цикла обработки сообщений нужно для того, что бы обеспечить блокировку процедуры выполнившей модальный запуск. Код процедуры продолжит выполняться с места остановки как только модальное окно закроется.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
18.02.2023, 10:33
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
#include <windows.h>
#include <stdio.h>
 
HMENU menu = 0;
 
INT_PTR
DlgProc( HWND wnd, UINT msg, WPARAM w, LPARAM l )
{
    switch (msg)
    {
        case WM_INITDIALOG:
            return SetMenu( wnd, menu ), 0;
        
        case WM_COMMAND:
        switch ( LOWORD(w))
        {   
            case IDOK: case IDCANCEL: case 'X':
                return EndDialog( wnd, LOWORD(w)), 1;
 
            case 'M': case 'O':
            {
                HWND h = 'M' == LOWORD(w) ?  0 : wnd;
                const char* hwnd = 0 == h ?  "0" : "wnd";
                printf("Messagebox(%s,0,0,0) >> %p\n", hwnd, &msg);
                MessageBox(h,0,0,0);
                printf("Messagebox(%s,0,0,0) << %p\n", hwnd, &msg);
                return 1;
            }
        }
    }
    return 0;
}
 
int
main()
{
    menu = LoadMenuIndirectW(   L"\0\0"
    "\0M"   "&MessgaBox(0,0,0,0)" "\0"
    "\0O"   "MessgaB&ox(wnd,0,0,0)" "\0"
    L"\200X"   "Exit" "\0"
    );
    DialogBoxIndirectW( 0,  L"\1\xffff" "\0\0\0\0" 
        "\0\f" 
        "\0" 
        "XYwh"
        "\0\0"
        "Empty",
        0,
        DlgProc
    );
}
#pragma comment ( lib, "user32")
Кликните здесь для просмотра всего текста
Code
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
Messagebox(0,0,0,0) >> 0000001B62EFF388
Messagebox(0,0,0,0) >> 0000001B62EFE998
Messagebox(0,0,0,0) >> 0000001B62EFDFA8
Messagebox(0,0,0,0) >> 0000001B62EFD5B8
Messagebox(0,0,0,0) >> 0000001B62EFCBC8
Messagebox(0,0,0,0) >> 0000001B62EFC1D8
Messagebox(0,0,0,0) >> 0000001B62EFB7E8
Messagebox(wnd,0,0,0) >> 0000001B62EFADF8
Messagebox(wnd,0,0,0) << 0000001B62EFADF8
Messagebox(0,0,0,0) << 0000001B62EFB7E8
Messagebox(0,0,0,0) << 0000001B62EFC1D8
Messagebox(0,0,0,0) << 0000001B62EFCBC8
Messagebox(0,0,0,0) << 0000001B62EFD5B8
Messagebox(0,0,0,0) << 0000001B62EFDFA8
Messagebox(0,0,0,0) << 0000001B62EFE998
Messagebox(0,0,0,0) << 0000001B62EFF388
Messagebox(0,0,0,0) >> 0000001B62EFF388
Messagebox(0,0,0,0) >> 0000001B62EFE998
Messagebox(0,0,0,0) >> 0000001B62EFDFA8
Messagebox(0,0,0,0) >> 0000001B62EFD5B8
Messagebox(0,0,0,0) >> 0000001B62EFCBC8
Messagebox(0,0,0,0) >> 0000001B62EFC1D8
Messagebox(0,0,0,0) >> 0000001B62EFB7E8
Messagebox(0,0,0,0) >> 0000001B62EFADF8
Messagebox(0,0,0,0) << 0000001B62EFADF8
Messagebox(0,0,0,0) << 0000001B62EFB7E8
Messagebox(0,0,0,0) << 0000001B62EFC1D8
Messagebox(0,0,0,0) << 0000001B62EFCBC8
Messagebox(0,0,0,0) << 0000001B62EFD5B8
Messagebox(0,0,0,0) << 0000001B62EFDFA8
Messagebox(0,0,0,0) << 0000001B62EFE998
Messagebox(0,0,0,0) << 0000001B62EFF388


Добавлено через 6 минут
Кликните здесь для просмотра всего текста
Code
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
ID поток Адрес             В                 Из                Размер            Группа            Комментарий                                                                                                                    
25376                                                                                              
         000000CC585E8F88  00007FFD573D28B0  00007FF73FA56FB4  E0                Системa           mb.DlgProc+124
         000000CC585E9068  00007FFD573D2052  00007FFD573D28B0  C0                Системa           user32.UserCallDlgProcCheckWow+144
         000000CC585E9128  00007FFD573D1F66  00007FFD573D2052  40                Системa           user32.DefDlgProcWorker+D2
         000000CC585E9168  00007FFD573CE7E8  00007FFD573D1F66  190               Системa           user32.DefDlgProcW+36
         000000CC585E92F8  00007FFD573CE229  00007FFD573CE7E8  80                Системa           user32.UserCallWinProcCheckWow+2F8
         000000CC585E9378  00007FFD573ED931  00007FFD573CE229  A0                Системa           user32.DispatchMessageWorker+249
         000000CC585E9418  00007FFD573ED5A1  00007FFD573ED931  60                Системa           user32.DialogBox2+361
         000000CC585E9478  00007FFD5743D22B  00007FFD573ED5A1  150               Системa           user32.InternalDialogBox+12D
         000000CC585E95C8  00007FFD5743BB45  00007FFD5743D22B  1B0               Системa           user32.SoftModalMessageBox+85B
         000000CC585E9778  00007FFD5743C937  00007FFD5743BB45  100               Системa           user32.int __cdecl MessageBoxWorker(struct _MSGBOXDATA *)+341
         000000CC585E9878  00007FFD5743C728  00007FFD5743C937  60                Системa           user32.MessageBoxTimeoutW+1A7
         000000CC585E98D8  00007FFD5743C33E  00007FFD5743C728  40                Системa           user32.MessageBoxTimeoutA+108
         000000CC585E9918  00007FF73FA56FC7  00007FFD5743C33E  60                Пользователь      user32.MessageBoxA+4E
         000000CC585E9978  00007FFD573D28B0  00007FF73FA56FC7  E0                Системa           mb.DlgProc+137
         000000CC585E9A58  00007FFD573D2052  00007FFD573D28B0  C0                Системa           user32.UserCallDlgProcCheckWow+144
         000000CC585E9B18  00007FFD573D1F66  00007FFD573D2052  40                Системa           user32.DefDlgProcWorker+D2
         000000CC585E9B58  00007FFD573CE7E8  00007FFD573D1F66  190               Системa           user32.DefDlgProcW+36
         000000CC585E9CE8  00007FFD573CE229  00007FFD573CE7E8  80                Системa           user32.UserCallWinProcCheckWow+2F8
         000000CC585E9D68  00007FFD573ED931  00007FFD573CE229  A0                Системa           user32.DispatchMessageWorker+249
         000000CC585E9E08  00007FFD573ED5A1  00007FFD573ED931  60                Системa           user32.DialogBox2+361
         000000CC585E9E68  00007FFD5743D22B  00007FFD573ED5A1  150               Системa           user32.InternalDialogBox+12D
         000000CC585E9FB8  00007FFD5743BB45  00007FFD5743D22B  1B0               Системa           user32.SoftModalMessageBox+85B
         000000CC585EA168  00007FFD5743C937  00007FFD5743BB45  100               Системa           user32.int __cdecl MessageBoxWorker(struct _MSGBOXDATA *)+341
         000000CC585EA268  00007FFD5743C728  00007FFD5743C937  60                Системa           user32.MessageBoxTimeoutW+1A7
         000000CC585EA2C8  00007FFD5743C33E  00007FFD5743C728  40                Системa           user32.MessageBoxTimeoutA+108
         000000CC585EA308  00007FF73FA56FC7  00007FFD5743C33E  60                Пользователь      user32.MessageBoxA+4E
         000000CC585EA368  00007FFD573D28B0  00007FF73FA56FC7  E0                Системa           mb.DlgProc+137
         000000CC585EA448  00007FFD573D2052  00007FFD573D28B0  C0                Системa           user32.UserCallDlgProcCheckWow+144
         000000CC585EA508  00007FFD573D1F66  00007FFD573D2052  40                Системa           user32.DefDlgProcWorker+D2
         000000CC585EA548  00007FFD573CE7E8  00007FFD573D1F66  190               Системa           user32.DefDlgProcW+36
         000000CC585EA6D8  00007FFD573CE229  00007FFD573CE7E8  80                Системa           user32.UserCallWinProcCheckWow+2F8
         000000CC585EA758  00007FFD573ED931  00007FFD573CE229  A0                Системa           user32.DispatchMessageWorker+249
         000000CC585EA7F8  00007FFD573ED5A1  00007FFD573ED931  60                Системa           user32.DialogBox2+361
         000000CC585EA858  00007FFD5743D22B  00007FFD573ED5A1  150               Системa           user32.InternalDialogBox+12D
         000000CC585EA9A8  00007FFD5743BB45  00007FFD5743D22B  1B0               Системa           user32.SoftModalMessageBox+85B
         000000CC585EAB58  00007FFD5743C937  00007FFD5743BB45  100               Системa           user32.int __cdecl MessageBoxWorker(struct _MSGBOXDATA *)+341
         000000CC585EAC58  00007FFD5743C728  00007FFD5743C937  60                Системa           user32.MessageBoxTimeoutW+1A7
         000000CC585EACB8  00007FFD5743C33E  00007FFD5743C728  40                Системa           user32.MessageBoxTimeoutA+108
         000000CC585EACF8  00007FF73FA56FC7  00007FFD5743C33E  60                Пользователь      user32.MessageBoxA+4E
         000000CC585EAD58  00007FFD573D28B0  00007FF73FA56FC7  E0                Системa           mb.DlgProc+137
         000000CC585EAE38  00007FFD573D2052  00007FFD573D28B0  C0                Системa           user32.UserCallDlgProcCheckWow+144
         000000CC585EAEF8  00007FFD573D1F66  00007FFD573D2052  40                Системa           user32.DefDlgProcWorker+D2
         000000CC585EAF38  00007FFD573CE7E8  00007FFD573D1F66  190               Системa           user32.DefDlgProcW+36
         000000CC585EB0C8  00007FFD573CE229  00007FFD573CE7E8  80                Системa           user32.UserCallWinProcCheckWow+2F8
         000000CC585EB148  00007FFD573ED931  00007FFD573CE229  A0                Системa           user32.DispatchMessageWorker+249
         000000CC585EB1E8  00007FFD573ED5A1  00007FFD573ED931  60                Системa           user32.DialogBox2+361
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
18.02.2023, 15:35  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Создание нового цикла обработки сообщений нужно для того, что бы обеспечить блокировку процедуры выполнившей модальный запуск.
Если есть цикл обработки сообщений, который задаётся явно при регистрации и создании окна в процедуре WinMain(), то, получается, что цикл сообщений для диалога задаётся не явно, его сама система создаёт что ли?

Цитата Сообщение от Ygg Посмотреть сообщение
Все окна заблокированные модальным запуском диалога продолжают получать и обрабатывать сообщения, но они не могут быть активированы и получить фокус ввода.
Что-то не понятно, если они заблокированы, то как они получают сообщения или имеются ввиду сообщения от системы?

Цитата Сообщение от politoto Посмотреть сообщение
000000CC585E9978 00007FFD573D28B0 00007FF73FA56FC7 E0 Системa mb.DlgProc+137
Это что значит, что ты запустил процедуру n-е количество раз или это та самая рекурсия. Но про
то диалогова процедура может выполняться рекурсивно:
мне всё равно не понятно.

Добавлено через 6 минут
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
case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
        //InvalidateRect(hDlg, NULL, TRUE);
        if(lpdis->CtlType == ODT_STATIC)
        {
            switch(lpdis->CtlID)
            {
                case ID_STATIC_DRAW:
                {
                    HDC hdc = ((LPDRAWITEMSTRUCT)lParam)->hDC;
                    RECT StaticBorder = ((LPDRAWITEMSTRUCT)lParam)->rcItem;
            //DrawCylinderParam(hDlg, hdc, szToks, NumberOfTokens);
                    /*HBRUSH hBrush = CreateSolidBrush(RGB(15+rand() % 255, 
                                                        rand() % 255,
                                                        rand() % 255));*/
                    HBRUSH hBrush = CreateSolidBrush(RGB(255, 255, 255));
 
                    HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
                    FillRect(hdc, &StaticBorder, hBrush);
                    SelectObject(hdc, hOldBrush);
                    DeleteObject(hBrush);
                    break;
                }
                default:
                    return FALSE;
            }
        }
        return TRUE;
    }
Я правильно делаю или нет? Отсюда нужно запускать процедуру рисования графика или всё же из сообщения обрабатывающего нажатия кнопки, нажатие на которую должно привести к прорисовке графика? Всё получается криво, неказисто как-то.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
18.02.2023, 23:04
Цитата Сообщение от Liss29 Посмотреть сообщение
Если есть цикл обработки сообщений, который задаётся явно при регистрации и создании окна в процедуре WinMain(), то, получается, что цикл сообщений для диалога задаётся не явно, его сама система создаёт что ли?
Да. Если диалог запускается модально, то к самому созданию диалога неявно добавляется цикл обработки сообщений. Этот цикл автоматически завершается при закрытии модального диалога.

Что-то не понятно, если они заблокированы, то как они получают сообщения или имеются ввиду сообщения от системы?
К примеру, сообщения таймера часто используются для отрисовки анимации. Если модально запустить диалог поверх окна с такой анимацией, то анимация будет всё так же продолжать работать в заблокированном окне. Сообщения таймера всё так же генерируются и обрабатываются. И это относится не только к таймеру, но и к другим сообщениям.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
19.02.2023, 08:46
Цитата Сообщение от Liss29 Посмотреть сообщение
значит, что ты запустил процедуру n-е количество раз или это та самая рекурсия.
Это последовательность вложенных вызовов процедур. Самая верхняя - самая внутренняя, та, что завершится первой и вернет в то место, откуда она была вызвана, в ту процедуру, которая в списке строчкой ниже.

Кликните здесь для просмотра всего текста
Code
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
         000000772B2FF198  00007FFD573CE229  00007FFD573CE4F0  80                Системa  возврат к user32.DispatchMessageWorker+249 из user32.__int64 __cdecl UserCallWinProcCheckWow(struct _ACTIVATION_CONTEXT *, __int64 (__cdecl *)(struct tagWND *, unsigned int, unsigned __int64, __int64), struct HWND__*, enum _WM_VALUE, unsigned __int64, __int64, void *, int)
         000000772B2FF218  00007FFD573ED931  00007FFD573CDFE0  40                Системa  возврат к user32.DialogBox2+361 из user32.DispatchMessageWorker
         000000772B2FF258  00007FFD5743B7B7  00007FFD573F7493  60                Системa  возврат к user32.unsigned char * __cdecl MB_UpdateDlgItem(struct DLGITEMTEMPLATE *, struct _MSGBOXDATA *, int, long, long, int, int, int, int, unsigned short *, unsigned int, int)+127 из user32.memcpy
         000000772B2FF2B8  00007FFD573ED5A1  00007FFD573ED5D0  60                Системa  возврат к user32.InternalDialogBox+12D из user32.__int64 __cdecl DialogBox2(struct HWND__*, struct HWND__*, int, int)
         000000772B2FF318  00007FFD5743D22B  00007FFD573ED474  150               Системa  возврат к user32.SoftModalMessageBox+85B из user32.__int64 __cdecl InternalDialogBox(void *, struct DLGTEMPLATE *, struct HWND__*, __int64 (__cdecl *)(struct HWND__*, unsigned int, unsigned __int64, __int64), __int64, unsigned int)
         000000772B2FF468  00007FFD5743BB45  00007FFD5743C9D0  50                Системa  возврат к user32.int __cdecl MessageBoxWorker(struct _MSGBOXDATA *)+341 из user32.SoftModalMessageBox
         000000772B2FF4B8  00007FFD573CC94B  00007FFD573F3780  10                Системa  возврат к user32.RealDefWindowProcWorker+BB из user32.__security_check_cookie
         000000772B2FF4C8  00007FFD573CC94B  00007FFD573F3780  30                Системa  возврат к user32.RealDefWindowProcWorker+BB из user32.__security_check_cookie
         000000772B2FF4F8  00007FFD573CF875  00007FFD573CF900  40                Системa  возврат к user32.GetWindowLongPtrW+B5 из user32.unsigned __int64 __cdecl _GetWindowLongPtr(struct tagWND *, int, int)
         000000772B2FF538  00007FFD53700B29                    80                Системa  возврат к uxtheme._ThemeDefWindowProc+849 из ???
         000000772B2FF5B8  00007FFD573E34ED  00007FFD573CEDD0  10                Системa  возврат к user32.IsWindowInDestroy+3D из user32.HMValidateHandle
         000000772B2FF5C8  00007FFD573CC23F  00007FFD573CC890  10                Системa  возврат к user32.RealDefWindowProcW+4F из user32.__int64 __cdecl RealDefWindowProcWorker(struct tagWND *, unsigned int, unsigned __int64, __int64, unsigned long)
         000000772B2FF5D8  00007FFD536FE63B                    10                Системa  возврат к uxtheme.CThemeWnd::ForwardMouseEvent+23 из ???
         000000772B2FF5E8  00007FFD536FE63B                    30                Системa  возврат к uxtheme.CThemeWnd::ForwardMouseEvent+23 из ???
         000000772B2FF618  00007FFD5743C937  00007FFD5743B804  100               Системa  возврат к user32.MessageBoxTimeoutW+1A7 из user32.int __cdecl MessageBoxWorker(struct _MSGBOXDATA *)
         000000772B2FF718  00007FFD5743C728  00007FFD5743C790  20                Системa  возврат к user32.MessageBoxTimeoutA+108 из user32.MessageBoxTimeoutW
         000000772B2FF738  00007FF6E39970FE  00007FF6E3992932  40                Пользова возврат к mb._vfprintf_l+3E из mb.00007FF6E3992932
         000000772B2FF778  00007FFD5743C33E  00007FFD5743C620  40                Системa  возврат к user32.MessageBoxA+4E из user32.MessageBoxTimeoutA
         000000772B2FF7B8  00007FF6E3996FC7                    60                Пользова возврат к mb.DlgProc+137 из ???
         000000772B2FF818  00007FFD573D28B0                    40                Системa  возврат к user32.UserCallDlgProcCheckWow+144 из ???
         000000772B2FF858  00007FFD537002D1  00007FFD537002E0  70                Системa  возврат к uxtheme.ThemeDefWindowProcW+11 из uxtheme.__int64 __cdecl _ThemeDefWindowProc(struct HWND__*, unsigned int, unsigned __int64, __int64, int)
         000000772B2FF8C8  00007FFD573D2822                    30                Системa  возврат к user32.UserCallDlgProcCheckWow+B6 из ???
         000000772B2FF8F8  00007FFD573D2052  00007FFD573D276C  C0                Системa  возврат к user32.DefDlgProcWorker+D2 из user32.int __cdecl UserCallDlgProcCheckWow(struct _ACTIVATION_CONTEXT *, __int64 (__cdecl *)(struct HWND__*, unsigned int, unsigned __int64, __int64), struct HWND__*, enum _WM_VALUE, unsigned __int64, __int64, void *, __int64 *)
         000000772B2FF9B8  00007FFD573D1F66  00007FFD573D1F80  40                Системa  возврат к user32.DefDlgProcW+36 из user32.DefDlgProcWorker
         000000772B2FF9F8  00007FFD573CE7E8                    90                Системa  возврат к user32.UserCallWinProcCheckWow+2F8 из ???
         000000772B2FFA88  00007FFD573CE693                    8                 Системa  возврат к user32.UserCallWinProcCheckWow+1A3 из ???
         000000772B2FFA90  00007FFD573CEB26                    48                Системa  возврат к user32.UserCallWinProcCheckWow+636 из ???
         000000772B2FFAD8  00007FFD573CE36C  00007FFD573CE4F0  60                Системa  возврат к user32.DispatchClientMessage+9C из user32.__int64 __cdecl UserCallWinProcCheckWow(struct _ACTIVATION_CONTEXT *, __int64 (__cdecl *)(struct tagWND *, unsigned int, unsigned __int64, __int64), struct HWND__*, enum _WM_VALUE, unsigned __int64, __int64, void *, int)
         000000772B2FFB38  00007FFD573CE693                    50                Системa  возврат к user32.UserCallWinProcCheckWow+1A3 из ???
         000000772B2FFB88  00007FFD573CE229  00007FFD573CE4F0  80                Системa  возврат к user32.DispatchMessageWorker+249 из user32.__int64 __cdecl UserCallWinProcCheckWow(struct _ACTIVATION_CONTEXT *, __int64 (__cdecl *)(struct tagWND *, unsigned int, unsigned __int64, __int64), struct HWND__*, enum _WM_VALUE, unsigned __int64, __int64, void *, int)
         000000772B2FFC08  00007FFD573CBFE0  00007FFD573CDFE0  20                Системa  возврат к user32.IsDialogMessageW+280 из user32.DispatchMessageWorker
         000000772B2FFC28  00007FFD573CA553                    70                Системa  возврат к user32._PeekMessage+43 из ???
         000000772B2FFC98  00007FFD573ED8F6  00007FFD573CBD60  A0                Системa  возврат к user32.DialogBox2+326 из user32.IsDialogMessageW
         000000772B2FFD38  00007FFD573ED5A1  00007FFD573ED5D0  60                Системa  возврат к user32.InternalDialogBox+12D из user32.__int64 __cdecl DialogBox2(struct HWND__*, struct HWND__*, int, int)
         000000772B2FFD98  00007FFD573ED452  00007FFD573ED474  40                Системa  возврат к user32.DialogBoxIndirectParamAorW+52 из user32.__int64 __cdecl InternalDialogBox(void *, struct DLGTEMPLATE *, struct HWND__*, __int64 (__cdecl *)(struct HWND__*, unsigned int, unsigned __int64, __int64), __int64, unsigned int)
         000000772B2FFDD8  00007FFD573ED3E8  00007FFD573ED400  40                Системa  возврат к user32.DialogBoxIndirectParamW+18 из user32.DialogBoxIndirectParamAorW
         000000772B2FFE18  00007FF6E399703A                    10                Пользова возврат к mb.main+3A из ???
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.02.2023, 09:47
Цитата Сообщение от Liss29 Посмотреть сообщение
получается, что цикл сообщений для диалога задаётся не явно, его сама система создаёт что ли?
Да.
Допустим, у вас есть диалоговая функция DlgProc().
Менеджер диалогов внутри одной из функций DialogBoxXXX делает что‐то подобное:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
DialogBoxXXX()
{
    WNDCLASSEX wcEx;
    wcEx.WndProc = WndProcМенеджераДиалога
    
    RegisterClassEx(wcEx)
    
    GetMessage(...)
    {
        TranslateMessage(...)
        DispatchMessage(...)
    }
}
Оконная функция диалогового окна:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
WndProcМенеджераДиалога(...)
{
    выбрать msg:
        WM_PAINT:
            рисуем окно
            
        WM_CREATE:
            Парсим шаблон диалога
            Цикл
                CreateWindowEx для каждого окна указанного в шаблоне диалога
            result = DlgProc(WM_INITDIALOG, ...) // вызываем диалоговую функцию
            если result = false
                вызываем DefWindowProc(...)
            
        WM_DESTROY:
            очистка
            
        WM_Что-тодругое
            result = DlgProc(WM_Что-тодругое, ...) // отправляем что‐то другое в диалоговую функцию
            если result = false
                вызываем DefWindowProc(...)
}
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
19.02.2023, 17:00  [ТС]
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
case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
        //InvalidateRect(hDlg, NULL, TRUE);
        if(lpdis->CtlType == ODT_STATIC)
        {
            switch(lpdis->CtlID)
            {
                case ID_STATIC_DRAW:
                {
                    HDC hdc = ((LPDRAWITEMSTRUCT)lParam)->hDC;
                    RECT StaticBorder = ((LPDRAWITEMSTRUCT)lParam)->rcItem;
                    HBRUSH hBrush = CreateSolidBrush(RGB(255, 255, 255));
 
                    HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
                    FillRect(hdc, &StaticBorder, hBrush);
 
                    DrawDiagramParam(hDlg, hdc, szToks, NumberOfTokens);
 
                    SelectObject(hdc, hOldBrush);
                    DeleteObject(hBrush);
                    break;
                }
                default:
                    return FALSE;
            }
        }
        return TRUE;
    }
Почему, если я вызываю функцию
Code
1
DrawDiagramParam(hDlg, hdc, szToks, NumberOfTokens);
из WM_DEAWITEM, то массив указателей szToks становится недействителен, хотя по клику на кнопку, в данном случае Draw Diagram, он заполняется данными, массив объявлен как статический, почему именно он портится, хотя остальные данные, те что объявлены, как static, сохраняют свои значения?
0
19.02.2023, 18:33

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
он заполняется данными, массив объявлен как статический, почему именно он портится
Может быть, он заполняется указателями на нестатические данные?

0
19.02.2023, 21:17  [ТС]

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Может быть, он заполняется указателями на нестатические данные?
Ничего не понимаю, пока функция
Code
1
DrawDiagramParam(hDlg, hdc, szToks, NumberOfTokens);
находилась в блоке сообщения, которое обрабатывает нажатие кнопки всё было в порядке, данные были те же, заполнялся массив так же и такими же данными, и ничего не портилось.

Заполняется так, ничего необычного:
Кликните здесь для просмотра всего текста
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
case ID_BUTTON_DRAW:
        {
            int sel = SendMessage(hList, LB_GETCURSEL, 0, 0L);
            if (sel == LB_ERR)
            {
                MessageBox(NULL, TEXT("Not selected data."),
                    TEXT("Error"), MB_OK);
                return FALSE;
            }
            TCHAR buf[64];
            int len = SendMessage(hList, LB_GETTEXT, sel, (LPARAM)buf);
            if (!len || len == LB_ERR)
            {
                MessageBox(NULL, TEXT("Row not received or invalid index specified"),
                    TEXT("Error"), MB_OK);
                return FALSE;
            }
            buf[len] = '\0';
            TCHAR* szToks[MAXTOKENS];
            TCHAR* context = NULL;
            TCHAR* tok = _tcstok_s(buf, TEXT(" \t\n"), &context);
            for(NumberOfTokens = 0; NumberOfTokens < MAXTOKENS && tok; 
                ++NumberOfTokens)
            {
                szToks[NumberOfTokens] = tok;
                tok = _tcstok_s(NULL, TEXT(" "), &context);
            }
            
            HDC hdc = GetDC(hDlg);
    
            InvalidateRect(hDlg, NULL, TRUE);
            UpdateWindow(hDlg);
            
            //DrawDiagramParam(hDlg, hdc, szToks, 2);
            
            ReleaseDC(hDlg, hdc);
            return TRUE;
        }

0
20.02.2023, 06:14

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
C
10
TCHAR buf[64];
Временный объект внутри блока обработки команды ID_BUTTON_DRAW

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
20.02.2023, 15:30  [ТС]

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Временный объект внутри блока обработки команды ID_BUTTON_DRAW
Нет, я уже пробовал делать этот массив статическим и глобально его объявлял, но результат тот же.



Добавлено через 12 минут

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Временный объект внутри блока обработки команды ID_BUTTON_DRAW
Но всё же ты смотрел в правильном направлении, переопределение массива TCHAR* szToks[MAXTOKENS]; в обработчике сообщения ID_BUTTON_DRAW портило всё дело.



Добавлено через 2 часа 10 минут
Цитата Сообщение от politoto Посмотреть сообщение
Если же и этого недостаточно, можно использовать свой класс диалогового окна вместо стандартного и обрабатывать любые сообщения до, вместо или после DefDlgProc()
Получается, что нужно использовать этот диалог вместо оcновного окна или, всё же, это диалоговое окно со своей процедурой, которая имеет расширенные возможности, но всё же является частью приложения в котором есть главное окно, созданное стандартно в главной функции WinMain? Я не могу врубиться в суть сего действа и самое главное, зачем этот финт ушами нужен?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
21.02.2023, 14:27
Цитата Сообщение от Liss29 Посмотреть сообщение
является частью приложения в котором есть главное окно, созданное стандартно в главной функции WinMain?
Приходилось пользоваться утилитами errlook ("Поиск ошибки") и guidgen из Visual Studio?
Изображения
 
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
21.02.2023, 14:46  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Приходилось пользоваться утилитами errlook ("Поиск ошибки")
Да Было дело!

Цитата Сообщение от politoto Посмотреть сообщение
guidgen из Visual Studio?
Нет, о таком инструменте слышу впервые. Зачем мне GUID?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2023, 14:46

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

Создание диалогового окна
Господа, я полный нуб в программировании, тем более WIN API, по сему не судите строго и не ругайте У меня есть очень простой вопрос,...

Закрытие диалогового окна
Добрый день, нигде в интернете не нашла ответа на вопрос, как сделать, чтобы при закрытии диалогового окна закрывалось все. Суть такая: при...

Создание нового диалогового окна
Я создаю приложение в диалоговом окне. У меня есть кнопка Button1. При нажатии на нее должно выскакивать другое диалоговое окно. Вот я его...

Не отображаются границы диалогового окна
Подскажите пожалуйста, как устраиить проблему связанную с отсутствием границ диалогового окна ?


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
сукцессия 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