15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


How to add Tooltip support for the CStatusBar?

dle@abbott.SanDiegoCA.ATTGIS.COM
Sunday, January 28, 1996

Hi,

I would like to add tooltip support for the CStatusBar in my
MDI application.  I created the application using the AppWizard.
I have tried two methods, but both of them are not working for me.

Method 1:
I created a new class CMyStatusBar derived from CStatusBar.  I 
added "EnableToolTip(TRUE)" call in to CMyStatusBar::OnCreate method.
Then I added CMyStatusBar::OnToolHitTest(...)  

Method 2:
I added a CToolTipCtrl m_ToolTip attribute to my CMainFrame class.
In the OnCreate method, I did this:
	m_ToolTip.create(this);

	CString str;
	str.LoadString(IDS_PRESS_HERE);
	m_ToolTip.AddTool(this, str, &rect, ID_VIEW_STATUS_BAR);
	m_ToolTip.Activate(TRUE):

But the two methods did not work.

What did I do wrong?  A sample code would be nice.
I am using MSVC4.0 and win95/NT3.51

--Jake


-- 



Roy Browning -- ctf@friday.houston.net
Monday, January 29, 1996

[Mini-digest: 3 responses]

>I would like to add tooltip support for the CStatusBar in my
>MDI application.  I created the application using the AppWizard.
>I have tried two methods, but both of them are not working for me.
>
>Method 1:
>I created a new class CMyStatusBar derived from CStatusBar.  I 
>added "EnableToolTip(TRUE)" call in to CMyStatusBar::OnCreate method.
>Then I added CMyStatusBar::OnToolHitTest(...)  
>
>Method 2:
>I added a CToolTipCtrl m_ToolTip attribute to my CMainFrame class.
>In the OnCreate method, I did this:

>What did I do wrong?  A sample code would be nice.
>I am using MSVC4.0 and win95/NT3.51

Jake;

If you ToolBar buttons are associated with menu items ( the normal case )
then all you have to do is the following:

    append "\nText" to the prompt string;

    Example Menu item:

        ID:         ID_EDIT_COPY
        Caption     &Copy\tCtrl+C
        Prompt      Copy the selection and put it on the Clipboard\nCopy


Believe it or not it is just that simple, took me awhile to catch on myself.

Roy Browning

////////////////////////////////////////

C o n t r o l l i n g  the  F u t u r e
    Software Design & Development

            800-CTF-0032

    Roy Browning - ctf@sccsi.com

///////////////////////////////////////


-----From: Huaming Hu 

I don't know how exactly you implemet OnToolHiTest(), but the
following codes works for me. Specify tool tip text as the way you
do for tool bar buttons. The only limitation I know now is that tool
tip text can not be changed inside program.

int CMyStatusBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
	ASSERT_VALID(this);
	ASSERT(::IsWindow(m_hWnd));

	// check child windows first by calling CControlBar
	int nHit = CControlBar::OnToolHitTest(point, pTI);
	if (nHit != -1)
		return nHit;

	// now hit test against CTipStatusBar panes
	int nPanes = GetCount();
	for (int i = 0; i < nPanes; i++)
	{
		CRect rect;
		GetItemRect(i, &rect);
		if (rect.PtInRect(point))
		{
			int nHit = GetItemID(i);
			if (pTI != NULL)
			{
				pTI->hwnd = m_hWnd;
				pTI->rect = rect;
				pTI->uId = nHit;
				pTI->lpszText = LPSTR_TEXTCALLBACK;
			}
			// found matching rect, return the ID of the pane
			return nHit != 0 ? nHit : -1;
		}
	}
	return -1;
}

>
>Method 2:
>I added a CToolTipCtrl m_ToolTip attribute to my CMainFrame class.
>In the OnCreate method, I did this:
>	m_ToolTip.create(this);
>
>	CString str;
>	str.LoadString(IDS_PRESS_HERE);
>	m_ToolTip.AddTool(this, str, &rect, ID_VIEW_STATUS_BAR);
>	m_ToolTip.Activate(TRUE):
>
>But the two methods did not work.

I didn't try this way. But at least you miss one thing:
	you need to relay all mainframe WM_MOUSEMOVE, WM_LBUTTONDOWN,
WM_LBUTTONUP, WM_RBUTTONDOWN, and WM_RBUTTONUP messages
to the tool tip control (for example, by setting window get-message hook.)

Hope this will help!

