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

Закрытие дочернего окна приводит к закрытию основного окна

20.02.2017, 11:04. Показов 1783. Ответов 5

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

У меня после отпускания кнопки закрваеться не толко дочернее окно. но и родительское.

Буду очень признательный если поможете.

Вот весь код =)
Кликните здесь для просмотра всего текста

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
#include <Windows.h>
 
// Идентификаторы окон
#define ID_FIRSTCHILD   100
#define ID_SECONDCHILD  101
#define ID_THIRDCHILD   102
 
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hinst;
RECT rect;
HWND child;
 
int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS w;
    hinst = hInstance;
    memset(&w, 0, sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    w.lpszClassName = L"C Windows";
    w.hCursor = LoadCursor(NULL, IDC_ARROW);
    RegisterClass(&w);
    hwnd = CreateWindow(L"C Windows", L"C Windows", WS_OVERLAPPEDWINDOW,
        10, 10, 600, 480, NULL, NULL, hInstance, NULL);
    GetClientRect(hwnd, &rect);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message)
    {
    case WM_LBUTTONDOWN:
    {
        SetCapture(hwnd);
        WNDCLASS w;
        memset(&w, 0, sizeof(WNDCLASS));
        w.lpfnWndProc = ChildProc;
        w.hInstance = hinst;
        w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        w.lpszClassName = L"ChildWClass";
        w.hCursor = LoadCursor(NULL, IDC_CROSS);
        RegisterClass(&w);
        
        child = CreateWindowEx(0, L"ChildWClass", (LPCTSTR)NULL,
            WS_CHILD | WS_BORDER | WS_VISIBLE, 0, 0,
            rect.right / 2, rect.bottom / 2, hwnd, (HMENU)(int)(ID_FIRSTCHILD), hinst, NULL);
        ShowWindow(child, SW_NORMAL);
        UpdateWindow(child);
 
        return 0;
 
    }
    case WM_LBUTTONUP:
    {
        EndDialog(child, LOWORD(wparam));
        //ReleaseCapture();
    }
    case WM_DESTROY:
    {
        PostMessage(child, WM_CLOSE, 0, 0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, Message, wparam, lparam);
}
 
 
LRESULT CALLBACK ChildProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    if (Message == WM_DESTROY) {
        PostQuitMessage(0);
    }
    return DefWindowProc(hwnd, Message, wparam, lparam);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2017, 11:04
Ответы с готовыми решениями:

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

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

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

При открытии дочернего окна, отображаются формы и кнопки с основного окна; как исправить?
при открытии дочернего окна, отображаются формы и кнопки с основного окна, как можно исправить? ...

5
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
20.02.2017, 16:10 2

Не по теме:

SkyMan, почему Вы решили использовать EndDialog ?


SkyMan, поставьте breakpoint на строке case WM_LBUTTONUP и выполните по шагам несколько строк.
0
Ушел с форума
Эксперт С++
16420 / 7395 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
20.02.2017, 16:14 3
PostQuitMessage приводит к тому, что GetMessage возвращает 0 и цикл
обработки оконных сообщений завершается.
0
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 16
21.02.2017, 23:14  [ТС] 4
А чем можно заменить PostQuitMessage чтоб закрыть дочернее окно не закрывая основное, и после закрыти основного чтоб пропал процес?
0
Ушел с форума
Эксперт С++
16420 / 7395 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
21.02.2017, 23:16 5
Лучший ответ Сообщение было отмечено SkyMan как решение

Решение

PostQuitMessage нужно вызывать ровно один раз - когда программа
должна выйти из цикла GetMessage и завершиться.

Разумеется, в программе может быть много потоков, у каждого свои окна и
своя очередь сообщений, тогда и PostQuitMessage тоже должно быть несколько,
но это уже специфический случай.
1
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 16
21.02.2017, 23:20  [ТС] 6
Убежденный, Спасибо, разобрался
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2017, 23:20

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

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

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

Закрытие основного окна программы
Хочу что бы при нажатии кнопки закрывалось основное окно моей программы. Во втором окне сделал...

Закрытие дочернего окна
Создаю MDI приложение,возникла проблема когда вытаюсь закрыть дочернее окно.В главное форме создаю...


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

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

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