Как переключать views в сплиттере (WTL)
От: constantcpp  
Дата: 27.09.06 07:26
Оценка:
Заранее извиняюсь за чайниковский вопрос.

Проект WTL. Допустим есть окно, в нем сплиттер. В правой панели дочерний диалог. Есть еще несколько различных дочерних диалогов. Хочется менять их в правой панели сплиттера при выборе различных пунктов меню.
Подскажите пожалуйста, как это сделать?
Re: Как переключать views в сплиттере (WTL)
От: BuHHunyx Беларусь  
Дата: 27.09.06 08:38
Оценка:
Здравствуйте, constantcpp, Вы писали:

C>Заранее извиняюсь за чайниковский вопрос.


C>Проект WTL. Допустим есть окно, в нем сплиттер. В правой панели дочерний диалог. Есть еще несколько различных дочерних диалогов. Хочется менять их в правой панели сплиттера при выборе различных пунктов меню.

C>Подскажите пожалуйста, как это сделать?

CSplitterImpl::SetSplitterPane(SPLIT_PANE_RIGHT, ...)
Re[2]: Как переключать views в сплиттере (WTL)
От: constantcpp  
Дата: 27.09.06 10:19
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>CSplitterImpl::SetSplitterPane(SPLIT_PANE_RIGHT, ...)


Спасибо, понятно.
Т.е. я добавляю в CFrameWnd все дочерние диалоги, а потом SetSplitterPane меняю.
class CMainFrame....
{
......
CSplitterWindow m_wndSplitter;

CRightView1 m_wndView1;
CRightView2 m_wndView2;
CRightView3 m_wndView3;
.....

А если, к примеру, у меня обычный SDI без сплиттеров и тоже хочется диалоги менять?
И если не только диалоги, но и ListView и т.п.?
Re[3]: Как переключать views в сплиттере (WTL)
От: BuHHunyx Беларусь  
Дата: 27.09.06 10:49
Оценка:
Здравствуйте, constantcpp, Вы писали:

[]

C>А если, к примеру, у меня обычный SDI без сплиттеров и тоже хочется диалоги менять?

C>И если не только диалоги, но и ListView и т.п.?

Если основное окно основано на CFrameWindowImpl, то всего и надо, что присвоить переменной m_hWndClient нового чайлда и вызвать UpdateLayout()
Re[4]: Как переключать views в сплиттере (WTL)
От: constantcpp  
Дата: 27.09.06 11:23
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Если основное окно основано на CFrameWindowImpl, то всего и надо, что присвоить переменной m_hWndClient нового чайлда и вызвать UpdateLayout()


Ясно. Большое спасибо!
Re[5]: Как переключать views в сплиттере (WTL)
От: constantcpp  
Дата: 28.09.06 05:35
Оценка:
А как правильно перерисовать child?

Я делал так:

CMainFrame::OnCreate...
{
.....
m_wndSplitter2.Create(m_wndPane2, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

m_wndView2.Create(m_wndSplitter2, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_SAVESEL, WS_EX_CLIENTEDGE);

m_wndView3.Create(m_wndSplitter2, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_SAVESEL, WS_EX_CLIENTEDGE);

m_wndSplitter2.SetSplitterPanes(m_wndView2, m_wndView3);

FormView1.Create(m_wndSplitter2, rcDefault);
.....
}

CMainFrame::SwitchChild...
{
m_wndSplitter2.SetSplitterPane(SPLIT_PANE_RIGHT, FormView1);
m_wndView3.ShowWindow(SW_HIDE);
FormView1.ShowWindow(SW_SHOW);
UpdateLayout();
}

Сначала попробовал без ShowWindow. FormView1 не отображался и не перерисовывался.
Добавил ShowWindow. FormView1 отобразился, но перерисовывается как-то странно: при ресайзинге появляюттся белые полоски возле разделителя.
Естественно я делаю что-то не так, вот только что?
Re[6]: Как переключать views в сплиттере (WTL)
От: programmater  
Дата: 28.09.06 13:32
Оценка:
Здравствуйте, constantcpp, Вы писали:

C>А как правильно перерисовать child?


C>Я делал так:



C>CMainFrame::SwitchChild...

C>{
C> m_wndSplitter2.SetSplitterPane(SPLIT_PANE_RIGHT, FormView1);
C> m_wndView3.ShowWindow(SW_HIDE);
C> FormView1.ShowWindow(SW_SHOW);
C> UpdateLayout();
C>}

Стоп-стоп. Что за 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 here

      return 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);    //-Установка клиента правой панели - очередного диалога.
    }
};
Re[7]: Как переключать views в сплиттере (WTL)
От: constantcpp  
Дата: 28.09.06 13:50
Оценка:
Здравствуйте, programmater, Вы писали:

P>Стоп-стоп. Что за FormView в WTL? Расскажите, а то очень нужно было, не нашел — пришлось выкручиваться другими методами.


Может быть я не так выразился... Я имел в виду дочерний диалог. Класс для него создавал WTLHelper-ом (http://salos.narod.ru/WTLHelper/WTLHelper.html)
На том же сайте есть еще визарды, в частности для создания проектов со сплиттерами. И вот в этом визарде можно выбрать базовый класс и контрол для views.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.