| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > CDialogBar в SDI приложении |
| Автор: Nastya 2.2.2004, 21:16 |
| VC++6.0. SDI - приложение Такая проблема: Создаю DialogBar, на нем к примеру EDIT. Обработать сообщение от него не проблема, как и найти его CWnd*. Но как организовать DDX_ и DDV_ ? Свой класс от диалога создать не получается. Ручками вставлла в CMainFrame - не работатет. Хэлп !!!!!!!!! |
| Автор: mr.DUDA 2.2.2004, 22:20 |
| Как это так - не получается создать производный класс ! Надо бы научиться обходиться без помощи ClassWizard-а... Создаём производный класс, переопределяем DoDataExchange - вот и всё, что нужно для DDX_ и DDV_ ... |
| Автор: Nastya 3.2.2004, 11:19 |
| Я видносильно торможу Произвольный класс идет от СDialog, где в качестве идентификатора шаблона диалога указывается шаблон моего DialogBar`а ? В чем у меня возникла проблема, ведь, элементы (например кнопки) на диалог баре не активны, пока их не обработаешь в CMainFrame или С...View или в документе. Т.е. каким боком идет обраотка сообщений и связь всей этой каши в идиное целое? Моежт есть дока какая-нибудь поприличнее? Или поясни, плиз, на пальцах |
| Автор: mr.DUDA 3.2.2004, 14:49 | ||||||||||
| Для примера можно посмотреть 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 21.10.2004, 10:27 | ||||
| Давно хотел такое сотворить, но не получалось. А сейчас просто необходимо. В общем у меня вылетает при добавлении в int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
с руганью
Все делаю как написано, плюс изменил в void CDialogBarEx::DoDataExchange(CDataExchange* pDX) вместо CDialog::DoDataExchange(pDX); написал CDialogBar::DoDataExchange(pDX); т.к. доступа к ЦДиалоговому DDX нету. |