在开发桌面应用程序时,可能会遇到需要隐藏任务栏图标的情况。例如,应用程序已经有一个系统托盘图标,再在任务栏上显示一个图标就显得多余。本文将介绍一种简单的方法,创建一个不显示在任务栏上的窗口,同时允许应用程序窗口保持可见。
要创建一个不显示在任务栏上的窗口,可以创建一个单独的不可见窗口,并将其设置为应用程序窗口的父窗口。以下是实现这一功能的步骤:
首先,在主框架类中声明一个窗口成员变量:
class CMainFrame : public CFrameWnd {
...
protected:
CWnd m_wndInvisible;
...
};
然后,重写CMainFrame类的PreCreateWindow方法:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
// 创建不可见窗口
if (!::IsWindow(m_wndInvisible.m_hWnd)) {
LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0);
if (!m_wndInvisible.CreateEx(0, pstrOwnerClass, _T(""), WS_POPUP,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, 0))
return FALSE;
}
cs.hwndParent = m_wndInvisible.m_hWnd;
return TRUE;
}
以上代码片段完成了所有必要的设置。不可见窗口将在主应用程序关闭时自动销毁。
通过上述步骤,成功创建了一个不显示在任务栏上的应用程序窗口。这种方法不仅简单,而且有效,可以避免不必要的任务栏图标重复。此外,这种方法在MFC应用程序中特别有用,因为它允许更好地控制窗口的行为。
如果对这个话题感兴趣,可以进一步探索以下主题:
以下是完整的代码示例,展示了如何实现不显示任务栏图标的窗口:
class CMainFrame : public CFrameWnd {
protected:
CWnd m_wndInvisible;
public:
BOOL PreCreateWindow(CREATESTRUCT& cs) {
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
if (!::IsWindow(m_wndInvisible.m_hWnd)) {
LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0);
if (!m_wndInvisible.CreateEx(0, pstrOwnerClass, _T(""), WS_POPUP,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, 0))
return FALSE;
}
cs.hwndParent = m_wndInvisible.m_hWnd;
return TRUE;
}
};