改变窗口大小位置

时间:2023-01-13 03:48:47

关键函数:

GetWindowRect(LPRECT)

GetClientRect(LPRECT)

ScreenToClient(LPRECT)

MoveWindow(LPRECT)

(注:这里四个函数的参数既可以是CRect,也可以是CRect*)

 

CWnd::GetWindowRect() 的作用是获取CWnd 窗口的坐标位置,这个位置是以屏幕左上角为原点。(顺便说一下,在窗口OnInitDialog 函数执行的时候,窗口的左上角是与屏幕左上角相重合的,在OnInitDialog 执行结束之后才被移动到屏幕*并显示。)

 

CWnd::GetClientRect() 的作用也是获取CWnd 窗口的坐标位置,但是这个位置是以该CWnd 窗口自己的客户区(不包括框架)左上角为原点,也就是说用这个函数获取的CRect 的left 和top 都一定是0.

用上面两个函数获取到了窗口的坐标CRect 之后、可以通过对CRect 的top、left、right、bottom 进行修改来设置一个想要的窗口的大小与位置。最后用MoveWindow() 函数就可以把窗口移动到新的CRect 指定的矩形区里去、并改变大小了。

假设现在有一个CDialog m_ChildDlg,则可以 m_ChildDlg.MoveWindow(rect); 注意,这里面的rect 必须是以m_ChildDlg 的父窗口为参照系的坐标位置。如果m_ChildDlg 没有父窗口,那么屏幕桌面就是它的父窗口。这时可以直接 m_ChildDlg.GetWindowRect(rect); 再m_ChildDlg.MoveWindow(rect);

但如果m_ChildDlg 有自己的父窗口呢?分两种情况:

1、m_ChildDlg 的左上角顶点坐标与其父窗口的客户区的左上角顶点坐标重合。这时可以m_ChildDlg.GetClientRect(rect); 再m_ChildDlg.MoveWindow(rect);

2、否则。假设其父窗口是CDialog m_PDlg,这时必须m_ChildDlg.GetWindowRect(rect); 然后m_PDlg.ScreenToClient(rect); 最后才能m_ChildDlg.MoveWindow(rect);

如果MoveWindow之后,界面上显示有问题,不妨试一下InvalidateRect(rect);//添加重绘区。

 UpdateWindow(); //发送并立即处理WM_PAINT,使重绘区重画。