1

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

然后我自己管理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);

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

4

4 回答 4

3

创建窗口时,不要在其上设置 WS_VISIBLE 标志。然后您可以使用带有 SW_SHOWNA 或 SW_SHOWNOACTIVATE 的 ShowWindow 来使对话框可见。

于 2008-12-12T15:35:27.963 回答
1

CDialog::Create()WS_VISIBLEset打电话吗?可能即使只是打电话Create()也足以吸引父母的注意力。WM_SETFOCUS在您的工具提示类上覆盖并且调用基类以使焦点无法更改窗口也可能值得。

于 2008-12-12T15:37:29.783 回答
1

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

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

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

于 2008-12-12T16:28:10.680 回答
0

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

感谢大家!

于 2008-12-13T22:20:52.103 回答