一個窗口居中的例子(Win32)

      要實現窗口居中顯示並不難,只要在窗體創建的時候我們設置窗口的位置就可以了.在這裏我們主要用到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:屏幕高度。
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>
BOOL InitApplication(HINSTANCE hInstance);
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;
}
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);
}
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);
}
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;
}
發佈於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
 
發佈了20 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章