我们用GetSysMetrics来获的屏幕的宽度和高度,然后用GetWindowRect来获取窗口的坐标.通过运算后计算出居中窗口的位置,最后用SetWindowPos来设置窗体的位置.整个过程就是如此,而这些部步骤我们都要在窗口创建之前设置好,所以我们要把这些实现方法写进WM_CREATE消息中.
现在让我们看一下,以上3个API函数的解释,下面的说明是从<Windows API参考大全>中截取出来的:
GetSystemMetrics
函数功能:返回与windows环境有关的信息。
函数原型:int GetSystemMetrics(int nIndex)
参数:
nIndex:常数,指定欲获取的信息。由于取值很多,所以在这里不一一列举了,本例子只用到两个常数值:
SM_CXSCREEN:屏幕宽度。
SM_CYSCREEN:屏幕高度。
GetWindowRect
函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
函数原型:BOOL GetWindowRect(HWND hWnd,LPRECTlpRect);
参数:
hWnd:窗口句柄。
lpRect:指向一个RECT结构的指针,该结构接收窗口的左上角和右下角的屏幕坐标。
返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。SetWindowPos
函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
函数原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);
参数:
hWnd:窗口句柄。
hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:
HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
HWND_DOTTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口己经是非顶层窗口则该标志不起作用。
HWND_TOP:将窗口置于Z序的顶部。
HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
查g看该参数的使用方法,请看说明部分。
x:以客户坐标指定窗口新位置的左边界。
Y:以客户坐标指定窗口新位置的顶边界。
cx:以像素指定窗口的新的宽度。
cy:以像素指定窗口的新的高度。
uFlags:窗口尺寸和定位的标志。
#include<windows.h>
#include<stdio.h>
#include"resource.h"
LRESULT CALLBACK wndporc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
HMENU hMenu;
hMenu=hMenu=LoadMenu(hInstance,(LPCSTR)IDR_MENU1);
WNDCLASS ws;
ws.lpfnWndProc=wndporc;
ws.cbClsExtra=0;
ws.cbWndExtra=0;
ws.hInstance=hInstance;
ws.hIcon=LoadIcon(NULL,IDI_APPLICATION);
ws.hCursor=LoadCursor(NULL,IDC_WAIT);
ws.hbrBackground=CreateSolidBrush(RGB(255,0,0)); //创建笔刷函数
ws.lpszMenuName="Menu"; //载入自定的菜单
ws.lpszClassName="generic";
ws.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&ws);
HWND hwnd;
hwnd=CreateWindow("generic","first",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,hMenu,hInstance,NULL);
ShowWindow(hwnd,SW_NORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK wndporc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CREATE: //设置窗口居中
int scrWidth;
int scrHeight;
RECT rect;
//获得屏幕尺寸
scrWidth=GetSystemMetrics(SM_CXSCREEN);
scrHeight=GetSystemMetrics(SM_CYSCREEN);
//获取窗体尺寸
GetWindowRect(hwnd,&rect);
rect.left=(scrWidth-rect.right)/2;
rect.top=(scrHeight-rect.bottom)/2;
//设置窗体位置
SetWindowPos(hwnd,HWND_TOP,rect.left,rect.top,rect.right,rect.bottom,SWP_SHOWWINDOW);
break;
case WM_COMMAND://响应菜单消息
if(IDM_FILE==wParam)
MessageBox(hwnd, "This is help", NULL, MB_OK);
else
;
break;
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",MB_YESNO);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked ","message",MB_YESNO);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"zhoayuzen",strlen("zhoayghen"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDc;
PAINTSTRUCT ps;
hDc=BeginPaint(hwnd,&ps);
TextOut(hDc,0,0,"nihao",strlen("nihao"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"shi fou","messge",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}