CtoolTipCtrl in CDialog on WIN95/VC++ 4.2
Al Baker -- abaker@mcs.com Monday, September 23, 1996 Environment: Win 95 VC++ 4.2 I am trying to get tool tips to work with 4 buttons defined as CBitmapButton's in a CDialog. (Since CDialog is not based on CFrameWnd, tool tips are not automatically available (for design reasons that seem like a mistake-- pardon the opinion) so it is roll-your-own time. The code in my CDialog derived OnInitDialog is: RECT rect; assert(cToolTip.Create(this,TTS_ALWAYSTIP)); cToolTip.SetDelayTime(100); // delay display for .1 sec button1.GetWindowRect(&rect); button1.ScreenToClient(&rect); assert(cToolTip.AddTool(&button1,IDS_PLAY,&rect,IDPLAY)); button2.GetWindowRect(&rect); button2.ScreenToClient(&rect); assert(cToolTip.AddTool(&button2,IDS_EXIT,&rect,IDEXIT)); button3.GetWindowRect(&rect); button3.ScreenToClient(&rect); assert(cToolTip.AddTool(&button3,IDS_INSTALL,&rect,IDINSTALL)); button4.GetWindowRect(&rect); button4.ScreenToClient(&rect); assert(cToolTip.AddTool(&button4,IDS_UNINSTALL,&rect,IDUNINSTALL)); cToolTip.Activate(TRUE); and cToolTip is defined in the class definition as: CToolTipCtrl cToolTip; The tool tips are not showing up and I haven't found anything in the documentation to explain what is wrong or missing. It is probably something stupidly simple that I am overlooking but I just don't see it. All the IDxxx's above are the button id's and all the IDS_xxx's above are the string id's. Thanks, Al Baker abaker@mcs.com http://www.abaker.com for information on Al Baker and Associates. (If you would prefer sending attachments to me using an RSA/IDEA encryption method, my ViaCrypt PGP public key can be obtained via "finger" of abaker@mcs.com)
Mike Blaszczak -- mikeblas@nwlink.com Wednesday, September 25, 1996 [Mini-digest: 3 responses] At 23:50 9/23/96 -0500, abaker@mcs.com wrote: >Environment: Win 95 VC++ 4.2 >(Since CDialog is not based on CFrameWnd, tool >tips are not automatically available (for design reasons that seem like a >mistake-- pardon the opinion) A design mistake on who's part? If you want a frame window, why don't you use a CFrameWnd-derived object? You're right: choosing the wrong base class _is_ a design mistake. >The code in my CDialog derived OnInitDialog is: The function you've provided isn't complete. You say that the buttons are CBitmapButtons, but you don't mention how you initialized them. How did you intialize them? Is your DoDataExchange() function correctly written? How did you call it in CYourDialog::OnInitDialog()? > RECT rect; > assert(cToolTip.Create(this,TTS_ALWAYSTIP)); > cToolTip.SetDelayTime(100); // delay display for .1 sec Remember that assert() goes away if you define NDEBUG. This code will break badly in a default "Retail" build. You should probably use the VERIFY() macro, instead. > button1.GetWindowRect(&rect); > button1.ScreenToClient(&rect); > assert(cToolTip.AddTool(&button1,IDS_PLAY,&rect,IDPLAY)); Why are you converting the window rect you get to the client coordinates of the button? Shouldn't you be converting it to the client coordinates of the dialog? Why are you saying that the button contains itself? I think you should be coding: button1.GetWindowRect(&rect); ScreenToClient(&rect); VERIFY(cToolTip.AddTool(this, IDS_PLAY, &rect, IDPLAY)); for each of the buttons you set up. >The tool tips are not showing up and I haven't found anything in the >documentation to explain what is wrong or missing. Have you compared your code to the CMNCTRLS sample? Did you override WindowProc() for your dialog and pass the mouse messages along to CToolTip::RelayEvent()? It turns out that buttons end up capturing mouse messages when the mouse is over them, so that's also a problem for you. Since the tool tip needs to see mouse messages to know to come up, it won't come up unless you redirect the mouse messages from the buttons appropriately. I'm pretty sure there's a KB article that covers this last point, but I'm not at liberty to research it for you just now. .B ekiM http://www.nwlink.com/~mikeblas/ Don't look at my hands: look at my _shoulders_! These words are my own. I do not speak on behalf of Microsoft. -----From: "Jim Schollenberger"Al Baker Al, You are probably missing the RelayEvent in PreTranslateMessage. I have shown below some simple code to add bitmap buttons and tooltips in a dialog box. Hope it helps, Jim Schollenberger ////////////////////////////////////////////////////// // Adding tooltips to bitmap buttons: MyDlg.H CToolTipCtrl m_tooltip; CBitmapButton m_Button1; CBitmapButton m_Button2; MyDlg.CPP BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); // Load the bitmaps for the buttons. VERIFY(m_Button1.AutoLoad(IDC_BUTTON1, this)); VERIFY(m_Button2.AutoLoad(IDC_BUTTON2, this)); // Create the ToolTip control. m_tooltip.Create(this); m_tooltip.Activate(TRUE); // Add tooltips to the controls taken from the string table. m_tooltip.AddTool(GetDlgItem(IDC_BUTTON1), IDS_BUTTONTIP1); m_tooltip.AddTool(GetDlgItem(IDC_BUTTON2), IDS_BUTTONTIP2); } // PreTranslateMessage is required to process tool tip messages. BOOL CRouteDlg::PreTranslateMessage(MSG* pMsg) { // Let the ToolTip process the message. m_tooltip.RelayEvent(pMsg); return CDialog::PreTranslateMessage(pMsg); } Jim Schollenberger -----From: ganeshs@nationwide.com You need to call CToolTipCtrl::RelayEvent() in either PreTranslateMessage() (for a modeless dialog) or CWinApp::ProcessMessageFilter() (for a modal dialog, since it has it's own message loop->KB article Q135873 explains this process). Since you're using MFC version 4.2, you don't need to use ProcessMessageFilter() anymore! KB article Q141758 (a revision to Q135873) explains this... / ___| / ___| __ _ _ __ ___ ___| | \___ \ | | _ / _` | '_ \ / _ \/ __| '_ \ ___) | | |_| | (_| | | | | __/\__ \ | | | |____(_) \____|\__,_|_| |_|\___||___/_| |_|
| Вернуться в корень Архива |