Пользовательская всплывающая подсказка с диалоговым окном WS_POPUP

StackOverflow https://stackoverflow.com/questions/363086

  •  21-08-2019
  •  | 
  •  

Вопрос

Я хочу создать пользовательские всплывающие подсказки, в которые я могу поместить любые элементы управления.Я извлек из 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, как в комментарии Марка Рэнсома.

Кроме того, в качестве всплывающей подсказки у него, вероятно, должно быть нулевое родительское окно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top