Как сделать, чтобы окно не появлялось на панели задач?
Существует по крайней мере два способа решить эту задачу. Оба документированы в базе знаний Микрософт. Первый очень прост в реализации, но подходит не всегда. Второй более универсальный, а его реализация лишь немного труднее.
Способ 1
Всё, что вам нужно сделать - назначить окну при создании стиль WS_EX_TOOLWINDOW. В программе на "чистом" API этот стиль передаётся функции CreateWindowEx.
( WS_EX_TOOLWINDOW, // Задаём нужный стиль. szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); |
В MFC аналогичная задача решается переопределением функции PreCreateWindow, в которой и задаётся нужный стиль.
{ if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs ... cs.dwExStyle |= WS_EX_TOOLWINDOW; ... return TRUE; } |
Как уже говорилось, при использовании этого способа возникает одна проблема. Дело в том, что изначально стиль WS_EX_TOOLWINDOW разрабатывался для вспомогательных окон (таких, как плавающие панели инструментов), а не для главного окна приложения. Окна с этим стилем имеют более узкий заголовок, на котором отсутствует иконка приложения и кнопки минимизации/максимизации (рисунок 1). Если вас это не устраивает, придётся использовать другой способ.
Способ 2
Как известно, Windows не отображает на панели задач скрытые окна, а также любые дочерние окна скрытых окон. Поэтому второй способ решить поставленную задачу - назначить окну "в родители" невидимое окно. Например:
HWND hWnd = CreateWindow ( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hHiddenWnd, NULL, hInstance, NULL ); |
В MFC задача решается аналогично.