MFC开发之设置窗口最大化、最小化和默认大小

当没有标题栏后自己写最大化、最小化和默认大小

最大化按钮:

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
 {
 //没隐藏
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值