Мое почтение, многоуважаемые форумчане!
Создал приложение с Topmost диалоговым окном а-ля "помощник" в winword. Хочу работать с ним только из трея, но не могу понять как убрать его иконку из панели задач.
Буду премного благодарен за подсказку.
Спасибо!
Здравствуйте, Трудорг, Вы писали:
Т>Создал приложение с Topmost диалоговым окном а-ля "помощник" в winword. Хочу работать с ним только из трея, но не могу понять как убрать его иконку из панели задач.
Вариант 1.
Добавить в расширенные стили окна флаг WS_EX_TOOLWINDOW.
Вариант 2.
Сделать окно помощника дочерним по отношению к какому-нибудт message-only window.
См. здесь —
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx#message_only
Здравствуйте, okman, Вы писали:
Т>>Создал приложение с Topmost диалоговым окном а-ля "помощник" в winword. Хочу работать с ним только из трея, но не могу понять как убрать его иконку из панели задач.
O>Вариант 2.
O>Сделать окно помощника дочерним по отношению к какому-нибудт message-only window.
Не вполне OK
(см.
http://rsdn.ru/forum/winapi/2610470.all.aspxАвтор: kero
Дата: 05.08.07
, с утилиткой для экстренной проверки).
Здравствуйте, kero, Вы писали:
O>>Сделать окно помощника дочерним по отношению к какому-нибудт message-only window.
K>Не вполне OK
K>(см. http://rsdn.ru/forum/winapi/2610470.all.aspxАвтор: kero
Дата: 05.08.07
, с утилиткой для экстренной проверки).
А можете прокомментировать, что конкретно "не ОК" ?
Допустим, у нас есть окно зарегистрированного посредством RegisterClassEx класса,
созданное через CreateWindowEx, цикл обработки сообщений которого выполняется
стандартной схемой с GetMessage/TranslateMessage/DispatchMessage. При этом окно
message-only, на WM_CREATE создает иконку в трее, на WM_DESTROY иконка удаляется.
У этого окна есть child — какой-нибудь немодальный диалог со стилем WS_EX_TOPMOST,
все время висящий на экране. child-окно создается через CreateDialogParam с hWndParent,
равным hWnd главного окна приложения, которое message-only.
Какие тут могут быть грабли ?
Здравствуйте, okman, Вы писали:
O>А можете прокомментировать, что конкретно "не ОК" ?
O>Допустим, у нас есть окно зарегистрированного посредством RegisterClassEx класса,
O>созданное через CreateWindowEx, цикл обработки сообщений которого выполняется
O>стандартной схемой с GetMessage/TranslateMessage/DispatchMessage. При этом окно
O>message-only, на WM_CREATE создает иконку в трее, на WM_DESTROY иконка удаляется.
O>У этого окна есть child — какой-нибудь немодальный диалог со стилем WS_EX_TOPMOST,
O>все время висящий на экране. child-окно создается через CreateDialogParam с hWndParent,
O>равным hWnd главного окна приложения, которое message-only.
O>Какие тут могут быть грабли ?
Не о каких-то граблях (ваша схема, конечно, рабочая) — речь всего лишь о неточностях.
Для описанного вами варианта:
1) имеем дело не с "child", а с "owned";
2) owned окно по-любому не поимеет кнопы на таскбаре (видимость/невидимость owner-а тут роли не играет);
3) данному owner-у быть именно message-only не обязательно, подойдет и hidden, и 0-size visible (с WS_EX_TOOLWINDOW).
СсылкуАвтор: kero
Дата: 05.08.07
же приводил прежде всего на тот случай, если подразумевалось управление таскбарной кнопой на лету.
Здравствуйте, kero, Вы писали:
K>Не о каких-то граблях (ваша схема, конечно, рабочая) — речь всего лишь о неточностях.
K>Для описанного вами варианта:
K>1) имеем дело не с "child", а с "owned";
Совершенно верно !
Эта путаница — далеко не первая, которая берет начало из неудачного выбора имен.
Например (MSDN):
hWndParent
A handle to the window that owns the dialog box.
Логичнее (и безопаснее !) было бы иметь hWndOwner, а не hWndParent.
Здравствуйте, okman, Вы писали:
K>>1) имеем дело не с "child", а с "owned";
O>Совершенно верно !
O>Эта путаница — далеко не первая, которая берет начало из неудачного выбора имен.
именно этой путанице и посвящено то, что по ссылке
O>Например (MSDN):
O>O>hWndParent
O>A handle to the window that owns the dialog box.
O>Логичнее (и безопаснее !) было бы иметь hWndOwner, а не hWndParent.
Однако ведь поле "hWndParent" (в CreateWindowEx/CreateDialog*/DialogBox*) может быть использовано и под законный Parent, для создания окна с WS_CHILD...
так что, пожалуй, надо бы что-то вроде hWndParentOwner