Hua M. Hu
-------------------------------------
Name: Hua Ming Hu
Western Geophysical
E-mail: hu@wgcgps.com
01/30/96 15:41:20
-------------------------------------

-----From: Stephan.Jou@Cognos.COM (Jou, Stephan)


Jake:

I finally got tool tips working for a CListBox-derived object (different 
tool tips depending on which item the cursor is over).  The principles 
should be the same for a CStatusBar object, so here's how I did it.

(Note:  I tried the EnableToolTip() approach too, but in vain.  It appears 
that it works great if you are using a different tool tip for different 
child windows/controls, which was not the case for me (and presumably for 
you).  I'd love to be told I'm wrong and given an easier approach than the 
one I did, though.)

I simplified the code;  obviously you shouldn't hard code as much as I did 
here for this example.

1. I derived a class from CListBox;  let's call it CMyListBox.

2. I added CToolTipCtrl m_ToolTipCtrl as a member.

3. In CMyListBox::OnCreate:
          :
     // Enable tool tips.
     VERIFY( m_ToolTipCtrl.Create( this ) );

     // Register three regions with the tool tip.
     CRect rect;
     rect.SetEmptyRect();     // For now.  They are properly set in 
OnSize().

     m_ToolTipCtrl.AddTool( this, LPSTR_TEXTCALLBACK, rect, 1 ); // first 
region
     m_ToolTipCtrl.AddTool( this, LPSTR_TEXTCALLBACK, rect, 2 ); // second 
region
     m_ToolTipCtrl.AddTool( this, LPSTR_TEXTCALLBACK, rect, 3 ); // third 
region         

4. In CMyListBox::OnSize:
          :
     // Compute the bounding rectangles of my "tools" (really just hot 
regions within my control.
     CRect rect1;
     CRect rect2;
     CRect rect3;

     rect1.SetRect ...   // probably depends on the current size of the 
client window
     rect2.SetRect ...
     rect3.SetRect ...

     // Update the rectangles.
     m_ToolTipCtrl.SetToolRect( this, 1, rect1 );
     m_ToolTipCtrl.SetToolRect( this, 2, rect2 );
     m_ToolTipCtrl.SetToolRect( this, 3, rect3 );

