MFC之设置Windows大小

CWnd::SetWindowPos

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

返回值:如果函数成功,则返回非零值;否则返回0。

参数:
pWndInsertAfter标识了在Z轴次序上位于这个CWnd对象之前的CWnd对象。这个参数可以是指向CWnd对象的指针,也可以是指向下列值的指针:
wndBottom将窗口放在Z轴次序的底部。如果这个CWnd是一个顶层窗口,则窗口将失去它的顶层状态;系统将这个窗口放在其它所有窗口的底部。
wndTop将窗口放在Z轴次序的顶部。
wndTopMost将窗口放在所有非顶层窗口的上面。这个窗口将保持它的顶层位置,即使它失去了活动状态。
wndNoTopMost将窗口重新定位到所有非顶层窗口的顶部(这意味着在所有的顶层窗口之下)。这个标志对那些已经是非顶层窗口的窗口没有作用。
有关这个函数以及这些参数的使用规则参见说明部分。

x指定了窗口左边的新位置。
y指定了窗口顶部的新位置。
cx指定了窗口的新宽度。
cy指定了窗口的新高度。
nFlags指定了大小和位置选项。这个参数可以是下列值的组合:
SWP_DRAWFRAME围绕窗口画出边框(在创建窗口的时候定义)。
SWP_FRAMECHANGED向窗口发送一条WM_NCCALCSIZE消息,即使窗口的大小不会改变。如果没有指定这个标志,则仅当窗口的大小发生变化时才发送WM_NCCALCSIZE消息。
SWP_HIDEWINDOW隐藏窗口。
SWP_NOACTIVATE不激活窗口。如果没有设置这个标志,则窗口将被激活并移动到顶层或非顶层窗口组(依赖于pWndInsertAfter参数的设置)的顶部。
SWP_NOCOPYBITS废弃这个客户区的内容。如果没有指定这个参数,则客户区的有效内容将被保存,并在窗口的大小或位置改变以后被拷贝回客户区。
SWP_NOMOVE保持当前的位置(忽略x和y参数)。
SWP_NOOWNERZORDER不改变拥有者窗口在Z轴次序上的位置。
SWP_NOREDRAW不重画变化。如果设置了这个标志,则不发生任何种类的变化。这适用于客户区、非客户区(包括标题和滚动条)以及被移动窗口覆盖的父窗口的任何部分。当这个标志被设置的时候,应用程序必须明确地无效或重画要重画的窗口和父窗口的任何部分。
SWP_NOREPOSITION与SWP_NOOWNERZORDER相同。
SWP_NOSENDCHANGING防止窗口接收WM_WINDOWPOSCHANGING消息。
SWP_NOSIZE保持当前的大小(忽略cx和cy参数)。
SWP_NOZORDER保持当前的次序(忽略pWndInsertAfter)。
SWP_SHOWWINDOW显示窗口。

说明:
调用这个成员函数以改变子窗口、弹出窗口和顶层窗口的大小、位置和Z轴次序。
窗口在屏幕上按照它们的Z轴次序排序。在Z轴次序上处于顶端的窗口将程序在所有其它窗口的顶部。
子窗口的所有坐标都是客户坐标(相对于父窗口客户区的左上角)。
窗口可以被移动到Z轴次序的顶部,既可以通过将pWndInsertAfter参数设为&wndTopMost,并确保没有设置SWP_NOZORDER标志,也可以通过设置窗口的Z轴次序使它位于所有现存的顶层窗口上方。当一个非顶层窗口被设为顶层窗口时,它拥有的窗口也被设为顶层的。它的拥有者不发生变化。
如果顶层窗口被重新定位到Z轴次序的底部(&wndBottom)或任何非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被变为非顶层窗口时,它所有的拥有者和它拥有的所有窗口都被变为非顶层窗口。
如果既没有指定SWP_NOACTIVE标志也没有指定SWP_NOZORDER标志(这意味着应用程序要求窗口被同时激活并放入指定的Z轴次序),则pWndInsertAfter参数中指定的值将只在下列环境下适用:
·在pWndInsertAfter参数中既没有指定&wndTopMost也没有指定&wndNoTopMost。
·这个窗口不是活动窗口。
应用程序不能激活一个非活动窗口但同时又不把它带到Z轴次序的顶部。应用程序可以没有任何限制地改变活动窗口的Z轴次序。
非顶层窗口可能拥有一个顶层窗口,但是反之则不成立。任何被顶层窗口拥有的窗口(例如对话框)都将自己变为顶层窗口,以确保所有被拥有的窗口位于它们的拥有者上方。
在Windows 3.1或更新的版本中,可以将窗口移动到Z轴次序的顶部,并通过设置它们的WS_EX_TOPMOST风格而将之锁定在那里。这种顶层窗口即使在失去活动状态以后也会保持顶层位置。例如,选择WinHelp的Always On Top命令会使帮助窗口变为顶层,并且在你返回应用程序之后它还保持可见。
要创建一个顶层窗口,应在调用SetWindowPos的时候将pWndInsertAfter参数设为&wndTopMost,或者在创建窗口的时候设置WS_EX_TOPMOST风格。
如果Z轴次序中包含了任何具有WS_EX_TOPMOST风格的窗口,则用&wndTopMost移动的窗口将被放到所有非顶层窗口的顶部,但是位于任何顶层窗口的下面。当应用程序激活一个不具有WS_EX_TOPMOST风格的非活动窗口时,该窗口将被移动到所有非顶层窗口的上方,但是位于所有顶层窗口的下方。
如果在调用SetWindowPos的时候pWndInsertAfter参数被设为&wndBottom,并且CWnd是一个顶层窗口,则该窗口失去顶层状态(WS_EX_BOTTOM风格被清除),并且系统将窗口放在Z轴次序的底部。

请参阅:::DeferWindowPos, ::SetWindowPos 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC是一个使用C++编写的微软基础类库,用于开发Windows应用程序。在MFC中,设置窗口和控件的大小自适应也是非常简单的。 首先,我们可以使用Visual Studio自带的可视化设计工具,在设计窗口和控件时,将控件的Anchor属性设置为合适的值。Anchor属性可以在属性窗口中找到,它用于指定控件与窗口的哪些边框保持相对位置不变,哪些可以拉伸变化。 如果不使用可视化设计工具,可以在窗口初始化时通过代码设置控件的位置和大小,同时利用MFC提供的SizeToContent函数,设置窗口的尺寸自适应控件的大小。以下是一段示例代码: ``` BOOL CMyDlg::OnInitDialog() { … m_btnOK.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); SizeToContent(); … } void CMyDlg::SizeToContent() { CRect rectClient, rectWindow; GetClientRect(&rectClient); GetWindowRect(&rectWindow); int nWidthDiff = rectWindow.Width() - rectClient.Width(); int nHeightDiff = rectWindow.Height() - rectClient.Height(); CRect rectNewWindow; rectNewWindow.left = rectWindow.left; rectNewWindow.top = rectWindow.top; rectNewWindow.right = rectNewWindow.left + m_btnOK.GetWindowRect().Width() + nWidthDiff; rectNewWindow.bottom = rectNewWindow.top + m_btnOK.GetWindowRect().Height() + nHeightDiff; SetWindowPos(NULL, 0, 0, rectNewWindow.Width(), rectNewWindow.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } ``` 以上就是利用MFC设置窗口控件大小自适应的方法,具体实现可以根据实际情况进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值