每个程序都有自己的主窗口标题,位置和大小,因此需要在编写程序时修改窗口的各种属性。
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函数需要逐个获取边框,菜单等的大小,比较繁因此不建议采取这种方法。
所以要通过:非客户区的大小 = 窗口大小 - 客户区大小 的方式来获取非客户区的大小。而窗口大小和客户区大小可以通过GetWindowRect和GetClientRect这两个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);
写完了,科科。