看到 QQ的抽屉,也想自己做一个,于是做了个最简单的,界面如图所示
这是一个基于对话框的程序,有3个按钮,有4个对话框,1个是主窗口,还有3个是子窗口,因此需要3个对话框的资源风格为: “下层,对话框架“
下面是具体设计过程:
1.给3个子窗口(对话框)分别派生一个对话框类,名为Cmydlg1,Cmydlg2,Cmydlg3;
2.在 Cmydlg (主窗口) 中添加成员:
Cmydlg1 *dlg1;
Cmydlg2 *dlg2;
Cmydlg3 *dlg3;
int m_left; // 按钮的左边坐标
int m_right; // 按钮的右边坐标
int m_buttonHeight;// 按钮的高度
int m_buttonWidth; // 按钮的宽度
int m_dlgHeight; // 子对话框的高度,而宽度与按钮应该相同
CButton m_button[3]; // 3个按钮,下面会动态创建
3.初始化
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……….
dlg1=new Cmydlg1;
dlg2=new Cmydlg2;
dlg3=new Cmydlg3;
// 创建3个按钮,注意它的位置
for(int i=0;i<3;i++)
{
m_button[i].Create("hehe",WS_CHILD|WS_VISIBLE, \
CRect(m_left,m_buttonHeight*i,m_right,m_buttonHeight* (i+1)),this,IDC_BUTTON+i);
}
// 创建非模态窗口(即充当子窗口)
dlg1->Create(IDD_DIALOG1,this);
dlg2->Create(IDD_DIALOG2,this);
dlg3->Create(IDD_DIALOG3,this);
// 首先移动3个子窗口的位置,以后都不用再移动了,只需要显示或者不显示
dlg1->MoveWindow(m_left,m_buttonHeight,m_buttonWidth,m_dlgHeight);
dlg2->MoveWindow(m_left,m_buttonHeight*2,m_buttonWidth,m_dlgHeight);
dlg3->MoveWindow(m_left,m_buttonHeight*3,m_buttonWidth,m_dlgHeight);
// 成员函数
show(0);
return TRUE; // return TRUE unless you set the focus to a control
}
4.显示函数
void CMyDlg::show(int index)
{
dlg1->ShowWindow(! (index-0)); // 判断是显示哪个窗体
dlg2->ShowWindow(! (index-1));
dlg3->ShowWindow(! (index-2));
// 显示窗体以后就要移动相应按钮的位置,处理一下几何位置关系,不细说了
for(int i=0;i<=index;i++)
{
m_button[i].MoveWindow( m_left, m_buttonHeight*i,m_buttonWidth,
m_buttonHeight );
}
for(i=index+1;i<3;i++)
{
m_button[i].MoveWindow( m_left,m_buttonHeight*i+m_dlgHeight,m_buttonWidth,m_buttonHeight );
}
}
5.添加按钮的消息映射
.h :
// Generated message map functions
//{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
afx_msg void OnClick(UINT nID);
.cpp:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_BUTTON+0,IDC_BUTTON+2,OnClick)
END_MESSAGE_MAP()
6. 消息响应
void CMyDlg::OnClick(UINT nID)
{
int index=nID-IDC_BUTTON;
show(index);
}
7.画边框
void CMyDlg::OnPaint()
{
。。。。。。。。。
CPaintDC dc(this);
CBrush brush(RGB(255,0,0));
dc.FrameRect(CRect(m_left-1,-1,m_right+1,m_buttonHeight*3+m_dlgHeight+1),&brush);
CDialog::OnPaint();
}
}
完成!值得干一杯了!当然你还可以优化一下界面!
评论