С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 2

Почему при нажатии сразу не появляется диалоговое окно?

02.05.2015, 12:33. Показов 2536. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Сразу скажу - я новичок). Сейчас занимаюсь по книге Пирогова "Программирование на visual c++".

1. Суть проблемы:
Выполняю пример из книги. Нормальная работа программы - появляется окно (дескриптор hWnd), в котором есть кнопка "Диалог" (дескриптор hb). При нажатии на эту кнопку должно появиться диалоговое окно IDD_DIALOG1.

2. Неправильность поведения программы: при нажатии на кнопку "Диалог" диалоговое окно IDD_DIALOG1 не появляется. Оно появляется только после следующих операции: щелкаем по кнопке "Диалог", затем нажимаем клавишу Alt.

Вопрос: почему так происходит? чем это объяснить?

Код программы:
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
//api1.cpp
 
#include "resource.h"
#include <Windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DIAL1(HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hh;
 
int APIENTRY WinMain(HINSTANCE  hInstance,
                     HINSTANCE  hPrevInstance,
                     LPSTR      lpCmdline,
                     int        nCmdShow)
{
    //TODO: Place code here
    char cname[]="Class";
    char title[]="Наше первое окно";
    MSG msg;
    hh=hInstance;
    //структура для регистрации класса окон
    WNDCLASS wc;
    wc.style            =   0;
    wc.lpfnWndProc      =   (WNDPROC)WndProc;
    wc.cbClsExtra       =   0;
    wc.cbWndExtra       =   0;
    wc.hInstance        =   hInstance;
    wc.hIcon            =   LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
    wc.hCursor          =   LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    =   (HBRUSH)(COLOR_WINDOW+15);
    wc.lpszMenuName     =   0;
    wc.lpszClassName    =   cname;
    //регистрируем класс
    if(!RegisterClass(&wc)) return 0;
    //создать окно
    HWND hWnd = CreateWindow(
        cname, //class
        title, //title
        WS_OVERLAPPEDWINDOW, //window style
        0, //coordinata x
        0, //coordinata y
        500, //width of window
        300, //hight of window
        NULL, //descriptor of parent-window
        NULL, //descriptor of menu
        hInstance, //identifier of application
        NULL); //указатель на структуру, посылаемую по сообщению WM_CREATE
    // проверим создалось ли окно
    if (!hWnd) return 0;
    //show window
    ShowWindow(hWnd, nCmdShow);
    // обновить содержимое окна
    UpdateWindow(hWnd);
 
    //цикл обработки сообщения
    while (GetMessage(&msg, NULL, 0, 0))
    {
        //транслировать коды виртуальных клавиш в ASCII-коды
        TranslateMessage(&msg);
        //переправить сообщение процедуре окна
        DispatchMessage(&msg);
    }
    return 0;
}
 
//процедура окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hb;
    switch(message)
    {
        //сообщение при создании окна
    case WM_CREATE:
        //создаем кнопку
        hb=CreateWindow(
                "BUTTON",
                "Диалог",
                WS_CHILD|WS_VISIBLE,
                10,
                10,
                60,
                30,
                hWnd,
                NULL,
                hh,
                NULL
                );
        break;
        //сообщение, приходящее от элементов окна
    case WM_COMMAND:
        if ((HWND)lParam==hb)
        {
            DialogBox(hh,(char *)IDD_DIALOG1,hWnd,DIAL1);
        };
        break;
        //сообщение при закрытии окна
    case WM_DESTROY:
        //необходимо, чтобы выйти из цикла обработки сообщений
        PostQuitMessage(0);
        break;
        //сообщение, приходящее при перерисовке окна
    case WM_PAINT:
        //обновить содержимое кнопки
        UpdateWindow(hb);
        break;
        //обработка нажатия левой кнопки мыши
    case WM_LBUTTONDOWN:
        //закрыть окно
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
//функция диалогового окна
BOOL CALLBACK DIAL1(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //сообщение, получаемое при создании диалогового окна
    case WM_INITDIALOG:
        break;
        //сообщение, приходящее при закрытии окна
    case WM_CLOSE:
        EndDialog(hwndDlg,0);
        break;
    case WM_COMMAND:
        //не нажата ли кнопка выхода
        if(LOWORD(wParam)==IDOK)
        {
            EndDialog(hwndDlg,0);
        };
        break;
    };
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2015, 12:33
Ответы с готовыми решениями:

Одно диалоговое окно с другого при нажатии кнопки
Здрасте. Подскажите,плиз, как сделать, чтобы из одного диалогового окна при нажатии кнопки, появлялось другое диалоговое окно....

Как сделать чтобы при нажатии на кнопку открывалось второе диалоговое окно? (MFC)
Как сделать чтобы при нажатии на кнопку открывалось второе диалоговое окно ( в MFC )??

Как заставить MFC проект сразу скрыть главное диалоговое окно
Столкнулся с проблемой - сделал MFC проектик с треем, для включения режима трея использую сообщение SW_MINIMIZE а для восстановления в...

2
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
02.05.2015, 17:21
Происходит это из-за не корректной обработки оконного сообщения WM_PAINT.
Для починки надо закомментировать строки 102, 104 и 105.
1
0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 2
02.05.2015, 17:30  [ТС]
Спасибо за ответ!) сейчас проверю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2015, 17:30
Помогаю со студенческими работами здесь

Как вывести диалоговое окно при нажатии кнопки?
Как можно вывести дилоговое окно при нажатие кнопки : private void button1_Click(object sender, EventArgs e) { // код вызов отдельного...

Как сделать, чтобы диалоговое окно не закрывалось при нажатии клавиши ENTER?
Как сделать, чтобы диалоговое окно не закрывалось при нажатии клавиши ENTER? (если можно то, код)

При нажатии на кнопку открывается диалоговое окно OpenFileDialog, выбранный файл загружается в RichTextBox
Разработать Windows Forms приложение, содержащее RichTextBox и кнопку. При нажатии на кнопку открывается диалоговое окно OpenFileDialog,...

При запуске Windows гаджеты запускаются, но сразу же появляется окно о прекращении работы программы
Добрый день. При запуске windows гаджеты запускаются, но сразу же появляется окно о прекращении работы программы: Сигнатура...

Не появляется диалоговое окно
В visual studio 2010 в программе нет ошибок, но диалоговое окно с результатом ее работы не появляется. Что делать?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru