今天2016-07-23 13:26:24又来处理最大化时,窗口任务栏隐藏的bug。
前面已经用了
MINMAXINFO的结构体: typedef struct { POINT ptReserved; //不用 POINT ptMaxSize; //最大范围 POINT ptMaxPosition; //最大的放置点 POINT ptMinTrackSize; //最小拖动范围 POINT ptMaxTrackSize; //最大拖动范围 } MINMAXINFO;
http://blog.csdn.net/whh_1218/article/details/8495649;这里的方法,感觉缺什么,有些变量不知道。也知道怎么去处理OnGetMinMaxInfo()消息函数了。
void MainDialog::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { // TODO: Add your message handler code here and/or call default //lpMMI->ptMaxSize.y = GetSystemMetrics(SM_CYFULLSCREEN) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME); CRect rt; SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0); lpMMI->ptMaxSize.x = rt.Width(); lpMMI->ptMaxSize.y = rt.Height(); lpMMI->ptMaxTrackSize.x = rt.Width(); lpMMI->ptMaxTrackSize.y = rt.Height(); CDialog::OnGetMinMaxInfo(lpMMI); }
这样的效果,竖放的时候不好,将窗口的大小是确定了,但是左上角的坐标不对!
然后学习了,确定任务栏大小的方法,以为真的要分情况,讨论窗口的大小了。
获得桌面工作区大小,即不包括任务栏的大小,制作窗口全屏时经常用到,方法如下:
RECT rt; SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&rt,0);
CRect rect;
::GetWindowRect(::FindWindow(_T("Shell_TrayWNd"), NULL), &rect); //获取任务栏的大小
获得任务栏高度与宽度方法有二:
1.判断位置 RECT rt; SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0) // 获得工作区大小 //任务栏在下面的高度 int y = ::GetSystemMetrics(SM_CYSCREEN)-rt.Height(); int y = rt.top; //上面 int y = rt.left; // 左 int y = ::GetSystemMetrics(SM_CXSCREEN)-rt.Width(); // 右
2.得到高度,然后可判断位置 CRect rect; CWnd *pWndPrev= FindWindow("Shell_TrayWnd", ""); // 调用本对象即this的Findwindow函数,返回窗口指针 pWndPrev->GetWindowRect(&rect); //rect.bottom-rect.top 就是任务栏的高度 if(rect.top>0) //下面 if(rect.left>0) //左面 或者 CWnd* p = NULL ; HWND hwnd = ::FindWindow("Shell_TrayWnd",NULL) ; // 调用公有的FindWindow函数,返回窗口句柄 if(hwnd) { p = CWnd::FromHandle(hwnd) ; } p->GetWindowRect();//包含有宽度
最后突然想带了既然SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0);都获得了工作窗体的大小,就直接 MoveWindow(rt);就可以了,实事证明是可行了。只不过移动后返回还是有bug;不过可以接受了。
再次证明有时候,不能只是套别人的方法,自己还是要动动脑,用自己的方法去实现。要相信自己,有的想法是行得通的。