为了提升用户体验,需要隐藏主窗体的边框,使用图片绘制新的标题栏。标题栏绘制之后,发现用户点击任务栏上应用程序的图标,应用程序不会随着点击交替隐藏显示。
分析结果是问题出现窗体风格设置上。
最初为了省事从别的地方拷贝了以下三行用来隐藏标题栏和菜单
SetWindowLong(this->m_hWnd, GWL_STYLE, 0);
SetWindowLong(this->m_hWnd, GWL_EXSTYLE, 0);
this->SetMenu(NULL);
问题肯定出在这三行代码上,查看MSDN,SetWindowLong用来设置窗体风格。
在调用SetWindowLong之前调用 GetWindowLong(this->m_hWnd, GWL_STYLE) 来获取原有的风格,为0x4CFC000 含以下几项:
WS_CAPTION | WS_CLIPSIBLINGS | WS_SIZEBOX | WS_SYSMENU | WS_TABSTOP | WS_GROUP
查看MSDN,看不出这几项跟任务栏点击有啥关系。只能依次尝试。
最后发现由WS_GROUP 属性决定是否响应任务栏点击事件,SetWindowLong函数为Wiindows API,看不到源码。并不清楚底层是怎么处理的。
最终代码为:
LONG style = GetWindowLong(this->m_hWnd, GWL_STYLE);
SetWindowLong(this->m_hWnd, GWL_STYLE, style & (~(WS_CAPTION | WS_SIZEBOX | WS_TABSTOP | WS_SYSMENU)));
另外两次函数调用可以去掉了。