窗口属性设置(如何设置非客户区大小)

每个程序都有自己的主窗口标题,位置和大小,因此需要在编写程序时修改窗口的各种属性。

HWND CreateWindow(
    LPCTSTR lpClassName,       //指定了窗口的类名
    LPCTSTR lpWindowName,      //窗口标题
    DWORD dwStyle,             //窗口的风格
    int x,                     //指定窗口的初始左上角水平位置
    int y,                     //指定窗口的初始左上角垂直位置
    int nWidth,                //窗口的宽度
    int nHeight,               //窗口的高度
    HWND hwndParent,           //创建的窗口的父窗口或所有着窗口的句柄
    HMENU hMenu,               //菜单句柄
    HANDLE hInstance,          //模块实例的句柄
    LPVOID lpParam             //传递给窗口WM_CREATE消息的指针
);

 


窗口创建了以后,也可以修改窗口的位置大小,可以使用MoveWindow函数实现。

BOOL MoveWindow(
    HWND hwnd,        //窗口的句柄
    int x,            //左上角水平位置
    int y,            //左上角垂直位置
    int nWidth,       //窗口宽度
    int nHeight,      //窗口高度
    BOOL bRepaint     //重画标识
);

bRepaint指定是否需要重画,如果为TRUE,则hWnd在OnPaint消息处理函数中接收到一条WM_PAINT消息,如果该消息为FALSE,则不会发生任何类型的重绘,


上面介绍了两种改变窗口位置和大小的方法,CreateWindow只能在窗口创建的时候设置窗口的位置和大小,而MoveWindow只能更改窗口的位置和大小,并不能设置窗口的叠放属性。

噔噔蹬……函数SetWindowPos不仅拥有MoveWindow函数的功能,还有能更改窗口的叠放属性。

BOOL SetWindowPos(
    HWND hWnd,               //窗口句柄
    HWND hWndInsertAfter,    //该值设置叠放属性
    int x,                   //左上角水平位置
    int y,                   //左上角垂直位置
    int cx,                  //窗口宽度
    int cy,                  //窗口高度
    UNIT uFlags              //窗口定位标志
);

hWndInsertAfter:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为某个窗口句柄,或者下列值之一:

      HWND_BOTTOM,将窗口置于Z序的底部,值为1。

      HWND_NOTOPMOST,将窗口置于所有非顶层窗口之上,如果窗口已经是非顶层窗口,则该标志不起作用,值为-2。

      HWND_TOP,将窗口置于Z序的顶部,值为0。

      HWND_TOPMOST,将窗口置于所有非顶层窗口之上,即使窗口未被激活,窗口也将保持顶级位置,值为-1。

uFlags参数设置详情参见MSDN,通常使用参数SWP_NOMOVE,保持当前位置不变(忽略X和Y参数)。uFlags参数也可以是这些参数的组合,例如SWP_HIDEWINDOW | SWP_NOMOVE。


CreateWindow和MoveWindow都只会改变整个窗口的大小(客户区+非客户区),如果需要设置窗口客户区的大小为(400,400),那么就要获得窗口的非客户区大小。可以使用GetSystemMetrics函数获得被定义的系统配置信息,比如屏幕的宽度和高度。

cxScreen = GetSystemMetrics(SM_CXSCREEEN);
cyScreen = GetSystemMetrics(SM_CYSCREEEN);

因为窗口的非客户区包含边框,菜单等,使用GetSystemMetrics函数需要逐个获取边框,菜单等的大小,比较繁因此不建议采取这种方法。

所以要通过:非客户区的大小 = 窗口大小 - 客户区大小  的方式来获取非客户区的大小。而窗口大小和客户区大小可以通过GetWindowRectGetClientRect这两个API函数获得。

例如:

hWnd=CreateWindow(szWindowClass,"WELCOME",WS_OVERLAPPEDWINDOW|WS_HSCROLL,CW_USEDEFAULT,0,
                CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if(!hWnd)
{
    return FALSE;
}

RECT clientrc;
GetClientRect(hWnd,&clientrc);      //获得窗口客户区大小 
RECT windowrc;
GetWindowRect(hWnd,&windowrc);      //获得窗口大小

int borderwidth=(windowrc.right - windowrc.left) - (clientrc.right - clientrc.left);
                                    //边框宽度
int borderheight=(windowrc.bottom - windowrc.top) - (clientrc.bottom - clientrc.top);
                                    //边框高度

MoveWindow(hWnd,150,150,400+borderwidth,400+borderheight,TRUE);

ShowWindow(hWnd,nCmdShow);
UpdataWindow(hWnd);

写完了,科科。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值