首先,我们在对话框上放一个按钮,文本为“收缩<<”当我们点击的时候,文本变为“扩展>>”:
CString str;
GetDlgItemText(IDC_BUTTON1,str);
if(str=="收缩<<")
{
}
else
{
}
然后,我们在窗口上添加一个分割符,这里我们可以用图像控件来代替,我们在窗口上把它拉成一条线,我们改变一下他的属性。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
static CRect rectSmall;
首先我们要判断一下rectLarge是否为空,即是否是第一次点击按钮。 我们用到一个函数判断矩形区域是否为空
如果为空,那么我们需要为它获取原始矩形的大小。并且给对象rectSmall赋值
if(rectLarge.IsRectEmpty)
{
}
接下来我们利用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次序。
兄弟窗口:
活动窗口:
前台窗口和后台窗口:
BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );
第一个参数将我们窗口设置为一个顶层窗口,或者放知道Z次序的顶部或者底部。x y是左上角坐标。cx cy分别指的窗口的宽度高度。最后一个参数,有很多的参数提供选择。保留窗口的一些形态或者数据。
例:
if(str=="收缩<<")
前边我们用图像做了一条分割符,这里我们想要把它隐藏掉。
在分隔符上右键属性,把Visible属性的钩去掉。