正文

抽屉菜单的简单实现2006-12-09 16:47:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/21418.html

分享到:

看到 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();

       }

}

 

 

完成!值得干一杯了!当然你还可以优化一下界面!

阅读(4911) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册