Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Управление диалогом, как полноценным окном


Автор: S.A.G. 21.6.2009, 13:01
С диалогами, конечно, все ясно. Просьба объяснить.

Автор: GremlinProg 21.6.2009, 14:04
Цитата

Как поместить элемент управления на главное окно, WinAPI

так же как это делают диалоги: создать элемент с помощью CreateWindow/Ex

Автор: S.A.G. 21.6.2009, 14:12
Цитата(GremlinProg @  21.6.2009,  14:04 Найти цитируемый пост)
так же как это делают диалоги: создать элемент с помощью CreateWindow/Ex

А если их много, то как получить наглядность? Создать ресурс диалога и временно накидать туда, чтобы получить нужные координаты и внешний вид?

Автор: GremlinProg 21.6.2009, 14:37
наглядность )
для наглядности и используют ресурсы диалогов

не совсем понял, S.A.G., уточняю: ты хочешь иметь возможность редактировать ресурс как в диалоге,
но работать с ним как с обычным окном, через WndProc?

если так, то смотри соседнюю тему,
Custom Dialog's - как раз такой случай: http://forum.vingrad.ru/forum/topic-263795.html

Автор: S.A.G. 21.6.2009, 14:42
Цитата(GremlinProg @  21.6.2009,  14:37 Найти цитируемый пост)
ты хочешь иметь возможность редактировать ресурс как в диалоге,но работать с ним как с обычным окном, через WndProc?

Ya. Спасибки за хелп. smile А ты не мог бы объяснить тут? - Вопрос той темы мне не понятен.

Автор: S.A.G. 21.6.2009, 18:38
GremlinProg, поможешь?

Автор: 586 22.6.2009, 07:27
1. Создай в диалоге Custom Control.
2. В свойствах контрола в поле Class Name укажи имя твоего класса.

В коде:
1. Вызови функцию RegisterClass (если класс не зарегистрирован)
2. Создай диалог.

Автор: S.A.G. 22.6.2009, 09:53
586, мне нужно на главном окне, а не на диалоге.

Автор: Earnest 22.6.2009, 10:02
S.A.G., самый простой способ, не влазя в дебри процедур, сделать диалог дочерним в твоем главном окне. Т.е. создаешь ресурс диалога как обычно, только в свойствах ему чтавишь стиль чайлд. Далее, в главном окне создаешь диалог CreateDialоg, как дочерний по отношению к главному окну. У главного окна тебе потребуется реализовать только метод OnSize, чтобы растягивать лиалог на все окно (если надо, конечно).

Еще метод, для слегка маньяков.
Опять создаем диалоговый ресурс, загружаем его как ресурс DLGTEMPLATE, далее читаем и по его итемам создаем динамически контролы в главном окне. Совсем недавно я кому-то показывала код для чтения DLGTEMPLATE, поищи, если интересно.

Добавлено через 1 минуту и 7 секунд
Но первый способ, по-моему, лучше по дизайну, ибо отделяет главное окно (рамку) от его содержимого. Лучше, в том числе и чем подмена процедуры. И проще.

Автор: GremlinProg 22.6.2009, 10:07
Цитата(S.A.G. @  21.6.2009,  16:42 Найти цитируемый пост)
А ты не мог бы объяснить тут? - Вопрос той темы мне не понятен.

предлагаешь повторить то же самое?

просто напомню ссылку из MSDN: http://msdn.microsoft.com/en-us/library/ms644995(VS.85).aspx#custom_boxes
все 6 абзатцев исключительно по теме, просто вчитайся
а по-русски, мы уже все обговорили

если у Alca есть желание, он может подправить свой код до рабочего состояния,
хотя устно мы уже и обговорили проблемные места

кстати, 586 предложил способ, при котором можно в ресурс добавить свой собственный визуальный компонент,
тоже отличный вариант

Добавлено через 9 минут и 59 секунд
Цитата(Earnest @  22.6.2009,  12:02 Найти цитируемый пост)
Но первый способ, по-моему, лучше по дизайну, ибо отделяет главное окно (рамку) от его содержимого. Лучше, в том числе и чем подмена процедуры. И проще.

так мы не о подмене процедуры говорим-то,
а о наследовании (суперклассинг),
по мне, так перекрыть таким образом диалог - гораздо проще, чем создавать в окне дочерний view, из ресурсов,
но тут, конечно хозяин-барин: правильно и так и эдак

Автор: GremlinProg 22.6.2009, 10:28
кстати, предлагаю сменить название топика, т.к. оно не отражает его суть,
например так: "Управление диалогом, как полноценным окном, через WndProc"
есть другие предложения, мнения?

Автор: S.A.G. 22.6.2009, 11:30
Цитата(Earnest @  22.6.2009,  10:02 Найти цитируемый пост)
S.A.G., самый простой способ, не влазя в дебри процедур, сделать диалог дочерним в твоем главном окне. Т.е. создаешь ресурс диалога как обычно, только в свойствах ему чтавишь стиль чайлд. Далее, в главном окне создаешь диалог CreateDialоg, как дочерний по отношению к главному окну. У главного окна тебе потребуется реализовать только метод OnSize, чтобы растягивать лиалог на все окно (если надо, конечно).

Я над этим думал, т.е. получается накладка окна диалога на клиентскую область главного окна.

Я на даный момент пытаюсь сделать исключительно по-простому - просто создать шаблон диалога, идентичный главному окну, чтобы кидать на него контролы и получать таким образом требуемую наглядность и координаты контролов из файла .rc. Только вот проблемка - неудается подогнать размер диалога под размер главного окна. Никак не удается получить корректные диалоговые единицы. Вызов DialogBaseUnits дает 8 и 16 для x и y соответственно, GetTextMetrics - 7(!) и 16, а MapDialogRect переводит размеры и расположение диалога в совсем другие числа. Вопрос: как получить "правильные" диалоговые единицы?

Цитата(GremlinProg @  22.6.2009,  10:28 Найти цитируемый пост)
"Управление диалогом, как полноценным окном, через WndProc"

Согласен. По поводу твоей идеи почитаю, но не уверен, что мне хватит английского. Кажется, это самый прогрессивный подход к решению этой задачи.

Автор: GremlinProg 22.6.2009, 11:39
ок, название поменял

Автор: S.A.G. 22.6.2009, 12:53
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)