Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
#1

Создание своих дочерних окон

24.11.2016, 10:35. Просмотров 412. Ответов 5
Метки нет (Все метки)

Всем здрасьте !

У меня проблема с Моими дочерними окнами.
Может где надо какой стиль добавить, может ещё что ... Я не знаю :С

В общем:

1. Инит программы
Регаю своё Главное окно, потом создаю его.
Создаю разные дочерние контролы на нём: Табы, кнопки т .п.
Тут всё отлично. Создание Главного окна и Таба
Кликните здесь для просмотра всего текста
C++
1
2
3
hParent = CreateWindow(name, name, WS_SYSMENU | WS_MINIMIZEBOX, dx, dy, WIDTH, HEIGHT, 0, 0, hInstance, 0);
//***
hTab = CreateWindow(WC_TABCONTROL, nullptr, WS_CHILD | WS_VISIBLE, 0, 0, WIDTH, HEIGHT, hParent, 0, 0, 0);


P.S. Таб занимает всю область моего Главного окна.
P.S.S. На Табе у меня есть кнопка "Построить", и при нажатии на неё должно создаваться и открываться моё дочернее окно.

2. Создание своих окон
Регаю класс нового дочернего окна.
Создаю дочернее окно с хэндлом от Главного окна.
Так же под свои дочерние окна, я написал свой обработчик AddWndProc().
Кликните здесь для просмотра всего текста
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
int index = GetNextWnd();
 
// ADDWND моя структура -> AddWnd массивчик её
// В ADDWND содержится WNDCLASS, и разная моя информация
 
AddWnd[index].is = true;
AddWnd[index].wndClass = wndTemp;
 
_stprintf_s(AddWnd[index].name, MAX_PATH, TEXT("BDD %d"), index);
 
AddWnd[index].wndClass.lpszClassName = AddWnd[index].name;
AddWnd[index].wndClass.lpfnWndProc = AddWndProc;
 
if (!RegisterClass(&AddWnd[index].wndClass))
    MessageBox(0, TEXT("Не удалось зарегистрировать Класс"), 0, 0);
 
HWND hAddWnd = CreateWindow(AddWnd[index].name, AddWnd[index].name, WS_VISIBLE | WS_CHILD | WS_OVERLAPPEDWINDOW,
 0, 0, WIDTH / 2, HEIGHT / 2, hParent, (HMENU)index, wndTemp.hInstance, 0);
if (!hAddWnd)
    MessageBox(0, TEXT("Не удалось создать окно"), 0, 0);
 
ShowWindow(hAddWnd, SW_NORMAL);
UpdateWindow(hAddWnd);
                
SetWindowLong(hAddWnd, GWL_USERDATA, index);


Оно тоже создаётся, всё отлично.
Но возникает проблема с отображением Моих дочерних окон.

Проблемы.
При создании Моё дочернее окно походу находится под Табом, и если я наведу курсором на системные кнопки Моего дочернего окна, то оно начнёт появляться, а если возьму за заголовок и буду таскать туда сюда, то фон Моего дочернего окна будет схож с фоном Таба. (РИСУНОК 1)

Если я сверну и разверну Своё дочернее окно, то оно станет нормально отрисованным. Даже если буду возить туда-сюда его, то он всё равно будет нормальным. (РИСУНОК 2)

Если я создам второе такое окно, то история повторится как с первым. Если я его сверну и разверну, то проблема уже будет с моими окошками, они будут рисовать их коллизию. (РИСУНОК 3)


Как мне разрешить эти проблемы ?

И ещё вопросик:
Обязательно ли каждому дочернему окну присваивать hInstance программы ?
0
Миниатюры
Создание своих дочерних окон   Создание своих дочерних окон   Создание своих дочерних окон  

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2016, 10:35
Ответы с готовыми решениями:

Создание 2-х типов дочерних окон
Помогите, совсем профан в этом. Не создается второе дочернее окно. В чем...

Создание и закраска Дочерних окон (Шахматная доска)
Суть задачи: Создать из дочерних окон доску закрашенную в шахматном порядке,при...

