最近需要把一个MFC对话框程序嵌进QT界面中,MFC对话框中有许多下拉框控件。当QT界面大小发生变化时,MFC界面也会相应的作自适应。但结果就是,下拉框全部拉不下来。
造成这个现象的原因就是,在写自适应的时候我们改变了下拉框的高度,实际上是不能改变的。网上也没有可靠的解决方法。
我的做法就是,遍历控件改变他的位置,如果遇到下拉框就只改变其宽度,不改变其高度。
看代码:
- 先定义一个成员变量,在初始化时保存对话框原始大小。
//保存原对话框大小
CRect m_rect;
//初在始化中
GetClientRect(&m_rect);
- 改变控件大小和位置的函数,传入 控件指针,新的宽度,新的高度,将在onSize()中被调用。
void CMyDialog::changeControlSize( CWnd* pWnd, int x, int y )
{
if(pWnd != NULL)
{
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
//保存原高度,供下拉框使用
int height = rect.Height();
rect.left = rect.left*x /m_rect.Width();
rect.top = rect.top*y /m_rect.Height();
rect.right = rect.right*x /m_rect.Width();
rect.bottom = rect.bottom*y /m_rect.Height();
//如果是下拉框,则不改变其高度
TCHAR szClass[65] = {0};
if (GetClassName(pWnd->m_hWnd, szClass, 64) && _tcsicmp(szClass, _T("COMBOBOX")) == 0)
{
pWnd->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), height, SWP_NOZORDER | SWP_SHOWWINDOW);
}
else
pWnd->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER | SWP_SHOWWINDOW);
}
}
- 在OnSize中调用,遍历子控件
void CMyDialog::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (nType != SIZE_MINIMIZED) { CWnd *pWnd = GetWindow(GW_CHILD); while(pWnd) { changeControlSize(pWnd, cx, cy); pWnd = pWnd->GetNextWindow(); } //重新获取界面大小 GetClientRect(&m_rect); } // TODO: 在此处添加消息处理程序代码 }