有时我们需要有一种容器,将一些控件如按钮编辑框等放在这个容器中,则只须移动这个容器,就容器内的控件就会跟着移动,当容器被隐藏时,容器内的控件也跟着隐藏.
实现方法是由CDialog类派生出一个容器类,将控件放入其中,再将这个容器加入到窗口中.
具体实现方法如下:
首先新建一个workspace,再新建一个对话框资源,ID设置为IDD_DIALOG_PANEL,将其OK和Cancel按钮删掉,就得到一个空白的对话框,这就是一会儿要用到的容器,你可以根据需要在其中加入各种容器,记得将Style标签的Style设置为Child,Border设置为None.
然后运行ClassWizard,会自动提示你新建一个对话框资源对应的类。不妨命名为Panel,继承自CDialog。
在TestPanelDlg.h中加入:
CDialog* m_pPanel;
CRect m_rectPanel;
m_rectPanel主要是用于确定m_Panel的位置。
在TestPanle.cpp中加入:
#include "Panel.h"
在你想创建容器的地方加入如下代码:
CRect rectMainToLefttop; //主窗口相对于屏幕左上角的位置
GetWindowRect(&rectMainToLefttop);
int nCaption = ::GetSystemMetrics(SM_CYCAPTION); //标题栏的高度
int nXEdge = ::GetSystemMetrics(SM_CXEDGE); //横向边距
int nYEdge = ::GetSystemMetrics(SM_CYEDGE); //纵向边距
CRect rectPanelToLefttop; //容器相对于屏幕左上角的位置
GetDlgItem(IDC_STATIC_POSITION )->GetWindowRect(&rectPanelToLefttop);
//计算主窗口有效区域(你从资源编辑器中看到的蓝色虚线框)相对于屏幕左上角的位置
rectMainToLefttop.top=rectMainToLefttop.top+nCaption+nYEdge;
rectMainToLefttop.left=rectMainToLefttop.left+2*nXEdge;
//计算容器相对于主窗口有效区域左上角的位置
m_rectPanel.top=rectPanelToLefttop.top-rectMainToLefttop.top;
m_rectPanel.left=rectPanelToLefttop.left-rectMainToLefttop.left;
m_rectPanel.bottom=rectPanelToLefttop.bottom-rectMainToLefttop.top;
m_rectPanel.right=rectPanelToLefttop.right-rectMainToLefttop.left;
//动态创建容器及其内容,并将其显示在指定位置
m_pPanel = new Panel;
m_pPanel->Create(IDD_DIALOG_PANEL, this);
m_pPanel->ShowWindow(SW_SHOW);
m_pPanel->MoveWindow(m_rectPanel);