Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 48
1

Закрытие дочернего окна

12.02.2015, 21:54. Просмотров 1891. Ответов 8
Метки нет (Все метки)

Есть главное окно, а в нем дочернее. Подскажите пожалуйста как сделать, чтобы главное окно не закрывалось при закрытии дочернего. Заранее спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2015, 21:54
Ответы с готовыми решениями:

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

Закрытие дочернего окна приводит к закрытию основного окна
Суть задания "После нажатия левой кнопки мышки в области окна в левом углу окна создать временное...

Закрытие дочернего окна
Привет всем !!! Есть программа на WinApi состоящая из родительского и дочернего окон (hWnd и hWnd1...

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

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
8
897 / 418 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
12.02.2015, 21:58 2
Ничего делать не надо, оно и так не будет закрываться.
1
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 48
12.02.2015, 22:05  [ТС] 3
rao, вот код:
Кликните здесь для просмотра всего текста
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
#include <Windows.h>
#include <time.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd, hwndChild;
    TCHAR className[] = L"MyClass";
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_INFORMATION);
    wc.hCursor = LoadCursor(NULL, IDC_HAND);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = className;
    wc.hIconSm = LoadIcon(NULL, IDI_INFORMATION);
 
    if (!RegisterClassEx(&wc))
    {
        MessageBox(NULL, L"Cannot register class", L"Error", MB_OK);
        return 0;
    }
 
    hwnd = CreateWindow(className, L"First WINAPI Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, NULL);
    hwndChild = CreateWindow(className, L"First WINAPI Child Window", WS_CHILD | WS_OVERLAPPEDWINDOW, 50, 50, 300, 150, (HWND)hwnd, (HMENU)NULL, (HINSTANCE)hInstance, NULL);
 
    if (!hwnd)
    {
        MessageBox(NULL, L"Cannot create window!", L"Error", MB_OK);
        return 0;
    }
 
    if (!hwndChild)
    {
        MessageBox(NULL, L"Cannot create child window!", L"Error", MB_OK);
        return 0;
    }
 
    ShowWindow(hwnd, nCmdShow);
    ShowWindow(hwndChild, nCmdShow);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
 
    switch (msg)
    {
    case WM_CREATE:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        SetClassLong(hwnd, GCLP_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(100, 100, 100)));
        SetBkMode(hdc, TRANSPARENT);
        DrawText(hdc, L"HELLO WORLD!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        SetClassLong(hwnd, GCLP_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(100, 100, 100)));
        SetBkMode(hdc, TRANSPARENT);
        DrawText(hdc, L"HELLO WORLD!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        break;
 
    case WM_KEYDOWN:
        InvalidateRect(hwnd, NULL, true);
        break;
 
    case WM_CLOSE:
        DestroyWindow(hwnd);
        return 0;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
 
    return 0;
}
0
897 / 418 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
12.02.2015, 22:48 4
Аа. . Это видимо потому что оба окна одного класса и оконная процедура у них одна и та же. И любое из окон закрываясь вызывает остановку цикла обработки оконных сообщений (строка 50). Дочернему окну нельзя вызывать PostQuitMessage(0). Оно должно передавать WM_DESTROY в DefWindowProc
1
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 48
12.02.2015, 22:52  [ТС] 5
rao, то есть, как я понимаю, для каждого дочернего окна нужно регистрировать класс и создавать оконную процедуру, чтобы можно было обрабатывать их сообщения?
0
897 / 418 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
12.02.2015, 23:03 6
Лучший ответ Сообщение было отмечено SlowAR как решение

Решение

SlowAR, да, но регистрировать класс нужно не для каждого экземпляра окна, а для отдельного "типа". Т.е. из одного класса "Button" можно наделать множество дочерних кнопок, но для "Static" - потребуется другой класс.
1
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 48
12.02.2015, 23:15  [ТС] 7
rao, но, например, если у меня несколько дочерних окон и каждое из них должно иметь свой цвет фона, свои компоненты и тд, придется создать несколько оконных функций, а как их тогда можно привязать к окну, как не созданием класса?
0
897 / 418 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
13.02.2015, 21:51 8
SlowAR, все зависит от конкретной ситуации. Иногда достаточно передать при создании окна некоторый параметр (например идентификатор типа) и менять поведение окна исходя из его значения. В других случаях, когда отличия слишком большие, рациональнее зарегистрировать новый класс и объявить отдельную оконную процедуру.
1
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 48
14.02.2015, 09:59  [ТС] 9
rao, спасибо! понял, буду дальше разбираться
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 09:59

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

Вывод дочернего окна
Разбираюсь с WinAPI и не могу вывести дочернее окно. Вроде сделал всё как в msdn ну всё равно не...

Создание дочернего окна
Доброго времени суток. Нужно создать дочернее окно: #include &lt;windows.h&gt; LRESULT CALLBACK...

Изменение дочернего окна
Здравствуйте! Пишу программу, но возникла проблема. Есть главное окно hWnd, в которое через...

Передвижение дочернего окна
Всем привет!!! Это моя первая работа по созданию программ с использованием Win32 API. Помогите...

Создание дочернего окна
Доброго времени суток. У меня есть главное окно с 3 кнопками. Я хочу чтобы после нажатие на кнопку...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.