Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
BeginerMan
49 / 48 / 5
Регистрация: 17.11.2012
Сообщений: 427
#1

Создание своих дочерних окон - C++ WinAPI

24.11.2016, 10:35. Просмотров 322. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание своих дочерних окон (C++ WinAPI):

Создание 2-х типов дочерних окон - C++ WinAPI
Помогите, совсем профан в этом. Не создается второе дочернее окно. В чем ошибка? // 123.cpp : Defines the entry point for the...

Создание и закраска Дочерних окон (Шахматная доска) - C++ WinAPI
Суть задачи: Создать из дочерних окон доску закрашенную в шахматном порядке,при нажатий на ячейку,ячейка должна менять цвет.(ч\б) Не...

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

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

Изменение размера дочерних окон - C++ WinAPI
Имеется главное окно с тремя дочерними, конкретнее все 3 дочерних окна это контролы типа ListView, Tab control и обычное дочернее окно для...

Закрытие всех дочерних окон - C++ WinAPI
У меня есть программа которая по нажатию ЛКМ создает дочернее окно. Мне нужно закрыть все дочерние окна когда их будет 5 или больше.

5
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,936
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 / 5
Регистрация: 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
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,936
25.11.2016, 15:11 #5
Цитата Сообщение от BeginerMan Посмотреть сообщение
то проблема уже будет с моими окошками, они будут рисовать их коллизию. (РИСУНОК 3)
BeginerMan, здесь может пригодиться стиль WS_CLIPSIBLINGS.
Вот пример программы, которая тоже использует дочерние окна, которые можно перемещать и свертывать.
1
Миниатюры
Создание своих дочерних окон  
BeginerMan
49 / 48 / 5
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Изменение z-index-а дочерних окон - C++ WinAPI
Создаю два окна, потом по действиям пользователя изменяю их z-index, ничего не выходит SetWindowPos ( hWnd, // дескриптор окна ...

Перехват сообщений дочерних окон - C++ WinAPI
Каким образом перехватываются сообщения дочерних окон класа "button", "edit". Например при нажатии клавишы tab нужно переключать фокус с...

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


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

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

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