![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
VC++6.0. SDI - приложение
Такая проблема: Создаю DialogBar, на нем к примеру EDIT. Обработать сообщение от него не проблема, как и найти его CWnd*. Но как организовать DDX_ и DDV_ ? Свой класс от диалога создать не получается. Ручками вставлла в CMainFrame - не работатет. Хэлп !!!!!!!!! -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Как это так - не получается создать производный класс !
Надо бы научиться обходиться без помощи ClassWizard-а... Создаём производный класс, переопределяем DoDataExchange - вот и всё, что нужно для DDX_ и DDV_ ... -------------------- ![]() |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Я видносильно торможу
Произвольный класс идет от СDialog, где в качестве идентификатора шаблона диалога указывается шаблон моего DialogBar`а ? В чем у меня возникла проблема, ведь, элементы (например кнопки) на диалог баре не активны, пока их не обработаешь в CMainFrame или С...View или в документе. Т.е. каким боком идет обраотка сообщений и связь всей этой каши в идиное целое? Моежт есть дока какая-нибудь поприличнее? Или поясни, плиз, на пальцах -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| mr.DUDA |
|
||||||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Для примера можно посмотреть MSDN 2001, пример Vc98/Mfc/general/ctrlbars - там всё это есть, только без DDX/DDV.
Вообще, в MSDN черным-по-белому написано, что все сообщения от CDialogBar-а обрабатывает окно-владелец бара, т.е. собственно класс CDialogBar - это обычный тулбар, только с "натянутым" на него шаблоном диалога. Но можно и обойти это тупое ограничение! Что мы и сделаем. Итак, создаём обычный диалог с кнопкой, чекбоксом и Edit-ом, и класс для него (производный от CDialog !) - пусть это будет класс CDialogBarEx. Далее заходим в DialogBarEx.h/.cpp и вносим изменения:
Добавляем в CDialogBarEx переменную для Edit-а, и создаём обработчик нажатия на кнопку - например:
Создаём диалог бар в CMainFrame::OnCreate
Теперь - самое главное: как сделать кнопку доступной (она после создания серая). Наш любимый MSDN говорит, что сообщения от диалог бара, приходящие в класс-контейнер (CMainFrame) аналогичны сообщениям от тулбара - т.е. это будут обработчики OnXXXX и OnUpdateXXXX. Значит, каким-то образом нужно создать обновление состояния "кнопки тулбара" для каждого контрола в CDialogBarEx (для Edit-а необязательно). Например, у меня есть кнопка IDC_BUTTON1. Тогда я добавляю в MainFrm.h/.cpp:
Всё ! Теперь для каждого нового контрола нужно не забывать добавлять строку: ON_UPDATE_COMMAND_UI(идентификатор_контрола, OnUpdateMyControls) Что мы получили: Путём не очень хитрых манипуляций мы имеем возможность работать с диалогом CDialogBarEx обычным, привычным для нас способом, хоть это и не класс производный от CDialog. В то же время, диалог отображается как тулбар, его можно перетягивать и приаттачивать к любому краю фрейма. -------------------- ![]() |
||||||||||
|
|||||||||||
| Madest |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 27.11.2003 Где: Городок Репутация: нет Всего: нет |
Давно хотел такое сотворить, но не получалось. А сейчас просто необходимо. В общем у меня вылетает при добавлении в
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
с руганью
Все делаю как написано, плюс изменил в void CDialogBarEx::DoDataExchange(CDataExchange* pDX) вместо CDialog::DoDataExchange(pDX); написал CDialogBar::DoDataExchange(pDX); т.к. доступа к ЦДиалоговому DDX нету. --------------------
|
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |