Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230481
  • 博文数量: 55
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 17:59
文章分类

全部博文(55)

文章存档

2015年(2)

2011年(1)

2010年(1)

2009年(18)

2008年(16)

2007年(17)

我的朋友

分类: C/C++

2009-04-03 14:57:41

   当对话框大小发生变化时,控件大小也应该随之发生变化,下面介绍如何实现这一功能。
   首先创建一个基于对话框的MFC工程,为了让对话框可以通过拖拽边框自由改变大小,需要设置对话框的属性。打开资源视图,在对话框上点右键,选择Properties->Styles->Border,在下拉框中选择Resizing,这样就可以动态改变对话框的大小了。
   接下来在对话框上放置一个按钮,我们要实现的功能就是在改变对话框大小时动态改变按钮的大小,使得按钮始终位于对话框的(x轴1/5,y轴1/5)处,并且按钮的宽和高分别为x、y轴的2/5。

      有两个函数可以实现这个功能:
      (1) MoveWindow():
              void MoveWindow(int x,int y,int nWidth,int nHeight);
              x, y为控件位置;nWidth、nHeight为控件宽度和高度
      (2) SetWindowPos():
              BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
              第一个参数一般设为NULL;
              x、y为控件位置;cx、cy为控件宽度和高度;
              nFlags常用取值:
                  SWP_NOZORDER:忽略第一个参数;
                  SWP_NOMOVE:忽略x、y,维持位置不变;
                  SWP_NOSIZE:忽略cx、cy,维持大小不变;
                  SWP_SHOWWINDOW:显示窗口

        下面分别介绍如何使用这两个函数:
        首先同时按下Ctrl+W,弹出类向导对话框,选择响应WM_SIZE消息。在消息响应函数OnSize()中添加如下代码:
        void COnSizeTestDlg::OnSize(UINT nType, int cx, int cy) 
        {
                 CDialog::OnSize(nType, cx, cy);
 
                 // TODO: Add your message handler code here
                 //创建对话框时,控件还没有创建,因此不能改变其大小(必须加上这两行代码)
                 if(!IsWindowVisible())
                     return;

 
                 //获取客户区矩形
                 CRect rect;
                 GetClientRect(&rect);
                 //动态改变控件大小
                 CWnd *pButton = GetDlgItem(IDC_BUTTON1);
                 pButton->MoveWindow(
                  rect.right/5, //x轴1/5处
                  rect.bottom/5, //y轴1/5处
                  rect.right/5*2, //x轴的2/5宽度
                  rect.bottom/5*2 //y轴的2/5高度
                  );
        }

        把MoveWindow()函数换成SetWindowPos():
                 pButton->SetWindowPos(
                    NULL,
                    rect.right/5,
                    rect.bottom/5,
                    rect.right/5*2,
                    rect.bottom/5*2,
                    SWP_NOZORDER|SWP_SHOWWINDOW
                  );
        效果一样。

阅读(3639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~