2008-12-12 72 views
1

我想創建自定義工具提示,我可以放置任何類型的控件。我從CDialog派生出來並使用WS_POPUP | WS_BORDER樣式。我還在OnInitDialog中添加CS_DROPSHADOW樣式以獲取工具提示陰影。使用WS_POPUP對話框自定義工具提示

然後我自己管理的WM_MOUSEHOVERWM_MOUSELEAVE事件顯示/隱藏工具提示。

我使用SetWindowPosSWP_NOACTIVATE顯示工具提示,以防止父代變爲非活動狀態,並且新對話框變爲活動狀態。但無論如何,當我使用CDialog::Create方法創建對話框時...主窗口變爲不活動......這是非常糟糕的效果。

所以我custion是如何創建與WS_POPUP風格的一個CDialog沒有我becomening不活動時,新的對話框顯示了主窗口(或對話框的父窗口)???

感謝您的幫助!

編輯:我不使用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。

回答

0

好的。我終於明白了!我只需要在OnInitDialog方法中返回FALSE來避免激活對話框。

感謝大家!

3

當您創建窗口時,不要在其上設置WS_VISIBLE標誌。然後,可以使用SW_SHOWNA或SW_SHOWNOACTIVATE的ShowWindow使對話框可見。

+0

感謝您的幫助!我現在使用ShowWindow(SW_SHOWNOACTIVATE)而不是SetWindowPos和SWP_NOACTIVATE。我沒有意識到這個選擇,它更聰明。 壞它仍然無法正常工作......我已經編輯了一些評論的問題。 – 2008-12-12 15:57:02

1

你打電話CDialog::Create()WS_VISIBLE集?這可能是因爲即使只是打電話Create()就足以從父母那裏獲得關注。在您的工具提示類上覆蓋WM_SETFOCUS而不是可能會調用基類,以使焦點無法更改窗口。

+0

謝謝! 我也試過。我將這個映射條目ON_WM_SETFOCUS()添加到了我的工具提示對話框中,但OnSetFocus方法甚至沒有被調用。 – 2008-12-12 16:14:57

1

首先,考慮使用CWnd而不是CDialog。這給你更好的控制。除了對話框模板外,您還沒有真正使用CDialog的任何功能;動態創建控件並不太困難。

您可能還需要考慮,在消息處理程序,處理OnShowWindow並確保任何show命令改爲SW_SHOWNA在馬克贖金的評論。

此外,作爲一個工具提示,它可能應該有一個NULL父窗口。

+0

我不想爲CWnd更改CDialog,因爲我想能夠使用任何類型的控件。在這個例子中,我只是使用了一個標籤,但我想用ActiveX等創建更復雜的對話框。 我欣賞另外兩個建議,但它們不能解決問題。 還是謝謝! – 2008-12-12 23:09:09