如何让窗口最大化 并让控件跟随变化
2014-06-19 19:36
302 查看
让窗口最大化有2种方法
一,CWnd::ShowWindow(SW_SHOWMAXIMIZED);
二,先获取屏幕大小,然后更改窗口大小
要取得屏幕大小,可以用下面几个函数:
int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CYFULLSCREEN);
通过上边两个函数获取的是显示屏幕的大小,但不包括任务栏等区域。
int cx = GetSystemMetrics( SM_CXSCREEN );
int cy = GetSystemMetrics( SM_CYSCREEN );
这两个函数获取的是真正屏幕的大小。
要设置对话框的大小,可以如下实现:
CRect temprect(0,0,640,480);
CWnd::SetWindowPos(NULL,0,0,temprect.Width(),temprect.Height(),SWP_NOZORDER|SWP_NOMOVE);
让控件随窗口变化有以下方法:
1 首先要知道对话框大小是否改变,改变了多少,我们应该记录当前对话框的大小。
在对话框类中添加成员变量 CRect m_rect 他是用来记录当前对话框的大小。我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);
2 增加消息WM_SIZE的消息响应函数 OnSize():只要对话框大小发生变化,就会调用该函数。
3 在OnSize()函数中增加如下代码:
void CMyDlg::OnSize(UINT nType, int cx, int cy) //cx,cy就是当前对话框的长和宽
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType!=SIZE_MINIMIZED ) //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
{
ChangeSize(IDC_LIST1,cx,cy); //对每一个控件依次做调整
ChangeSize(IDC_LIST2,cx,cy);
ChangeSize(IDC_BUTTON1,cx,cy);
ChangeSize(IDC_BUTTON2,cx,cy);
GetClientRect(&m_rect); //最后要更新对话框的大小,当做下一次变化的旧坐标;
}
}
然后再手动添加一个函数,用以实现具体的变化
void CMyDlg::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();
pWnd->MoveWindow(rec); //伸缩控件
}
}
参考 http://blog.163.com/scuqifuguang@126/blog/static/171370086201232741358711/
http://blog.sina.com.cn/s/blog_4b5039210100dzkd.html
一,CWnd::ShowWindow(SW_SHOWMAXIMIZED);
二,先获取屏幕大小,然后更改窗口大小
要取得屏幕大小,可以用下面几个函数:
int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CYFULLSCREEN);
通过上边两个函数获取的是显示屏幕的大小,但不包括任务栏等区域。
int cx = GetSystemMetrics( SM_CXSCREEN );
int cy = GetSystemMetrics( SM_CYSCREEN );
这两个函数获取的是真正屏幕的大小。
要设置对话框的大小,可以如下实现:
CRect temprect(0,0,640,480);
CWnd::SetWindowPos(NULL,0,0,temprect.Width(),temprect.Height(),SWP_NOZORDER|SWP_NOMOVE);
让控件随窗口变化有以下方法:
1 首先要知道对话框大小是否改变,改变了多少,我们应该记录当前对话框的大小。
在对话框类中添加成员变量 CRect m_rect 他是用来记录当前对话框的大小。我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);
2 增加消息WM_SIZE的消息响应函数 OnSize():只要对话框大小发生变化,就会调用该函数。
3 在OnSize()函数中增加如下代码:
void CMyDlg::OnSize(UINT nType, int cx, int cy) //cx,cy就是当前对话框的长和宽
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType!=SIZE_MINIMIZED ) //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
{
ChangeSize(IDC_LIST1,cx,cy); //对每一个控件依次做调整
ChangeSize(IDC_LIST2,cx,cy);
ChangeSize(IDC_BUTTON1,cx,cy);
ChangeSize(IDC_BUTTON2,cx,cy);
GetClientRect(&m_rect); //最后要更新对话框的大小,当做下一次变化的旧坐标;
}
}
然后再手动添加一个函数,用以实现具体的变化
void CMyDlg::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();
pWnd->MoveWindow(rec); //伸缩控件
}
}
参考 http://blog.163.com/scuqifuguang@126/blog/static/171370086201232741358711/
http://blog.sina.com.cn/s/blog_4b5039210100dzkd.html
相关文章推荐
- QT中如何让控件跟随随窗口大小变化
- 浅谈 Qt 布局管理器 如何让控件随着窗口变化
- 包含tab控件时,,如何让子控件跟随对话框大小变化(补充)
- WPF如何让控件随着窗口大小而变化,布局不乱
- 包含tab控件时,,如何让子控件跟随对话框大小变化(上)
- VFP如何控制一个窗口的所有控件的大小随窗口的变化而变化
- delphi 窗口最大化后控件的大小变化怎么设置
- 包含tab控件时,,如何让子控件跟随对话框大小变化(下)
- 浅谈 Qt 布局管理器 如何让控件随着窗口变化
- 功能: Form窗口最大化时,控件相对位置变化的问题 (学习日记2016-12-23)
- WPF如何把图片Image控件设置成,当窗口的放大和缩小,跟随着一起变化
- 在CFormView中如何让对话框内的控件大小跟随单文档的大小变化
- 如何实现ScrolledComposite下 控件个数随着窗口大小自动变化
- 控件自适应窗口最大化后的位置变化
- 如何实现MFC窗口的最大化以及控件随最大化发生位置变动原因
- 主窗口大小发生变化(最大化、向下还原、手工手动)时,FormView中的控件等比例缩放
- login控件 登陆图片居右显示 登陆窗口不管分辨率,窗口如何变化,一直居中显示
- VC++之随父窗口变化调整控件大小
- 如何让窗口和 MDI窗口一启动就最大化和最小化?
- VC++之随父窗口变化调整控件大小 (没有位置)