对话框的收缩和扩展

下面我们完成一个功能,来完成对话框的收缩和扩展:

首先,我们在对话框上放一个按钮,文本为“收缩<<”当我们点击的时候,文本变为“扩展>>”:

CString str;
GetDlgItemText(IDC_BUTTON1,str);
if(str=="收缩<<")
{
 SetDlgItemText(IDC_BUTTON1,"扩展>>");

}
else
{
 SetDlgItemText(IDC_BUTTON1,"收缩<<");
}

然后,我们在窗口上添加一个分割符,这里我们可以用图像控件来代替,我们在窗口上把它拉成一条线,我们改变一下他的属性。ID改为IDC_SEPARATOR,然后把Styles选上SunKen(下沉),这样就会出现一个下陷的一个样子。我们要完成当我们点击这个按钮的时候我们就将图像下边的窗口切除掉。这时我们就需要保留2个坐标,一个是右下角的坐标,一个是切除的点的坐标。

 

首先我们定义2个点用来储存以上我们说的两个点的坐标。

static CRect rectLarge;
static CRect rectSmail;

 

首先我们要判断对话框的原始尺寸是否被赋值。

我们可以用CRect的成员函数来判断。

我们有两个函数可以判断

一个是IsRectEmpty() 它检测一个矩形区域是否为空,为空的条件:高度宽度为零的情况下

一个是IsRectNull() 它检测左上角的坐标和右下角的坐标都为0。这个矩形区域为空。

这两个不一样,我们看一下区别:

CRect rect1(0,0,0,0);

CRect rect2(35,35,35,35);

rect1.IsRectEmpty();//为空

rect2.IsRectEmpty;//为空

rect1.IsRectNull();//为空

rect2.IsRectNull();//不为空

 

 

获取对话框的原始尺寸,获取窗口的矩形区域,需要一个函数。

void GetWindowRect( LPRECT lpRect ) const;

参数,Rect结构体的一个指针。

 

我们定义两个静态的CRect对象,来储存收缩前后的矩形区域。

static CRect rectLarge;

static CRect rectSmall;

首先我们要判断一下rectLarge是否为空,即是否是第一次点击按钮。 我们用到一个函数判断矩形区域是否为空

如果为空,那么我们需要为它获取原始矩形的大小。并且给对象rectSmall赋值

if(rectLarge.IsRectEmpty)

{

  CRect rectSeparator;

  GetWindowRect(&rectLarge);

  GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);

  rectSmall.left=rectLarge.left;

  rectSmall.top=rectLarge.top;

  rectSmall.right=rectLarge.right;

  rectSmall.bottom=rectSeparator.bottom

}

接下来我们利用SetWindowPos来完成伸缩和扩展的功能。

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

第一个参数表示了一个CWnd对象,在Z次序,那么什么事Z次序呢?

窗口的Z次序表明了重叠窗口堆中窗口的位置,这个窗口堆是按一个假想的轴定位的。这个轴就是从屏幕向外伸展的Z轴。Z次序最上面的窗口覆盖所有其他的窗口,Z次序最下面的窗口,被其他所有窗口所覆盖,应用程序设置窗口在Z次序中的位置,是通过把它放在给定窗口的后边或者是窗口堆的顶部或者底部。

Windows系统管理的三个独立的Z次序----一个用于顶层窗口,一个用于兄弟窗口,还有一个是用于最顶层窗口。最顶层窗口覆盖所有非最顶层窗口,而不管他是否是活动窗口或者是前台窗口。

应用系统通过WS_EX_TOPMOST风格创建最顶层窗口。

一般情况下,Windows系统把刚刚创建的窗口放在Z次序的顶部,用户可以通过激活另外一个窗口来改变Z次序。Windows总是把活动的窗口放在Z次序的顶部。应用程序可以用BringWindowToTop把一个窗口放置到X次序的顶部。函数SetWindowPos和DeferWindowPos来重排Z次序。

 

兄弟窗口:

   共享同一个父窗口的多个子窗口叫兄弟窗口。

活动窗口:

   活动窗口是程序的顶层窗口,也就是当前使用的窗口。只有顶层窗口可以是活动窗口,如果用户使用的是一个子窗口,Windows系统就激活与这个子窗口响应的顶层窗口。

   任何时候系统中只能有一个顶层窗口是活动的。用户通过单击窗口(或其中的一个子窗口),使用ALT+TAB或ALT+ESC组合键来激活一个顶层窗口,应用程序则调用函数SetActiveWindow来激活一个顶层窗口

前台窗口和后台窗口:

   在Windows系统中,每一个进程可运行多个线程,每个线程都能创建窗口。创建正在使用窗口的线程称之为前台线程,这个窗口就被称为前台窗口。所有其他的线程都是后台线程,由后台线程创建的窗口都是后台窗口。

   用户通过单击一个窗口,使用ALT+TAB或者ALT+ESC组合键来设置前台窗口,应用程序则用函数SetForegroundWindow设置前台窗口。如果新建的前台窗口时顶层窗口,那么Windows系统就激活它,换句话说Windows程序激活相应的顶层窗口。

 

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

第一个参数将我们窗口设置为一个顶层窗口,或者放知道Z次序的顶部或者底部。x y是左上角坐标。cx cy分别指的窗口的宽度高度。最后一个参数,有很多的参数提供选择。保留窗口的一些形态或者数据。

 

例:

if(str=="收缩<<")
 {
  SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
 }
 else
 {
  SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);
 }

前边我们用图像做了一条分割符,这里我们想要把它隐藏掉。

在分隔符上右键属性,把Visible属性的钩去掉。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值