当没有标题栏后自己写最大化、最小化和默认大小
最大化按钮:
static BOOL bMaximum = FALSE;
Invalidate();
if (bMaximum)
{
ShowWindow(SW_RESTORE);
bMaximum = false;
//添加
}
else
{
ShowWindow(SW_MAXIMIZE);
bMaximum = true;
//最大化后控件怎么处理代码,是否跟随变化
}
因为这样最大化会将任务栏覆盖住,所有需要在OnGetMinMaxInfo中添加最大高
lpMMI->ptMaxSize.y = GetSystemMetrics(SM_CYFULLSCREEN) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYDLGFRAME);
这样最大化时就不会覆盖任务栏了
以上不适合所有问题,因为一般最大化的时候界面中控件也会改变位置和大小这就需要对控件操作了,这个时候上面最大化的方式就不好用了
弄三个按钮,最小化、最大化、关闭按钮,响应消息
1、最小化按钮
CDialogEx::ShowWindow(SW_SHOWMINIMIZED);
下面的放在初始化函数中
//在任务栏点击可以最小化
LONG dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle | WS_MINIMIZEBOX);
2、默认大小
这个在程序第一个运行的时候就将界面的大小用静态变量保存起来,后面最大化后恢复默认使用,注意默认大小的左上角坐标要根据最大化前的坐标来定,在最大化前将这个坐标保存起来,设置大小使用MoveWindow函数
3、最大化
需要注意多屏幕的问题,然后在主屏幕要注意任务栏的高度和任务栏是否隐藏的问题
//获取任务栏的高度
CRect rt;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0);//rt.bottom为除任务栏外的高度
//判断软件界面所在的是否为主屏幕
HMONITOR hMonitor1 = MonitorFromRect(ssd, MONITOR_DEFAULTTONULL);//根据区域获取当前屏幕坐标
MONITORINFO mi;
RECT rc5;
mi.cbSize = sizeof(mi);
::GetMonitorInfo(hMonitor1, &mi);
rc5 = mi.rcMonitor;//判断rc5的左上角坐标是否为0,都为0 就是主屏幕
如果为主屏幕就使用rt为最大化区域,注意当任务栏在左边时宽度需要rt.right-et.left
不是主屏幕直接使用rc5就可以了
最后判断任务栏是否隐藏(不过好像SystemParametersInfo已经帮我们判断好了,不需要我们单独判断)
APPBARDATA apBar;
memset(&apBar,0,sizeof(apBar));
apBar.cbSize = sizeof(apBar);
apBar.hWnd =(HWND) FindWindow("Shell_TrayWnd", NULL);
LPARAM lParam = SHAppBarMessage(ABM_GETSTATE, &apBar);
if (lParam ==ABS_AUTOHIDE)
{
//隐藏
}
else
{
//没隐藏
}