窗口位置、大小设置

一:SetWindowPos设置整个对话框的大小(包括非客户区)和位置

BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

理解:参数pWndInsertAfter决定窗口位于那一层,是在顶层还是在底层,窗口位置由点(x,y)决定,窗口宽高由cx,cy决定。参数nFlags决定进行不同的操作,如SWP_NOMOVE是忽略(x,y)的作用,即位置由系统决定,而不由(x,y)决定。而SWP_NOSIZE是忽略cx,cy的作用,即窗口的宽高由系统决定,而不由cx,cy决定。等等...。

实验源码(在OnInitDialog函数中添加代码):

SetWindowPos(NULL,0,0,500,500,SWP_SHOWWINDOW );	
CRect rect;
GetWindowRect(&rect);
CString str;
str.Format(_T("point:(%d,%d),width:%d,height:%d"),rect.left,rect.top,rect.Width(),rect.Height());
MessageBox(str);
弹出对话框显示:

窗口位置、大小设置_第1张图片

二:设置客户区的大小(将客户区宽高设置为512,512)

实验(在OnInitDialog中添加源码)

CRect rectWindow;
GetWindowRect(&rectWindow);
CRect rectClient;
GetClientRect(&rectClient);
int cx=512+rectWindow.Width()-rectClient.Width();
int cy=512+rectWindow.Height()-rectClient.Height();
SetWindowPos(NULL,0,0,cx,cy,SWP_NOMOVE);	
GetWindowRect(&rectWindow);
CString str;
str.Format(_T("point:(%d,%d),width:%d,height:%d"),\
	rectWindow.left,rectWindow.top,rectWindow.Width(),rectWindow.Height());
MessageBox(str);
GetClientRect(&rectClient);
str.Format(_T("point:(%d,%d),width:%d,height:%d"),\
	rectClient.left,rectClient.top,rectClient.Width(),rectClient.Height());
MessageBox(str);
运行结果:

窗口位置、大小设置_第2张图片

窗口位置、大小设置_第3张图片

三:GetWindowRect与GetClientRect分别用于获取窗口大小和客户区大小。

注意:GetWindowRect获取是屏幕左上角为原点建立的坐标系给出坐标。而GetClientRect是以客户区左上角为原点建立的坐标系给出的坐标。

使用函数ScreenToClient可以将GetWindowRect获取的坐标转换为以客户区左上角为原点建立的坐标系给出的坐标。

使用函数ClientToScreen可以将GetClientRect获取的坐标转换为屏幕左上角为原点建立的坐标系给出的坐标。

四:窗口居中显示

实验代码(在OnInitDialog函数中添加代码):

SetWindowPos(NULL,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);    
int cx=GetSystemMetrics(SM_CXSCREEN);
int cy=GetSystemMetrics(SM_CYSCREEN);
CRect rectWindow;
GetWindowRect(&rectWindow);
SetWindowPos(NULL,(cx-rectWindow.Width())/2,(cy-rectWindow.Height())/2,\
	0,0,SWP_NOSIZE|SWP_SHOWWINDOW);
为了测试效果,第一行代码的作用是将窗口移到了屏幕的左上角。余下代码的作用是将窗口居中显示。


你可能感兴趣的:(MFC)