2008-12-12 74 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