Docking wxPanel

wxFormBuilder에서 만든 wxPanel을 wxFrame에 도킹 시켜 본다.

도킹을 위해서는 wxAuiManager가 필요하다.

1. 관리 할  윈도우 설정
m_mgr.SetManagedWindow(this);    
//포인터로 생성하면 생략 가능 wxAuiManager* m_mgr = new wxAuiManager(this);

2. Pane을 추가 한다. ( m_panel 멤버변수를 별도로 가지고 있을   필요는없다. 여기서는 제어를 위해서 가지고 있다. )
m_panel = new DebugPanel( this );
m_mgr.AddPane(m_panel, wxLEFT, wxT("Debug Window"));

3. 업데이트 (도킹 wxPanel을 추가하면 wxAuiManager를 업데이트 한다)
m_mgr.Update();

4. 소멸 : wxFrame 소멸시 UnInit() 해준다.
m_mgr.UnInit();

//MyFrame.cpp

#include "MyFrame.h"

 

MyFrame::MyFrame( wxWindow* parent )

: MainFrame(parent, wxID_ANY, wxT("Hello World!!"),

                                wxDefaultPosition, wxSize(700, 700),

                                wxDEFAULT_FRAME_STYLE | wxSUNKEN_BORDER )

{

    //WxWidget의 버그인듯 (WxWidget 2.9.1 버전에서 )

    //wxanel을 한개만 출력하는 경우 wxFrame::Show()를 나중에 하면 출력되지 않는다.

    //wxPanel을 두개 이상인 경우 wxFrame::Show()을 AUI 생성, 초기화 후에도 정상적으로 그려진다.P

    this->Show(true);

 

    //AUI init

    m_mgr.SetManagedWindow(this);

    m_panel = new DebugPanel( this );

    m_mgr.AddPane(m_panel, wxLEFT, wxT("Debug Window"));

    m_mgr.Update();

}

 

MyFrame::~MyFrame()

{

    m_mgr.UnInit();   

}

버그인가??

위의 소스에서 wxPanel을 추가하기 전에 wxFrame을 Show() 해주고 있다.
wxPanel이 하나만 추가되는 경우 wxFrame::Show() 하지 않으면 페널이 렌더링 되지 않는다.
wxPanel이 2개 이상인 경우 정상적으로 렌더링 된다.
wxPanel이 하나만 추가되는 경우에도 wxFrame::Show()를 미리 해주면 제대로 렌더링 된다.

다운로드: WxTest02.zip