【问题标题】:Custom tooltip with a WS_POPUP dialog带有 WS_POPUP 对话框的自定义工具提示
【发布时间】:2008-12-12 15:28:31
【问题描述】:

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

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

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

所以我的问题是如何创建一个具有 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);

第一次(即调用 create 时)主窗口失去焦点...其余的窗口没有发生这种丑陋的效果...所以我确定是因为 Create。

【问题讨论】:

    标签: mfc tooltip cdialog


    【解决方案1】:

    当你创建你的窗口时,不要在它上面设置 WS_VISIBLE 标志。然后,您可以使用 ShowWindow 与 SW_SHOWNA 或 SW_SHOWNOACTIVATE 使对话框可见。

    【讨论】:

    • 感谢您的帮助!我现在使用 ShowWindow(SW_SHOWNOACTIVATE) 而不是 SetWindowPos 和 SWP_NOACTIVATE。我没有意识到这个选项,它更聪明。糟糕的是它仍然无法正常工作......我已经用一些 cmets 编辑了这个问题。
    【解决方案2】:

    您是否在设置WS_VISIBLE 的情况下呼叫CDialog::Create()?可能即使只是调用Create() 也足以让家长关注。在您的工具提示类上覆盖WM_SETFOCUS 并且调用基类以使焦点无法更改窗口也可能值得。

    【讨论】:

    • 谢谢!我也试过了。我将此地图条目 ON_WM_SETFOCUS( ) 添加到我的工具提示对话框中,但方法 OnSetFocus 甚至没有被调用。
    【解决方案3】:

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

    您可能还需要考虑在消息处理程序中处理 OnShowWindow 并确保将任何显示命令更改为 SW_SHOWNA,如 Mark Ransom 的评论中所述。

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

    【讨论】:

    • 我不想为 CWnd 更改 CDialog,因为我希望能够使用任何类型的控件。在示例中,我只使用了一个标签,但我想使用 ActiveX 等创建更复杂的对话框。我很欣赏其他两个建议,但它们并没有解决问题。还是谢谢!
    【解决方案4】:

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

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多