我想创建自定义工具提示,我可以在其中放置任何类型的控件。我从CDialog派生并使用WS_POPUP | WS_BORDER
样式。我还在OnInitDialog中添加CS_DROPSHADOW
样式以获取工具提示阴影。
然后我自己管理WM_MOUSEHOVER
和WM_MOUSELEAVE
事件以显示/隐藏工具提示。
我使用SetWindowPos
和SWP_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);
第一次(即正在调用创建时)主窗口失去焦点......其余的这些丑陋的效果都没有发生......所以我肯定是因为创建。
答案 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以避免激活对话框。
感谢大家!