2008-12-12 7 views
1

Я хочу создать собственные всплывающие подсказки, где я могу поместить любые элементы управления. Я получил из CDialog и использовал стили WS_POPUP | WS_BORDER. Я также добавляю стиль CS_DROPSHADOW в OnInitDialog, чтобы получить тень всплывающей подсказки.Пользовательская подсказка с диалогом WS_POPUP

Затем я сам управляю 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.

ответ

0

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

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

3

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

+0

Благодарим за помощь! Теперь я использую ShowWindow (SW_SHOWNOACTIVATE) вместо SetWindowPos и ​​SWP_NOACTIVATE. Я не понял этого варианта, и он намного более умный. Плохо это все еще не работает ... Я отредактировал вопрос с некоторыми комментариями. –

1

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

+0

Спасибо! Я также пробовал это.Я добавил эту запись карты ON_WM_SETFOCUS() в мой диалог всплывающей подсказки, но метод OnSetFocus даже не звонит. –

1

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

Вы также можете рассмотреть в обработчиках сообщений обработку OnShowWindow и обеспечить, чтобы любые команды show были изменены на SW_SHOWNA, как в комментарии Mark Ransom.

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

+0

Я предпочитаю не менять CDialog для CWnd, потому что я хочу иметь возможность использовать любой вид контроля. В примере я просто использовал ярлык, но хочу создать гораздо более сложные диалоги с ActiveX и т. Д. Я ценю два других предложения, но они не решают проблему. Спасибо в любом случае! –

 Смежные вопросы

  • Нет связанных вопросов^_^