动态改变对话框的位置和大小

  想要动态改变对话框的大小就要先了解几个函数了:CWnd::SetWindowPos,API函数SetWindowPos,和CWnd::MoveWindow。

函数原型:

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

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

  void CWnd::MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint ); 

这三个函数的作用是类似的,参数的意义也基本相同,

CWnd* 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 显示窗口。

而API函数SetWindowPos的第一个参数HWND hWnd是指一个窗口句柄。

他们的用法还是举例来说:

 

 1 //首先创建一个对话框,是一个对话框类
 2 m_prectTranDlg = new CRectTranDlg;
 3 m_prectTranDlg->Create(IDD_DLG_RECT,this);
 4 m_prectTranDlg->ShowWindow(SW_SHOW);
 5 
 6 CWnd *pWnd;
 7 //pWnd = FromHandle(GetWindow(m_hWnd,GW_CHILD));//第一种获取窗口指针的方法,根据窗口句柄来获取
 8 //pWnd = FindWindow(NULL,_T("子窗口"));//第二种获取窗口指针的方法,根据窗口的标题来获取,其中“子窗口”就是该窗口的标题
 9 pWnd = GetActiveWindow();//第三种获取窗口指针的方法,获取活动窗口的窗口指针.该函数可以获得与调用线程的消息队列相关的活动窗口的窗口句柄
10 
11 CRect rect0;
12 GetParent()->GetWindowRect(&rect0);//获取父窗口相对整个屏幕的位置坐标
13 //pWnd->SetWindowPos(NULL,rect0.left+20,rect0.top+50,200,20,SWP_NOZORDER);//第一种改变窗口位置和大小的方法,这里的位置加了,意思是以父对话框的左顶点为原点,x为20,y为50,下同
14 //::SetWindowPos(m_hWnd,HWND_TOP,rect0+20,rect0.top+50,200,20,0);//第二种改变窗口位置和大小的方法
15 MoveWindow(rect0+20,rect0.top+50,200,20);//第三种改变窗口位置和大小的方法

 

因为窗口在改变其位置和大小的时候会自己发出一个WM_PAINT消息,所以不需要添加Invalidate()进行重画。

 

转载于:https://www.cnblogs.com/huxiaoyingying/p/3233460.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值