Проект WTL. Допустим есть окно, в нем сплиттер. В правой панели дочерний диалог. Есть еще несколько различных дочерних диалогов. Хочется менять их в правой панели сплиттера при выборе различных пунктов меню.
Подскажите пожалуйста, как это сделать?
Здравствуйте, constantcpp, Вы писали:
C>Заранее извиняюсь за чайниковский вопрос.
C>Проект WTL. Допустим есть окно, в нем сплиттер. В правой панели дочерний диалог. Есть еще несколько различных дочерних диалогов. Хочется менять их в правой панели сплиттера при выборе различных пунктов меню. C>Подскажите пожалуйста, как это сделать?
Здравствуйте, BuHHunyx, Вы писали:
BHH>CSplitterImpl::SetSplitterPane(SPLIT_PANE_RIGHT, ...)
Спасибо, понятно.
Т.е. я добавляю в CFrameWnd все дочерние диалоги, а потом SetSplitterPane меняю.
class CMainFrame....
{
......
CSplitterWindow m_wndSplitter;
Здравствуйте, BuHHunyx, Вы писали:
BHH>Если основное окно основано на CFrameWindowImpl, то всего и надо, что присвоить переменной m_hWndClient нового чайлда и вызвать UpdateLayout()
Сначала попробовал без ShowWindow. FormView1 не отображался и не перерисовывался.
Добавил ShowWindow. FormView1 отобразился, но перерисовывается как-то странно: при ресайзинге появляюттся белые полоски возле разделителя.
Естественно я делаю что-то не так, вот только что?
Стоп-стоп. Что за FormView в WTL? Расскажите, а то очень нужно было, не нашел — пришлось выкручиваться другими методами.
C>Сначала попробовал без ShowWindow. FormView1 не отображался и не перерисовывался. C>Добавил ShowWindow. FormView1 отобразился, но перерисовывается как-то странно: при ресайзинге появляюттся белые полоски возле разделителя. C>Естественно я делаю что-то не так, вот только что?
У меня не было FormView и была необходимость в сплиттере переключать диалоги. Сделал правую панель сплиттера потомком CScrollContainerImpl (у меня WTL7.5), а при переключении диалогов делаю ему SetClient(NewDialog). На правую панель пришлось городить отдельный класс (а не просто взять CScrollContainer) ради того, в PretranslateMessage этого нового класса вызывать IsDialogMessage для дочернего диалога, иначе клавиатурная навигация (стрелочки и табы) в дочернем диалоге отрубалась напрочь. В общем, что-то типа этого:
#include <atlscrl.h>
class CRightView : public CScrollContainerImpl<CRightView>
{
public:
DECLARE_WND_CLASS(_T("CRightView"))
CRightView() {};
~CRightView() {};
BOOL PreTranslateMessage(MSG* pMsg)
{
if(GetClient()) {return ::IsDialogMessage(GetClient() , pMsg);}
else return FALSE;
}
void DoPaint(CDCHandle dc)
{
dc.Rectangle(10, 10, 100, 100);
}
BEGIN_MSG_MAP(CRightView)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
CHAIN_MSG_MAP(CScrollContainerImpl< CRightView >)
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
bHandled = FALSE;
// Put your intitialization code herereturn 0;
}
};
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,
public CMessageFilter, public CIdleHandler , public GlobalProjectSettingsCache
{
protected:
//.........................
CRightView m_wndView2;
CSplitterWindow m_wndSplitter;
//................
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
//.....................
//-Создание сплиттера
m_wndSplitter.SetSplitterExtendedStyle(0, SPLIT_PROPORTIONAL);
m_hWndClient = m_wndSplitter.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
//................
//--создание правой панели сплиттера (CRightView : public CScrollContainerImpl<CRightView>)
m_wndView2.Create(m_wndSplitter, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
m_wndSplitter.SetSplitterPanes(m_wndView1, m_wndView2); // Установка панелей сплиттера.
//................
m_wndView2.SetClient(hFirstDlg); // Установка клиента правой панели - первого диалога
//.................
}
void OnSwitchViews(int NewViewID)
{
DestroyCurrentDialog(); // Не важно, где я сохраняю HWND текущего диалога :)
HWND NewViewDlgWnd = CreateNewDlg(NewViewID);
m_wndView2.SetClient(NewViewDlgWnd); //-Установка клиента правой панели - очередного диалога.
}
};
Здравствуйте, programmater, Вы писали:
P>Стоп-стоп. Что за FormView в WTL? Расскажите, а то очень нужно было, не нашел — пришлось выкручиваться другими методами.
Может быть я не так выразился... Я имел в виду дочерний диалог. Класс для него создавал WTLHelper-ом (http://salos.narod.ru/WTLHelper/WTLHelper.html)
На том же сайте есть еще визарды, в частности для создания проектов со сплиттерами. И вот в этом визарде можно выбрать базовый класс и контрол для views.