当前位置:C++技术网 > 资讯 > 编程方式改变按钮的位置和修改按钮大小

编程方式改变按钮的位置和修改按钮大小

更新时间:2015-06-23 11:49:23浏览次数:1+次

     相信在平常的编程里,有些人需要在程序运行时动态的改变按钮的大小或者位置。而这些函数在按钮控件类或者其他控件类是没有的,因此,为了实现这些功能,我们又到CWnd窗口类中去找。因为控件都是派生于这个类的,因此,这个基类的很多函数都是可以使用的,以后就不再赘述这一点了。如果你想全面的了解,可以在MSDN中,输入CWnd关键字,查找这个类的说明,选择Class Member,就可以查看这个类的所有成员函数了。经常用到的函数,我会慢慢解释清楚。有必要时,会单独介绍一下这个类的函数。
    对于窗口位置和大小的改变,先说说基本背景知识。
    这里只是简单的解释一下,更全面的介绍,请查阅MSDN,或者Windows程序设计。因为涉及的东西很多,会占用大量篇幅,这里只简单说一下,以便对函数所涉及到的背景知识有个初步了解,也不至于使用函数后不知道为什么。知其然更要知其所以然,以后就能运用自如了。
    窗口位置,就是窗口在屏幕的显示的坐标位置。屏幕坐标,左上角是原点(0,0),从左到右是x轴正向,从上到下是y轴正向,所谓正向,就是从0开始慢慢变大数值。往往会忽略的一点,就是一个Z轴。Z轴就是垂直于屏幕平面指向我们的这个方向。Z轴主要用于窗口在屏幕的层叠的一个依据。最上面的窗口被显示出来,底层的窗口则被最上面的遮住。那么我们改变窗口的位置包括x,y,z三个轴的位置。大小则比较简单。
    在想x和y组成的平面上,也就是屏幕平面,我们还要注意一点,主窗口的原点是屏幕左上角(0,0)位置,还有,子窗口的原点则是父窗口的客户区的左上角(0,0)位置。子窗口的位置相对于父窗口,子窗口的位置会随着父窗口的位置改变而一起改变,但是子窗口相对于父窗口是不动的。如果还有不懂,可以在评论中提出。
    好了,介绍完背景知识,我们来看看如何通过函数实现窗口位置和大小的改变。
    通常情况下,我们把控件的大小和位置都是在资源视图下在主窗口中摆放好,这个在资源编辑器中做的。程序运行后,这些控件的位置是不能移动的,而主窗口可以拖动标题栏移动,程序内部就执行了移动窗口的函数来实现的。主窗口的位置移动一般不用我们来设定了,但是,有时候确实需要编程移动窗口的,而不是去拖动窗口。比如说,主窗口创建了三个子窗口,子窗口要均匀的排布在屏幕上,我们在创建并显示子窗口时,我们必须就把子窗口排列好,那么这个时候,我们就需要编程来移动子窗口了。
    最常用的就是MoveWindow函数。
    (1)void MoveWindow(int x,int y,int nWidth,int nHeight,BOOL bRepaint = TRUE );
    (2)void MoveWindow(LPCRECT lpRect,BOOL bRepaint = TRUE );
    此函数有两个版本,第一个版本是指出窗口的原点,即左上角的点的x和y坐标,如果是主窗口,则x和y是相对于屏幕左上角的,如果是子窗口,则是相对于父窗口的客户区的原点,即客户区的左上角。nWidth,nHeight则是窗口的大小,确定宽度和高度。bRepaint是表示移动窗口后是否重新绘制窗口,默认是重绘,我们可以暂时不用管。而第二个版本的函数,最后一个参数同上,第一个参数则是lpRect,它是一个矩形类CRect的对象地址或者矩形RECT结构体的地址,CRect对象和RECT结构体很类似,是简单的对于RECT结构体的封装,使用时可以根据自己的习惯使用。这两个都是存储窗口位置和大小的一个矩形坐标,有四个LONG值组成,分别是左顶右高,其实就是对应于第一个版本的前四个参数,只不过这样的作法使参数减少了,把四个参数合并到一个结构体而已。
    注意,这两个函数既可以改变窗口的大小也可改变窗口的位置。如果两个同时改变,比如,主窗口当前的位置是(0,0,100,200),如果要把窗口的宽和高变成(200,300),位置变到(50,60),那么可以直接在第一个版本中传入(50,60,200,300)这一组参数即可,或者使用第二个版本,先创建一个结构体RECT rect1 = {50,60,200,300};或者创建一个CRect对象 CRect rect2(50,60,200,300); 然后将创建的rect1结构体或者rect2对象的地址传递进去,如&rect,这样就可以实现这个改变。子窗口的位置则是相对于父窗口的左上角,主窗口的位置是相对于屏幕左上角的,这点时刻要清楚。
    但是,有时候,我们只需要改变窗口的大小或者只想改变窗口的位置,那么如何实现?如果直接给出参数,我们是无法确定窗口的大小和位置的,所以我们要获取窗口的位置和大小。我们可以通过函数动态的获取控件的大小。获取后,然后我们就可以实现只改变大小或只改变位置。

    获取控件客户区大小和位置的函数为:

    (3)void GetClientRect(LPRECT lpRect ) const;

    用法也很简单。我们先创建一个RECT结构体或者CRect对象,然后将地址传给这个参数,函数执行完后,这个结构体或者对象就包含了控件的大小和位置。但是请注意,这时候的位置,始终都是(0,0),因为控件的窗口大小和客户区大小完全一样,因此这个函数获取的客户区就是控件的大小。在这个基础上,我们在将获得的控件的大小结构体或者Crect对象的left+=10;,top+=20;我们就能够将控件的x坐标值增加10个单位就能将控件y坐标值增加20, 然后将这个结构体或者对象传给MoveWindow,然后也就将控件在父窗口的客户区右移了10各单位,下移了20个单位。这样就能够只移动控件而不改变控件的大小,如果只修改right就只改变控件的宽度,只修改bottom就只改变控件的高度,修改后都是传给MoveWindow函数执行,就可以改变了。当然也可以将位置和大小同时改变。
    如果想改变窗口的Z轴顺序,可以参看SetWindowPos函数,对于控件,我们则不需要,因此就不在此讨论了。如果有兴趣,可以查阅MSDN。
    如果有不清楚的,或者我没表述清楚的,请在文章后面评论,我会补充说明。