Mfc 带有WS_弹出对话框的自定义工具提示

Mfc 带有WS_弹出对话框的自定义工具提示,mfc,tooltip,cdialog,Mfc,Tooltip,Cdialog,我想创建自定义工具提示,在这里我可以放置任何类型的控件。我从CDialog派生并使用WS|U弹出窗口| WS|U边框样式。我还在OnInitDialog中添加了CS_DROPSHADOW样式以获得工具提示阴影 然后我自己管理WM_MOUSEHOVER和WM_MOUSELEAVE事件来显示/隐藏工具提示 我使用SetWindowPos和SWP_NOACTIVATE显示工具提示,以防止父级变为非活动状态,并防止新对话框变为活动状态。但不管怎样,当我使用CDialog::create方法创建对话框时,

我想创建自定义工具提示,在这里我可以放置任何类型的控件。我从CDialog派生并使用WS|U弹出窗口| WS|U边框样式。我还在OnInitDialog中添加了CS_DROPSHADOW样式以获得工具提示阴影

然后我自己管理WM_MOUSEHOVER和WM_MOUSELEAVE事件来显示/隐藏工具提示

我使用SetWindowPos和SWP_NOACTIVATE显示工具提示,以防止父级变为非活动状态,并防止新对话框变为活动状态。但不管怎样,当我使用CDialog::create方法创建对话框时,主窗口将变为非活动状态……这会产生非常糟糕的效果

因此,我的问题是,当新对话框出现时,如果我的主窗口或对话框的父窗口处于非活动状态,我如何创建具有WS_弹出式样式的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);

当创建第一次被调用时,主窗口失去了焦点…其他窗口没有出现这种丑陋的效果…所以我确信这是因为创建。

创建窗口时,不要在其上设置WS\u可见标志。然后,您可以将ShowWindow与SW_SHOWNA或SW_SHOWNOACTIVATE一起使用,使对话框可见。

创建窗口时,不要在其上设置WS_visible标志。然后,您可以将ShowWindow与SW_SHOWNA或SW_SHOWNOACTIVATE一起使用,以使对话框可见。

是否调用CDialog::Create with WS_visible set?可能仅仅调用Create就足以让父级集中精力。在工具提示类上重写WM_SETFOCUS,而不调用基类以使焦点无法更改窗口,这可能也是值得的。

是否调用CDialog::Create with WS_VISIBLE set?可能仅仅调用Create就足以让父级集中精力。在工具提示类上重写WMJStValk也不值得,但不调用基类,使焦点无法更改Windows。

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

您还可以考虑在消息处理程序中处理显示窗口,并确保任何显示命令都像Mark Ransom的注释一样更改为SWSHONENA。


另外,作为一个工具提示,它应该可能有一个空父窗口。

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

您还可以考虑在消息处理程序中处理显示窗口,并确保任何显示命令都像Mark Ransom的注释一样更改为SWSHONENA。


此外,作为工具提示,它可能有一个空的父窗口。

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


谢谢大家

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


谢谢大家

谢谢你的帮助!我现在使用的是ShowWindowSW_SHOWNOACTIVATE,而不是SetWindowPos和SWP_NOACTIVATE。我没有意识到这个选项,它更聪明。糟糕,它仍然不工作…我已经编辑了一些评论的问题。谢谢你的帮助!我现在使用的是ShowWindowSW_SHOWNOACTIVATE,而不是SetWindowPos和SWP_NOACTIVATE。我没有意识到这个选项,它更聪明。糟糕,它仍然不工作…我已经编辑了一些评论的问题。谢谢!我也试过了。我在我的工具提示对话框中添加了这个关于设置焦点的映射条目,但是没有调用设置焦点的方法。谢谢!我也试过了。我在我的工具提示对话框中添加了这个位于\u WM\u SETFOCUS上的映射条目,但是甚至没有调用OnSetFocus方法。我不希望更改CWnd的CDialog,因为我希望能够使用任何类型的控件。在这个例子中,我只使用了一个标签,但我想用ActiveX等创建更复杂的对话框。我很欣赏其他两个建议,但它们并不能解决问题。无论如何谢谢你!我不希望将CDialog更改为CWnd,因为我希望能够使用任何类型的控件。在这个例子中,我只使用了一个标签,但我想用ActiveX等创建更复杂的对话框。我很欣赏其他两个建议,但它们并不能解决问题。无论如何谢谢你!