窗口居中(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);
如果大家还有什么更好的方法希望能告知在下!
浙公网安备 33010602011771号