How to dynamically show/hide the Taskbar application button
Showing/hiding taskbar buttons normally work in conjunction with registering an application icon in the system tray (adding or removing an icon to the system tray is equally described on other pages).
There is no big problem to implement visual behavior of taskbar buttons while creating the main application window. It does just to set an invisible Popup or Overlapped window as the parent window of the main application window (generally derived from CFrameWnd) in it's PreCreateWindow() virtual method. This solution is well-known and well documented. But how to restore the visibility of the hidden taskbar button again in runtime. Let's figure out:
First Step:
Create the modeless invisible dialog using resource dialog with ID e.g. IDD_FRAMEOWNER (empty dialog with no borders):
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CFrameWnd::PreCreateWindow(cs)) return FALSE;
if (!m_bOwnerCreated) // "dialog-is-created" flag
{
// m_MainFrameOwner - CDialog object mapped to the resource dialog template
m_bOwnerCreated = m_MainFrameOwner.Create(IDD_FRAMEOWNER);
if (m_bOwnerCreated) m_MainFrameOwner.ShowWindow(SW_HIDE);
};
// set the dialog as a parent of CMainFrame window
if (m_bOwnerCreated)
cs.hwndParent = m_MainFrameOwner.GetSafeHwnd();
return TRUE;
}
Last Step
Define the method like this:
BOOL CMainFrame::ShowTaskBarButton(BOOL bVisible)
{
if (!m_bOwnerCreated) return FALSE;
ShowWindow(SW_HIDE);
if (bVisible)
ModifyStyleEx(0, WS_EX_APPWINDOW);
else
ModifyStyleEx(WS_EX_APPWINDOW, 0);
ShowWindow(SW_SHOW);
return TRUE;
}
When we need to show the taskbar button that was previously hidden we have to modify the CMainFrame window ex-style by adding WS_EX_APPWINDOW flag. This flag suppresses the behavior of the owner window and the application itself becomes visible (from the taskbar point of view).
On the other hand removing WS_EX_APPWINDOW flag forces the taskbar to find the owner window relying to the CMainFrame window - which is invisible and the button gets disappeared. Using ShowWindow() method is needed to make the necessary refreshing of the taskbar itself after changing the CMainFrame window ex-style.

Comments
There are no comments yet. Be the first to comment!