5. The tricky part.  To set the tool tip text dynamically (in my situation 
the text can change at run time, whcih is why I used call backs), you need 
to override WM_NOTIFY in CMyListBox::OnNotify:

     LPNMHDR lpNotifyStruct = (LPNMHDR) lParam;
     switch( lpNotifyStruct->code ) {
     case TTN_NEEDTEXT: {
          LPTOOLTIPTEXT lpToolTipText = (LPTOOLTIPTEXT) lpNotifyStruct;

          // Which region are we over?
          const int iRegion = GetTopIndex() + lpToolTipText->hdr.idFrom;

          // Set the tool tip text.
          CString s;
          s.Format( "Region %d", iRegion );  // Do something more 
appropriate here.

          // Put it into a temporary buffer.
          static CHAR szBuffer[255];
          ASSERT( s.GetLength() < 255 );
          strcpy( szBuffer, s );

          // Pass it on to the tool tip.
          lpToolTipText->lpszText = szBuffer;

          *pResult = 0;
          return TRUE;
     }
     :

6. Finally, this is probably why your solution didn't work.  You need to 
make sure that mouse messages are relayed to your tool tip control. 
 Override PreTranslateMessage:

     BOOL CMyListBox::PreTranslateMessage(MSG* pMsg)
     {
          // Make sure the tool tip gets a crack at messages.
          m_ToolTipCtrl.RelayEvent( pMsg );
          return CListBox::PreTranslateMessage(pMsg);
     }


Hope that helps,
Stephan Jou,
Stephan.Jou@cognos.com, stephan@synapse.net



dle@abbott.SanDiegoCA.ATTGIS.COM
Tuesday, January 30, 1996

Forwarded message:
>From dle Tue Jan 30 20:30:20 1996
Subject: Re: How to add Tooltip support for the CStatusBar?
To: hu@wgcgps.com (Huaming Hu)
Date: Tue, 30 Jan 1996 20:30:20 -0800 (PST)
From: "Jake Q. Le" 
In-Reply-To:  from "Huaming Hu" at Jan 30, 96 03:41:20 pm
Organization: AT&T Global Information Solutions - San Diego 
Reply-To: Jake.Le@SanDiegoCA.ATTGIS.COM (Jake Quoc Le)
X-Mailer: ELM [version 2.4 PL24]
Content-Type: text
Content-Length: 3343      

Huaming and Jou,

I combined Jou's OnNotify method and Huaming's EnableTooltips(TRUE) and
OnToolHitTest(..).  Now, I got my CStatusBar class enable to
support Tooltip.  Thanks.

By the way, I don't know if this is a bug or a undocumented feature,
there is a new, undocumented MFC class.  The new class is
CToolInfo.  I got a compile error when I tried to pass in LPTOOLINFO
struct into CToolTipCtrl::GetToolInfo(LPTOOLINFO, CWnd *, int).  
You must pass in CToolInfo & in order for it your program to 
compile...

I search the online help and MSDN but were unsuccessful to find anything
on CToolInfo.  

--Jake

>
>>I would like to add tooltip support for the CStatusBar in my
>>MDI application.  I created the application using the AppWizard.
>>I have tried two methods, but both of them are not working for me.
>>
>>Method 1:
>>I created a new class CMyStatusBar derived from CStatusBar.  I 
>>added "EnableToolTip(TRUE)" call in to CMyStatusBar::OnCreate method.
>>Then I added CMyStatusBar::OnToolHitTest(...)  
>
>I don't know how exactly you implemet OnToolHiTest(), but the
>following codes works for me. Specify tool tip text as the way you
>do for tool bar buttons. The only limitation I know now is that tool
>tip text can not be changed inside program.
>
>int CMyStatusBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
>{
>	ASSERT_VALID(this);
>	ASSERT(::IsWindow(m_hWnd));
>
>	// check child windows first by calling CControlBar
>	int nHit = CControlBar::OnToolHitTest(point, pTI);
>	if (nHit != -1)
>		return nHit;
>
>	// now hit test against CTipStatusBar panes
>	int nPanes = GetCount();
>	for (int i = 0; i < nPanes; i++)
>	{
>		CRect rect;
>		GetItemRect(i, &rect);
>		if (rect.PtInRect(point))
>		{
>			int nHit = GetItemID(i);
>			if (pTI != NULL)
>			{
>				pTI->hwnd = m_hWnd;
>				pTI->rect = rect;
>				pTI->uId = nHit;
>				pTI->lpszText = LPSTR_TEXTCALLBACK;
>			}
>			// found matching rect, return the ID of the pane
>			return nHit != 0 ? nHit : -1;
>		}
>	}
>	return -1;
>}
>
>>
>>Method 2:
>>I added a CToolTipCtrl m_ToolTip attribute to my CMainFrame class.
>>In the OnCreate method, I did this:
>>	m_ToolTip.create(this);
>>
>>	CString str;
>>	str.LoadString(IDS_PRESS_HERE);
>>	m_ToolTip.AddTool(this, str, &rect, ID_VIEW_STATUS_BAR);
>>	m_ToolTip.Activate(TRUE):
>>
>>But the two methods did not work.
>
>I didn't try this way. But at least you miss one thing:
>	you need to relay all mainframe WM_MOUSEMOVE, WM_LBUTTONDOWN,
>WM_LBUTTONUP, WM_RBUTTONDOWN, and WM_RBUTTONUP messages
>to the tool tip control (for example, by setting window get-message hook.)
>
>Hope this will help!
>
>Hua M. Hu
>-------------------------------------
>Name: Hua Ming Hu
>Western Geophysical
>E-mail: hu@wgcgps.com
>01/30/96 15:41:20
>-------------------------------------
>
>


-- 
\\\======================================================================\\\
\\\                 AT&T Global Information Solutions                    \\\
\\\----------------------------------------------------------------------\\\
\\\ Jake Q. Le                    || Jake.Le@SanDiegoCA.ATTGIS.COM       \\\
\\\ 17089 Via Del Campo           || http://jakepc.SanDiegoCA.ATTGIS.COM \\\
\\\ San Diego, CA 92127           ||                                     \\\
\\\======================================================================\\\


-- 
\\\======================================================================\\\
\\\                 AT&T Global Information Solutions                    \\\
\\\----------------------------------------------------------------------\\\
\\\ Jake Q. Le                    || Jake.Le@SanDiegoCA.ATTGIS.COM       \\\
\\\ 17089 Via Del Campo           || http://jakepc.SanDiegoCA.ATTGIS.COM \\\
\\\ San Diego, CA 92127           ||                                     \\\
\\\======================================================================\\\




| Вернуться в корень Архива |