2009-04-02 2 views
0

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

CDialogBar* bar = new CDialogBar; 
bar->Create(this, IDD, WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_TOOLTIPS, IDD)); 
bar->EnableDocking(CBRS_ALIGN_ANY); 
EnableDocking(CBRS_ALIGN_RIGHT | CBRS_ALIGN_LEFT); 
DockControlBar(bar, AFX_IDW_DOCKBAR_RIGHT); 

Это все работает отлично.

Я хочу сделать аналогичную вещь сейчас в другом приложении. К сожалению, он был изменен, чтобы использовать некоторые классы из набора функций MFC, которые очень хороши, но этот подход больше не работает (он утверждает, что я могу исправить с некоторыми незначительными изменениями, но тогда боковая панель не появляется). Документация для этих новых классов ужасна, поэтому у меня довольно много проблем, выясняя, что я должен делать. Я попробовал то, что, кажется, «новый» подход:

CPaneDialog* pane = new CPaneDialog; 
    pane->Create("pane", this, TRUE, IDD, WS_VISIBLE | WS_CHILD, IDD); 
    EnableDocking(CBRS_ALIGN_RIGHT | CBRS_ALIGN_LEFT); 
    AddPane(pane); 
    DockPane(pane); 

Это работает в том, что появляется окно боковой панели, но это, кажется, не может перемещаться и не получает обращено должным образом.

Я чувствую, что стреляю в темноте со всем этим. Кто-нибудь знает, какой правильный подход к нему?

ответ

1

Если мы оба стреляем в темноту, мы удваиваем наши шансы нанести что-то.

Рассматривая документацию для CDockablePane (родительский класс CPaneDialog), я замечаю метод под названием EnableGripper. Попробуй это.

+0

Спасибо, это помогло. Я думаю, что я пропустил вызов панели -> EnableDocking, и комбинация этого и захвата, похоже, значительно улучшила ситуацию :-) – Peter

2

Это то, что я делаю, как часть моего CMainFrame::OnCreate:

if (!m_projectsPane.Create(L"Projects", this, CRect(0,0,0,0), true, IDD_PROJECTSPANE, WS_CHILD|WS_VISIBLE)) 
    return -1; 
AddDockSite(); 
EnableDocking(CBRS_ALIGN_ANY); 
EnableAutoHidePanes(CBRS_ALIGN_ANY); 
m_projectsPane.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT); 
DockPane(&m_projectsPane, AFX_IDW_DOCKBAR_RIGHT); 

Мой m_projectsPane является классом, который затем ловит ON_WM_GETMINMAXINFO для заполнения ptMinTrackSize (чтобы убедиться, что пользователь не может изменить размер диалогового окна ниже определенного минимума). Я не вижу ничего другого в своем коде, и изменение размера пристыкованной панели отлично работает.

0

Я до сих пор не могу сделать CDialogBox, прикрепленным к основному кадру. Когда я это сделал, он просто отображается как плавающая пустая мини-рамка. Внутри окна есть проблема с обновлением, и все, что осталось на экране, нарисовано там.

Что я заметил: Если CPaneDialog подключен к другой CDockablePane, он отображается правильно. Но если он состыкован с MainFrm, это не так. Это интересно, потому что CPaneDialog также является дочерним классом CDockablePane. Нет проблем в том, что другая CDockablePane прикреплена к MainFrm. (Протестировано с помощью образца SetPaneSize из образца MFC Featurepack.)

+0

Похоже, Microsoft делает все возможное, чтобы препятствовать людям. CDialogBar не работает вообще с новым CFrameWndEx. – TomeeNS

0

Хотя это может еще не дойти до оригинальных людей, которые в этом нуждаются. Возможно, проблема связана с настройками диалогового окна ресурсов, которое вы добавили в Visual Studio. Поскольку этот элемент управления приводит к созданию диалога, любые/все стили, которые вы, возможно, предоставили методу Create(), будут перезаписаны настройками в файле ресурсов. Убедитесь, что для свойства visible установлено значение True вместе с прозрачным значением False. Я сделал это и не испытывал проблем с добавлением CPaneDialog к основному кадру через DockPane().

+0

Спасибо, но было установлено значение Visible = True и Transparent = False; Я думаю, может быть, есть какая-то тонкость приложения, которое делает это намного сложнее, чем должно быть (панель была добавлена ​​к существующему приложению с хорошим размером, и кто знает, какие странные переопределения могут вызвать проблемы). Некоторое время назад я немного работал над проблемами, но, надеюсь, ваше предложение полезно кому-то другому :) – Peter

Смежные вопросы