Пользовательская всплывающая подсказка с диалоговым окном WS_POPUP
Вопрос
Я хочу создать пользовательские всплывающие подсказки, в которые я могу поместить любые элементы управления.Я извлек из CDialog и использовал WS_POPUP | WS_BORDER
стили.Я также добавляю CS_DROPSHADOW
измените стиль в OnInitDialog, чтобы получить тень всплывающей подсказки.
Затем я сам справляюсь с WM_MOUSEHOVER
и WM_MOUSELEAVE
события для отображения / скрытия всплывающих подсказок.
Я отображаю всплывающую подсказку с помощью SetWindowPos
и SWP_NOACTIVATE
чтобы родительский элемент не стал неактивным, а новое диалоговое окно - активным.Но в любом случае, когда я создаю диалоговое окно, используя CDialog::Create
метод ... главное окно становится неактивным...что дает очень плохой эффект.
Итак, мой вопрос в том, как я могу создать CDialog в стиле WS_POPUP без того, чтобы мое главное окно (или родительское окно диалогового окна) становилось неактивным при появлении нового диалогового окна???
Спасибо за помощь!
Отредактированный:Я не использую стиль WS_VISIBLE для создания диалогового окна...это этот ресурс:
IDD_LABEL_TOOLTIP_DLG DIALOGEX 0, 0, 100, 9
STYLE DS_SETFONT | WS_POPUP | WS_BORDER
FONT 8, "Tahoma", 0, 0, 0x0
BEGIN
LTEXT "##################",IDC_TOOLTIP_LBL_TEXT,0,0,99,9
END
Код, отображающий всплывающую подсказку, выглядит примерно так:
if(!pTooltipDlg)
{
pTooltipDlg = new MyCustomTooltipDlg();
pTooltipDlg->Create( MyCustomTooltipDlg::IDD, this);
}
pTooltipDlg->ShowWindow(SW_SHOWNOACTIVATE);
В первый раз (т.Е. при вызове create) основные окна теряют фокус...у остальных этого уродливого эффекта нет happening...so Я уверен, что это из-за Create.
Решение 4
ОК.Наконец-то до меня дошло!Мне просто пришлось вернуть FALSE в методе OnInitDialog, чтобы избежать активации диалогового окна.
Спасибо всем вам!
Другие советы
При создании окна не установлен флаг WS_VISIBLE на нем. Затем вы можете использовать ShowWindow с SW_SHOWNA или SW_SHOWNOACTIVATE сделать диалог видимым.
Ты звонишь CDialog::Create()
с WS_VISIBLE
установить?Может случиться так, что даже просто позвонив Create()
этого достаточно, чтобы отвлечь внимание от родителя.Возможно, это также стоило бы переопределить WM_SETFOCUS
в вашем классе всплывающей подсказки и нет вызов базового класса, чтобы сделать невозможным изменение фокуса Windows.
Прежде всего, рассмотрите возможность использования CWnd, а не CDialog.Это дает вам гораздо более тонкий контроль.И в любом случае вы на самом деле не используете какие-либо функции CDialog, кроме шаблона диалогового окна;динамически создавать свои элементы управления не так уж сложно.
Возможно, вы также захотите рассмотреть в обработчиках сообщений обработку OnShowWindow и убедиться, что все команды show изменены на SW_SHOWNA, как в комментарии Марка Рэнсома.
Кроме того, в качестве всплывающей подсказки у него, вероятно, должно быть нулевое родительское окно.