之前在网络上找了一份mfc对话框启动就直接隐藏窗体,在右下角显示托盘图标的demo
在win7下可以正常使用,但在win10上直接溢出,导致计算机跟注销似的崩溃现象。
后来找到原因是因为在OnInitDialog 中 执行了 SetWindowPlacement()(函数设置指定窗口的显示状态和恢复,最大化,最小化位置)
操作,然后在执行的时候由于只是给下面几个值做了赋值,然而主要的位置信息没有赋值
WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); wp.flags = WPF_RESTORETOMAXIMIZED; wp.showCmd = SW_HIDE;
在win10上执行的时候就溢出了
在上面的操作中需要获取一下位置值
WINDOWPLACEMENT wp; GetWindowPlacement(&wp); //再次获取尺寸等信息,要不然会溢出(win10上崩溃) wp.length = sizeof(WINDOWPLACEMENT); wp.flags = WPF_RESTORETOMAXIMIZED; wp.showCmd = SW_HIDE; SetWindowPlacement(&wp);
后来又做了些修改,导致程序执行上面的隐藏操作不起作用在OnInitDialog 里
为了解决这个问题,就添加了消息处理函数 PreTranslateMessage
在消息处理函数中通过自定义消息 来隐藏窗口(想到这个方法是由于后来窗口起来之后手动点击隐藏操作就可以实现隐藏,但直接在OnInitDialog 里就不起作用)
自定义消息:
#define WM_HIDMESSAGE (WM_USER+1)
在OnInitDialog 最后发送该消息:
PostMessage(WM_HIDMESSAGE, NULL);
在PreTranslateMessage里处理该消息:
this->ShowWindow(SW_HIDE);
就实现了窗口启动隐藏功能了,不过,不过,会在右下角闪一下窗体在隐藏,效果不理想啊。
再后来就在OnInitDialog 发送隐藏消息之前加了句窗体最小化操作:
ShowWindow(SW_MINIMIZE);
很奇怪在OnInitDialog 执行 最小化操作就能起作用。
就这样先执行最小化操作,然后再执行隐藏操作,两者结合就能实现效果还不错的窗体启动就隐藏,在右下角显示托盘图标