Macros

给我一支烟!请所有烦恼都能过往如云烟!

导航

窗口居中(Win32)的实现

1、
在win32编程中。实现子窗口的居中显示如下:
void CenterDlgInParent(HWND hDlg)
{

  RECT rcDlg;
  HWND hParent;
  RECT rcParent;
  MONITORINFO mi;
  HMONITOR hMonitor;

  int xMin, yMin, xMax, yMax, x, y;

  GetWindowRect(hDlg,&rcDlg);

  hParent = GetParent(hDlg);
  GetWindowRect(hParent,&rcParent);

  hMonitor = MonitorFromRect(&rcParent,MONITOR_DEFAULTTONEAREST);
  mi.cbSize = sizeof(mi);
  GetMonitorInfo(hMonitor,&mi);

  xMin = mi.rcWork.left;
  yMin = mi.rcWork.top;

  xMax = (mi.rcWork.right) - (rcDlg.right - rcDlg.left);
  yMax = (mi.rcWork.bottom) - (rcDlg.bottom - rcDlg.top);

  if ((rcParent.right - rcParent.left) - (rcDlg.right - rcDlg.left) > 20)
    x = rcParent.left + (((rcParent.right - rcParent.left) - (rcDlg.right - rcDlg.left)) / 2);
  else
    x = rcParent.left + 70;

  if ((rcParent.bottom - rcParent.top) - (rcDlg.bottom - rcDlg.top) > 20)
    y = rcParent.top  + (((rcParent.bottom - rcParent.top) - (rcDlg.bottom - rcDlg.top)) / 2);
  else
    y = rcParent.top + 60;

  SetWindowPos(hDlg,NULL,max(xMin,min(xMax,x)),max(yMin,min(yMax,y)),0,0,SWP_NOZORDER|SWP_NOSIZE);
}
你只要在你的WM_INITDIALOG中调用以上的方法即可.
接下来主要介绍一下上面方法:
  (1)、首先是通过子窗口的句柄来获取子窗体尺寸,
  (2)、然后在通过子窗口来得到父窗体的句柄并得到父窗口的窗体尺寸
  (3)、现在主要介绍一下MonitorFromRect函数与GetMonitorInfo函数的作用,参考MSDN的说明,大要意思如下:
  HMONITOR MonitorFromRect(LPCRECT lprc,DWORD dwFlags)
MonitorFromRect返回包含lprc代表的矩形的显示器句柄;如果包含此矩形的显示区
域不止一个,则返回包含矩形最大部分的显示器句柄;如果矩形不属于任何一个显示区域
,返回的句柄由dwFlags决定BOOL GetMonitorInfo(HMONITOR hMonitor,LPMONITORINFO lpmi)
GetMonitorInfo返回由hMonitor代表的显示器的有关信息,这些信息存储在指向MON
ITORINFO结构的指针——lpmi中。这些信息包括用RECT结构表示的显示器的显示区域的
大小(如果这个显示器不是主显示器,RECT的坐标可能为负数),以及用RECT结构表示的显
示器的工作区域的大小,工作区域是显示区域中除去系统任务栏和应用程序快捷方式栏所
剩下的区域,还能够判断此显示器是否为主显示器,并返回一个标志
(4)、通过以上的数据来窗口的位置
(5)、在使用SetWindowPos()函数来设置子窗口的位置

2、
 int cxScreen,cyScreen;
  RECT rect;
  cxScreen = GetSystemMetrics(SM_CXSCREEN);  //取得屏幕的宽度
  cyScreen = GetSystemMetrics(SM_CYSCREEN);  //取得屏幕的高度
  //获取窗体尺寸
  GetWindowRect(hwnd,&rect);
  rect.left=(cxScreen-rect.right)/2;
     rect.top=(cyScreen-rect.bottom)/2;

  //设置窗体位置
  SetWindowPos(hwnd,HWND_TOP,rect.left,rect.top,rect.right,rect.bottom,SWP_SHOWWINDOW);

如果大家还有什么更好的方法希望能告知在下!

posted on 2007-07-06 09:45  Macros  阅读(1366)  评论(0)    收藏  举报