Минимизация дочерних окон
Здравствуйте! Есть задание: Написать приложение, обладающее следующей ...

Фон дочерних окон
Здравствуйте, в общем ситуация обстоит так, нужно создать главное окно, и при...

Изменение z-index-а дочерних окон
Создаю два окна, потом по действиям пользователя изменяю их z-index, ничего не...

5
Alex5
1122 / 783 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
24.11.2016, 21:20 #2
Цитата Сообщение от BeginerMan Посмотреть сообщение
фон Моего дочернего окна будет схож с фоном Таба. (РИСУНОК 1)
Цитата Сообщение от BeginerMan Посмотреть сообщение
C++
1
hTab = CreateWindow(WC_TABCONTROL, nullptr, WS_CHILD | WS_VISIBLE, 0, 0, WIDTH, HEIGHT, hParent, 0, 0, 0);
BeginerMan, может быть, это связано с тем, что id создаваемого таба равен 0, и значит совпадает с id первого из создаваемых далее дочерних окон.

Добавлено через 1 минуту
Цитата Сообщение от BeginerMan Посмотреть сообщение
HWND hAddWnd = CreateWindow(AddWnd[index].name, AddWnd[index].name, WS_VISIBLE | WS_CHILD | WS_OVERLAPPEDWINDOW,
0, 0, WIDTH / 2, HEIGHT / 2, hParent, (HMENU)index, wndTemp.hInstance, 0);
WS_CHILD вместе с WS_OVERLAPPEDWINDOW выглядит как-то странно. Зачем Вы используете здесь WS_CHILD ?
0
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
24.11.2016, 22:36  [ТС] #3
Ну WS_CHILD говорит же что это окно содержит родителя, а мне надо так.
А WS_OVERLAPPEDWINDOW, чтобы можно было с ним обращаться как с обычным окном.

Добавлено через 22 минуты
Задание индекса в Табе никак не повлияло.

Добавлено через 3 минуты
А если убрать WS_CHILD, то всё прекрасно работает.
Только я хотел бы, чтобы мои эти окна в массиве AddWnd, могли перемещаться только в моём окне. И ещё есть такая прикольная фишка с WS_CHILD, что если я сверну моё окно, то она свернётся вниз моего главного окна, а не панели задач.

В принципе проблема разрешена. Но хотелось бы узнать как это провернуть с WS_CHILD.

Добавлено через 11 секунд
И что там насчёт hInstance
0
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
25.11.2016, 10:05 #4
Я вот не понимаю, разве отдельное окно оно CHILD ?? я так понял CHILD это по сути не окно а область в главном окне.. но иногда эту область можно сделать в виде окна и таскать по главному окну как лист бумаги по столу.
Методом исключение обычные окна которые можно таскать по рабочему столу вне главного окна это не месседж боксы, не диалоговые окна... а перекрывающие либо просто окна..
1
Alex5
1122 / 783 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
25.11.2016, 15:11 #5
Цитата Сообщение от BeginerMan Посмотреть сообщение
то проблема уже будет с моими окошками, они будут рисовать их коллизию. (РИСУНОК 3)
BeginerMan, здесь может пригодиться стиль WS_CLIPSIBLINGS.
Вот пример программы, которая тоже использует дочерние окна, которые можно перемещать и свертывать.
1
Миниатюры
Создание своих дочерних окон  
BeginerMan
49 / 48 / 14
Регистрация: 17.11.2012
Сообщений: 427
27.11.2016, 17:36  [ТС] #6
Спасибо, разобрался.
0
27.11.2016, 17:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2016, 17:36

Закрытие всех дочерних окон
У меня есть программа которая по нажатию ЛКМ создает дочернее окно. Мне нужно...

Получение сообщений от дочерних окон
Есть класс создающий дочернее окошко внутри основного окна. Все сообщения...

Перечень существующих и дочерних окон
Прошу помощи уважаемые, вот такое задали: В основном окне приложения WIN32...


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

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

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