对话框的伸缩功能

当用户单击“收缩<<”按钮后,将对话框的下半部分切除,并将按钮的文本改为“扩展>>”;当用户再次单击该“扩展>>”按钮后,还原为完整的对话框;

1、先给这个按钮添加命令响应函数,首先实现单击按钮后按钮文本改变的功能

    

void CTestDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    CString str;
    GetDlgItemText(IDC_BUTTON1,str);
    if(str=="收缩<<"){
        SetDlgItemText(IDC_BUTTON1,"扩展>>");
    }else{
        SetDlgItemText(IDC_BUTTON1,"收缩<<");
    }
}

2、在资源窗口中利用图像控件为对话框添加一条分割线,将其ID改为IDC_SEPARATOR,将其样式选中“凹陷”;

  

3、利用GetWindowRect函数获取对话框的原始位置;当切除分割线以下部分时,对话框的左上角坐标位置和宽度并未改变,变化的只是对话框的右下角的纵坐标;利用GetWindowRect函数获取分割线的大小和坐标位置,而分割线的右下角纵坐标即为收缩后的对话框的右下角坐标; 

void CTestDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    CString str;
    GetDlgItemText(IDC_BUTTON1,str);
    if(str=="收缩<<"){
        SetDlgItemText(IDC_BUTTON1,"扩展>>");
    }else{
        SetDlgItemText(IDC_BUTTON1,"收缩<<");
    }

    static CRect rectLarge;  //用于保存对话框的原始尺寸
    static CRect rectSmall;  //用于保存对话框收缩后的尺寸
    if(rectLarge.IsRectEmpty()){  //判断对话框的原始尺寸是否已被赋值
        CRect rectSeparator;
        GetWindowRect(&rectLarge);  //获取对话框的原始尺寸
        GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);  //获取分割线的位置坐标
        rectSmall.left=rectLarge.left;
        rectSmall.top=rectLarge.top;
        rectSmall.right=rectLarge.right;
        rectSmall.bottom=rectSeparator.bottom;  //对话框收缩后的右下角纵坐标即为分割线的右下角坐标
    }
    if(str=="收缩<<"){
        SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
    }else{
        SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);
    }
    
}

  SetWindowPos:设置窗口的位置和大小;

  BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

  pWndInsertAfter:设置当前窗口在Z轴上的位置

  x,y:窗口左上角的x,y坐标

  cx,cy:窗口的宽度和高度

  nFlags:设定窗口的尺寸和Z轴位置;SWP_NOMOVE:维持窗口当前位置,忽略x,y参数;SWP_NOZORDER:维持窗口当前的Z轴位置,忽略pWndInsertAfter参数;

原文地址:https://www.cnblogs.com/zhouwanqiu/p/6918807.html