看到 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(); } } 完成!值得干一杯了!当然你还可以优化一下界面!

评论