在DELPHI和.NET的可视化设计中,利用Splitter和Panel可以实现控件的分组和布局控制,在WTL中提供了SplitterWindow对于对话框程序非常方便,而提供的CPaneContainer只能容纳一个控件,不能达到完全可视化的目的.
WINXGUI提供了嵌入对话框设计的方式,本文的PANE控制就是基于WINXGUI实现的.实际上在WTL中也可以实现类似控制,但是用WINXGUI实现起来尤其方便,并且WINXGUI本身支持可视化设计. 参见http://winxgui.com
利用WINGUI的子类化技术,可以实现PANE控制,利用类似WINGUI设计的宏可以简化设计,利用WTL的SplitterWindow可以实现窗口分割控制.这样通过Spliter和Pane可以在VS6.0的对话框上直接进行设计,其中Splitter控制可以使用StaticText控件占位生成或直接动态生成,而Pane可以直接子类化StaticText控件.
一个应用例子: 需要使用WINXGUI.
代码下载请见http://www.winxgui.com/forum/viewthread.php?tid=4&extra=page%3D1
WTL::CHorSplitterWindowEx m_left;
int OnInitDialog(HWND hWnd, HWND wParam)
... {
CenterWindow();
m_left.CreateFromID(m_hWnd,IDC_LEFT);
m_left.SetSplitterPos(100);
WINX_PANE_BEGIN(IDC_PANE2)
WINX_PANEITEM(IDC_MY_EDIT,PANE_SIZE_X|PANE_SIZE_Y)
WINX_PANE_END();
WINX_PANE_BEGIN(IDC_PANE1)
WINX_PANEACCEL(IDR_ACCELERATOR)
WINX_PANEITEM(IDC_HELP_BTN,PANE_MOVE_X)
WINX_PANEITEM(IDC_HIDE_BTN,PANE_MOVE_X)
WINX_PANE_END();
WINX_PANE_BEGIN(IDC_PANE3)
WINX_PANEACCEL(IDR_ACCELERATOR)
WINX_PANEITEM(IDOK,0)
WINX_PANEITEM(IDCANCEL,0)
WINX_PANEITEM(IDC_ABOUT,PANE_MOVE_Y)
WINX_PANE_END();
CWindow pane1 = GetDlgItem(IDC_PANE1);
pane1.SetParent(m_left);
CWindow pane2 = GetDlgItem(IDC_PANE2);
pane2.SetParent(m_left);
m_left.SetSplitterPanes(pane1,pane2);
return 0;
}
int OnInitDialog(HWND hWnd, HWND wParam)
... {
CenterWindow();
m_left.CreateFromID(m_hWnd,IDC_LEFT);
m_left.SetSplitterPos(100);
WINX_PANE_BEGIN(IDC_PANE2)
WINX_PANEITEM(IDC_MY_EDIT,PANE_SIZE_X|PANE_SIZE_Y)
WINX_PANE_END();
WINX_PANE_BEGIN(IDC_PANE1)
WINX_PANEACCEL(IDR_ACCELERATOR)
WINX_PANEITEM(IDC_HELP_BTN,PANE_MOVE_X)
WINX_PANEITEM(IDC_HIDE_BTN,PANE_MOVE_X)
WINX_PANE_END();
WINX_PANE_BEGIN(IDC_PANE3)
WINX_PANEACCEL(IDR_ACCELERATOR)
WINX_PANEITEM(IDOK,0)
WINX_PANEITEM(IDCANCEL,0)
WINX_PANEITEM(IDC_ABOUT,PANE_MOVE_Y)
WINX_PANE_END();
CWindow pane1 = GetDlgItem(IDC_PANE1);
pane1.SetParent(m_left);
CWindow pane2 = GetDlgItem(IDC_PANE2);
pane2.SetParent(m_left);
m_left.SetSplitterPanes(pane1,pane2);
return 0;
}
PANE的源代码
//
winx使用子类化(Subclass)技术实现Pane控制
// by QWL1996@GMAIL.COM
// by QWL1996@GMAIL.COM