MFC 对话框控件随窗口变化位置大小

1.对话框头文件中定义:

CRect m_DlgRect;//存储对话框改变前大小,以供计算控件相应位置及大小时使用  
void repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height);

2.对话框源文件中实现:

void TestDlg::repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height)//更新控件位置和大小函数,可以根据需要自行修改  
{
    CRect rect;
    CWnd *wnd = NULL;
    wnd = GetDlgItem(id);
    if (NULL == wnd)
    {
        MessageBox(_T("相应控件不存在"));
    }
    wnd->GetWindowRect(&rect);
    ScreenToClient(&rect);

    
    rect.left = (long)((double)rect.left / (double)last_Width*(double)now_Width);
    rect.right = (long)((double)rect.right / (double)last_Width*(double)now_Width);
    rect.top = (long)((double)rect.top / (double)last_Height*(double)now_Height);
    rect.bottom = (long)((double)rect.bottom / (double)last_Height*(double)now_Height);
    wnd->MoveWindow(&rect);
}

3.Ctrl+Shift+x打开类向导,实现WM_SIZE消息
4.在OnSize里调用repait函数

void TestDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);

    if (0 == m_DlgRect.left && 0 == m_DlgRect.right
        && 0 == m_DlgRect.top && 0 == m_DlgRect.bottom)//第一次启动对话框时的大小变化不做处理  
    {
    }
    else
    {
        if (0 == cx && 0 == cy)//如果是按下了最小化,则触发条件,这时不保存对话框数据  
        {
            return;
        }
        BOOL bWindowMaxFlag = FALSE;
        CRect rectDlgChangeSize;
        GetClientRect(&rectDlgChangeSize);//存储对话框大小改变后对话框大小数据  
        repaint(IDC_RICHEDIT21, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());//重绘函数,用以更新对话框上控件的位置和大小  

    }
    GetClientRect(&m_DlgRect); //save size of dialog  
    Invalidate();//更新窗口  
}

···

你可能感兴趣的:(MFC 对话框控件随窗口变化位置大小)