当窗口大小改变时,若在代码中重新改变ComboBox组件大小而没有修改下拉框高度,就会出现下拉框消失的问题。
问题原因: 控件大小改变之后没有动态修改下拉框大小。
解决办法:
窗口改变之后,MFC框架调动 一下成员函数
afx_msg void OnSize(`
`UINT nType,`
`int cx,`
`int cy`
`);`
nType:窗口大小的类型,可以是以下值
SIZE_MAXIMIZED 窗口最大化。
SIZE_MINIMIZED 窗口最小化。
SIZE_RESTORED 除最大化和最小化之外的窗口变化大小
cx: 新窗口的宽度
cy:新窗口的高度
因此,在窗口大小改变之后,可以在 onSize函数中添加修改控件的方法。
代码如下:
void CTestAssistDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if(nType!=SIZE_MINIMIZED ) //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
{
ChangeSize(IDCANCEL6 ,cx,cy);
}
}
changeSize是用户自定义的函数,函数原型如下:
ChangeSize(UINT nID, int x, int y) //nID为控件ID,x,y分别为对话框的当前长和宽
修改ComboBox下拉框代码如下:
方法一:修改CRect类的bottom成员,再调用movewindow函数
void CTestAssistDlg::ChangeSize(UINT nID, int x, int y) //nID为控件ID,x,y分别为对话框的当前长和宽
{
CWnd *pWnd;
pWnd=GetDlgItem(nID);
if(pWnd!=NULL) //判断是否为空,因为在窗口创建的时候也会调用OnSize函数,但是此时各个控件还没有创建,Pwnd为空
{
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();
if(pWnd->IsKindOf(RUNTIME_CLASS(CComboBox))){//判断是否为ComboBox类型
rec.bottom = rec.bottom+100;//设置下拉框高度
}
pWnd->MoveWindow(rec); //伸缩控件
}
方法二:调用SetWindowPos 函数
函数原型:BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags );
hWnd:窗口句柄
hWndInsertAfter:窗口句柄,一般屏蔽这个参数
X:窗口左上角横坐标,客户端窗口坐标系
Y:窗口左上角纵坐标,客户端窗口坐标系
cx:窗口宽度
cy:窗口高度
uFlags:窗口大小和位置标志
void CTestAssistDlg::ChangeSize(UINT nID, int x, int y) //nID为控件ID,x,y分别为对话框的当前长和宽
{
CWnd *pWnd;
pWnd=GetDlgItem(nID);
if(pWnd!=NULL) //判断是否为空,因为在窗口创建的时候也会调用OnSize函数,但是此时各个控件还没有创建,Pwnd为空
{
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();
if(pWnd->IsKindOf(RUNTIME_CLASS(CComboBox))){
rec.bottom = rec.bottom+100;
}
pWnd->SetWindowPos(NULL, rec.left, rec.top, rec.Width(), rec.Height(), SWP_NOZORDER|SWP_SHOWWINDOW);//重新设置控件位置
//SWP_NOZORDER 忽略第二个参数hWndInsertAfter
//SWO_SHOWWINDOW 显示窗口
}