【MFC】解决窗口大小改变之后ComboBox下拉框消失问题

当窗口大小改变时,若在代码中重新改变ComboBox组件大小而没有修改下拉框高度,就会出现下拉框消失的问题。
图1-1 窗口大小改变前,下拉框正常显示

图1-1 窗口大小改变前,下拉框正常显示

图1-2 窗口大小改变后,下拉框内容消失

图1-2 窗口大小改变后,下拉框内容消失

问题原因: 控件大小改变之后没有动态修改下拉框大小。

解决办法:

窗口改变之后,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 显示窗口
}

图1-3 改变大小后,下拉框正常显示

图1-3 改变大小后,下拉框正常显示
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值