MFC控件随对话框放大自动适应(ListCtrl和Combox)

1.头文件申明变量和函数

BOOL change_flag;
CRect m_rect;
void ChangeSize(UINT nID, int x, int y);

2.在OnInitDialog()添加如下代码

ShowWindow(SW_SHOWMAXIMIZED);//进入界面就将界面最大化
GetClientRect(&m_rect);//获取客户界面的尺寸

3.源文件代码

void CFormModelDlg::ChangeSize(UINT nID, int x, int y)  //nID为控件ID,x,y分别为对话框的当前长和宽
{
    CWnd *pWnd;
    pWnd=GetDlgItem(nID); 
       if(pWnd!=NULL)     //判断是否为空,因为在窗口创建的时候也会调用OnSize函数,但是此时各个控件还没有创建,Pwnd为空 
       {
           if(nID == IDC_COMBO1)//当对应的是combox时,会导致变化高度之后,无法进行下拉,所以需要添加   ”+150“
           {
               CRect rec; 
               pWnd->GetWindowRect(&rec);  //获取控件变化前的大小
               ScreenToClient(&rec);   //将控件大小装换位在对话框中的区域坐标
               rec.left=rec.left*x/m_rect.Width();  //按照比例调整空间的新位置
               rec.top=rec.top*y/m_rect.Height();
               rec.bottom=rec.bottom*y/m_rect.Height()+150;
               rec.right=rec.right*x/m_rect.Width();
               pWnd->MoveWindow(rec);   //伸缩控件
           }
           else//除了combox之外的控件,不需要增加高度
           {
               CRect rec; 
               pWnd->GetWindowRect(&rec);  //获取控件变化前的大小
               ScreenToClient(&rec);   //将控件大小装换位在对话框中的区域坐标
               rec.left=rec.left*x/m_rect.Width();  //按照比例调整空间的新位置
               rec.top=rec.top*y/m_rect.Height();
               rec.bottom=rec.bottom*y/m_rect.Height();
               rec.right=rec.right*x/m_rect.Width();
               pWnd->MoveWindow(rec);   //伸缩控件
           }
       }
}

void CFormModelDlg::OnSize(UINT nType, int cx, int cy) 
{
    CDialog::OnSize(nType, cx, cy);
    // TODO: Add your message handler code here
    if(nType!=SIZE_MINIMIZED)//如果确定oninitdlg已经调用完毕
    {

//获取界面上的所有控件ID
        HWND  hwndChild=::GetWindow(m_hWnd,GW_CHILD); 
        int nID= 0;  
        while(hwndChild)  
        {
            nID=::GetDlgCtrlID(hwndChild);  //获取控件ID
            ChangeSize(nID,cx,cy); 
            hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
        }
        GetClientRect(&m_rect); 


        if (change_flag==TRUE)//如果是初始化,还未初始化listctrl控件,所以只有等listctrl控件初始化之后才可以进行column宽度的重新修改
        {
            CRect rect1;
            m_ListSpe.GetWindowRect(&rect1);
            int iw1=rect1.Width()-50;
            m_ListSpe.SetColumnWidth(0,iw1/6-8);
            m_ListSpe.SetColumnWidth(1,iw1/3);
            m_ListSpe.SetColumnWidth(2,50);
            m_ListSpe.SetColumnWidth(3,iw1/2);
        }
        else
        {
            change_flag=TRUE;
        }
    }
    
}

猜你喜欢

转载自blog.csdn.net/Hat_man_/article/details/109822959
今日推荐