带有WS_POPUP对话框的自定义工具提示

时间:2008-12-12 15:28:32

标签: mfc tooltip cdialog

我想创建自定义工具提示,我可以在其中放置任何类型的控件。我从CDialog派生并使用WS_POPUP | WS_BORDER样式。我还在OnInitDialog中添加CS_DROPSHADOW样式以获取工具提示阴影。

然后我自己管理WM_MOUSEHOVERWM_MOUSELEAVE事件以显示/隐藏工具提示。

我使用SetWindowPosSWP_NOACTIVATE显示工具提示,以防止父级变为非活动状态并使新对话框变为活动状态。但无论如何,当我使用CDialog::Create方法创建对话框时......主窗口变为非活动状态......会产生非常糟糕的效果。

所以我的custion是如何创建一个带有WS_POPUP样式的CDialog而没有我的主窗口(或对话框的父窗口)在新对话框出现时变为非活动状态???

感谢您的帮助!

编辑:我没有使用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);

第一次(即正在调用创建时)主窗口失去焦点......其余的这些丑陋的效果都没有发生......所以我肯定是因为创建。

4 个答案:

答案 0 :(得分:3)

创建窗口时,请勿在其上设置WS_VISIBLE标志。然后你可以使用ShowWindow和SW_SHOWNA或SW_SHOWNOACTIVATE使对话框可见。

答案 1 :(得分:1)

您是否在设置CDialog::Create()的情况下致电WS_VISIBLE?可能即使只是调用Create()就足以从父母那里获得焦点。在工具提示类上覆盖WM_SETFOCUS并且调用基类以使焦点无法更改窗口也可能值得覆盖。

答案 2 :(得分:1)

首先,考虑使用CWnd而不是CDialog。这为您提供了更好的控制。除了对话框模板之外,你还没有真正使用CDialog的任何功能;动态创建控件并不困难。

您可能还想在消息处理程序中考虑处理OnShowWindow并确保将任何show命令更改为SW_SHOWNA,如Mark Ransom的注释中那样。

此外,作为工具提示,它应该具有NULL父窗口。

答案 3 :(得分:0)

确定。我终于明白了!我只需要在OnInitDialog方法中返回FALSE以避免激活对话框。

感谢大家!