要實現窗口居中顯示並不難,只要在窗體創建的時候我們設置窗口的位置就可以了.在這裏我們主要用到3個API函數,分別是:GetSysMetrics,GetWindowRect,SetWindowPos.
我們用GetSysMetrics來獲的屏幕的寬度和高度,然後用GetWindowRect來獲取窗口的座標.通過運算後計算出居中窗口的位置,最後用SetWindowPos來設置窗體的位置.整個過程就是如此,而這些部步驟我們都要在窗口創建之前設置好,所以我們要把這些實現方法寫進WM_CREATE消息中.
現在讓我們看一下,以上3個API函數的解釋,下面的說明是從<Windows API參考大全>中截取出來的:
GetSystemMetrics
函數功能:返回與windows環境有關的信息。
函數原型:int GetSystemMetrics(int nIndex)
參數:
nIndex:常數,指定欲獲取的信息。由於取值很多,所以在這裏不一一列舉了,本例子只用到兩個常數值:
SM_CXSCREEN:屏幕寬度。
SM_CYSCREEN:屏幕高度。
我們用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 <windows.h>
BOOL InitApplication(HINSTANCE hInstance);
HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
BOOL InitInstance(HINSTANCE hInstance,int nShowCmd);
HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
BOOL InitInstance(HINSTANCE hInstance,int nShowCmd);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
if(!hPrevInstance)
if(!InitApplication(hInstance))
return 1;
if(!InitInstance(hInstance,nShowCmd))
return 1;
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
{
if(!hPrevInstance)
if(!InitApplication(hInstance))
return 1;
if(!InitInstance(hInstance,nShowCmd))
return 1;
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance=hInstance;
wc.lpfnWndProc=WndProc;
wc.lpszClassName="centerWnd";
wc.lpszMenuName=NULL;
return RegisterClass(&wc);
}
{
WNDCLASS wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance=hInstance;
wc.lpfnWndProc=WndProc;
wc.lpszClassName="centerWnd";
wc.lpszMenuName=NULL;
return RegisterClass(&wc);
}
HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
//構建窗體時
case WM_CREATE:
int scrWidth,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_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
{
switch(msg)
{
//構建窗體時
case WM_CREATE:
int scrWidth,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_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
BOOL InitInstance(HINSTANCE hInstance,int nShowCmd)
{
HWND hWnd;
hWnd=CreateWindow("centerWnd","居中窗口實例",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
if(hWnd==NULL)
return FALSE;
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
return TRUE;
}
{
HWND hWnd;
hWnd=CreateWindow("centerWnd","居中窗口實例",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
if(hWnd==NULL)
return FALSE;
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
return TRUE;
}
- 發佈於2006-11-30 20:51:13 評3分
- //獲得屏幕尺寸
scrWidth=GetSystemMetrics(SM_CXSCREEN);
scrHeight=GetSystemMetrics(SM_CYSCREEN);
//獲取窗體尺寸
GetWindowRect(hwndDlg,&rect);
//設置窗體位置
SetWindowPos(hwndDlg,HWND_TOPMOST,(scrWidth-rect.right)/2,(scrHeight-rect.bottom)/2,rect.right-rect.left,rect.bottom-rect.top,SWP_SHOWWINDOW);
這樣更好!QQ:1512287