Стыковка панелей управления / панелей к CMDIFrameWndEx? - PullRequest
0 голосов
/ 03 апреля 2009

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

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);

Это работает, когда появляется боковое окно, но оно не кажется подвижным и не рисуется должным образом.

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

Ответы [ 4 ]

2 голосов
/ 15 апреля 2009

Это то, что я делаю как часть моего 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);

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

1 голос
/ 03 апреля 2009

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

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

0 голосов
/ 02 февраля 2010

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

0 голосов
/ 11 декабря 2009

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

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

...