Пользовательская подсказка с диалогом WS_POPUP - PullRequest
1 голос
/ 12 декабря 2008

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

Ответы [ 4 ]

3 голосов
/ 12 декабря 2008

Когда вы создаете окно, не устанавливайте для него флаг WS_VISIBLE. Затем вы можете использовать ShowWindow с SW_SHOWNA или SW_SHOWNOACTIVATE, чтобы сделать диалог видимым.

1 голос
/ 12 декабря 2008

Прежде всего, рассмотрите возможность использования CWnd, а не CDialog. Это дает вам более тонкий контроль. И в любом случае вы не используете никаких функций CDialog, кроме шаблона диалога; динамически создавать элементы управления не сложно.

Вы также можете рассмотреть в обработчиках сообщений обработку OnShowWindow и убедиться, что все команды show изменены на SW_SHOWNA, как в комментарии Марка Рэнсома.

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

1 голос
/ 12 декабря 2008

Вы звоните CDialog::Create() с WS_VISIBLE? Возможно, даже простого вызова Create() достаточно, чтобы отвлечь внимание от родителя. Может также стоить переопределить WM_SETFOCUS в классе всплывающей подсказки и , а не , вызывая базовый класс, чтобы сделать невозможным изменение фокуса окнами.

0 голосов
/ 14 декабря 2008

Хорошо. Я наконец получил это! Мне просто нужно было возвращать FALSE в методе OnInitDialog, чтобы избежать активации диалога.

Спасибо всем вам!

...