Click here to Skip to main content
15,882,152 members
Articles / Web Development / HTML

A Comprehensive CE Class Library to Replace ATL and MFC

Rate me:
Please Sign up or sign in to vote.
4.48/5 (14 votes)
4 Oct 2000CPOL 278.1K   998   70  
A collection of classes for CE that do not use ATL or MFC, plus an FTP client, database viewer, and sample application that solves beam deflection equations.
// ToolTip.cpp : implementation file
//

#include "stdafx.h"
#include "CeToolTip.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CeToolTip

CeToolTip::CeToolTip()
{
	lpWndCls	= AfxRegisterWndClass(0);
	
	//Defaults
	m_bMouseIn	= false;
	m_bStuck	= false;
	
	m_iWidth = 100;
	m_iHeight = 60;

	m_clrBkColor = RGB(249,254,188); //light yellow
	m_clrFrameColor = RGB(0,0,255);  //blue
	m_clrTextColor = RGB(0,0,0);	 //black

	m_iFontHeight = 14;
	m_strFontName = _T("Arial");

	pCurrwnd = NULL;
}


CeToolTip::~CeToolTip()
{

	BTOOLINFO *stToolInfo;
	CWnd *pWnd;
	for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
	{
		m_ToolPtr.GetNextAssoc(pos, (void *&)pWnd, (void*&) stToolInfo);
		delete stToolInfo;
	}
	m_ToolPtr.RemoveAll();

}


BEGIN_MESSAGE_MAP(CeToolTip, CWnd)
	//{{AFX_MSG_MAP(CeToolTip)
	ON_WM_PAINT()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CeToolTip message handlers
BOOL CeToolTip::Create(CWnd* pParentWnd) 
{

	BOOL bRet = CWnd::CreateEx(NULL, lpWndCls, NULL,
		WS_POPUP, 0, 0, m_iWidth, m_iHeight,
		pParentWnd->GetSafeHwnd(), NULL, NULL);

	m_hParentWnd = pParentWnd->GetSafeHwnd();
	
	if(bRet)
		SetOwner(pParentWnd);

	return bRet;

}

void CeToolTip::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	CRect rectCl;
	GetClientRect(&rectCl);

	CRgn rgnComb;	
	rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);

	int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);
	if(iRetComb==ERROR)
	{
		AfxMessageBox("ERROR in Combining Region");
		return;
	}

	CBrush pBrush;
	pBrush.CreateSolidBrush(m_clrFrameColor);
	
	CBrush pBrush1;
	pBrush1.CreateSolidBrush(m_clrBkColor);
	
	dc.FillRgn( &rgnComb, &pBrush1);
	dc.FrameRgn(&rgnComb, &pBrush, 2, 1);

	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(m_clrTextColor);
	
	CFont *pFont = dc.SelectObject(&m_fontText);
	//dc.Rectangle(&m_RectText);

	CSize czTextWidth = dc.GetTextExtent(m_strText);
	
	if( czTextWidth.cx < m_RectText.Width())
		dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	else
		dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_WORDBREAK);
	
	

	dc.SelectObject(pFont);
	
}


int CeToolTip::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CRect rectCl;
	GetClientRect(&rectCl);

	int x=0, y=0;
	CRect rectTemp;

	rectTemp = rectCl;
	rectTemp.left = rectTemp.left + 10;
	
	x = (int)( (float)((float)rectTemp.Width() / 2.0) / 1.41421);
	y = (int)( (float)((float)rectTemp.Height() / 2.0) / 1.41421);

	m_RectText.top = ( (rectTemp.Height() / 2) - y);
	m_RectText.left = ( (rectTemp.Width() / 2) - x) + 10;
	m_RectText.right = ( (rectTemp.Width() / 2) + x) + 10;
	m_RectText.bottom = ( (rectTemp.Height() / 2) + y);

	rgn.m_hObject = NULL;
	rgnTri.m_hObject = NULL;
	rgnComb.m_hObject = NULL;

	BOOL bRegRet = rgn.CreateEllipticRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
		
	CPoint ptTri[3];
	ptTri[0].x = rectCl.left;
	ptTri[0].y = (rectCl.bottom / 2) - 10;

	ptTri[1].x = rectCl.left + 15;
	ptTri[1].y = (rectCl.bottom / 2) - 5;

	ptTri[2].x = rectCl.left + 15;
	ptTri[2].y = (rectCl.bottom / 2) + 5;
	
	ptTri[3].x = rectCl.left;
	ptTri[3].y = (rectCl.bottom / 2) - 10;

	BOOL bRegTriRet = rgnTri.CreatePolygonRgn(ptTri, 3, ALTERNATE);

	rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
	int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);

	if(iRetComb == ERROR)
	{
		AfxMessageBox("ERROR in Combining Region");
		return -1;
	}

	int bRgnWnd = SetWindowRgn(rgnComb.operator HRGN( ), TRUE);	

	m_fontText.CreateFont(m_iFontHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,m_strFontName);	
	
	return 0;
}

void CeToolTip::RelayEvent(LPMSG lpMsg)
{

	switch(lpMsg->message) 
	{
	case WM_KEYDOWN:
			if(IsWindowVisible())
			{		
				ShowWindow(SW_HIDE);
			}
			break;

	case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
			if(IsWindowVisible())
			{
				ShowWindow(SW_HIDE);
			}
			break;

	case WM_MOUSEMOVE:
		{
			CWnd *pFocusWnd = AfxGetApp()->m_pMainWnd->GetFocus();
			if(pFocusWnd==NULL)
				break;
			CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);

			HWND hWndTemp = ::GetParent(lpMsg->hwnd);
			
			CPoint pt;
			pt.x = lpMsg->pt.x;
			pt.y = lpMsg->pt.y;
			
			BTOOLINFO *stToolInfo;
			CWnd *pBToolWnd;
			
			for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
			{
				m_ToolPtr.GetNextAssoc(pos, (void *&)pBToolWnd, (void*&) stToolInfo);
				
				if(!m_bMouseIn)
				{
					if(lpMsg->hwnd == stToolInfo->hwndTool)
					{
					
						if(m_bStuck && IsWindowVisible())
						{
							SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
							ShowWindow(SW_SHOWNOACTIVATE);
						}

						m_bMouseIn = true;
						m_clrTextColor = stToolInfo->clrToolTextClr; 
						m_strText = stToolInfo->strToolText; 
						
						SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
						ShowWindow(SW_SHOWNOACTIVATE);
						
						pCurrwnd = stToolInfo->hwndTool;

						break;
					}
				}
				else
				{
					CRect rect;
					::GetWindowRect(pCurrwnd, &rect);
					if(m_bStuck && IsWindowVisible())
					{
						SetWindowPos(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
						ShowWindow(SW_SHOWNOACTIVATE);
					}
					
					
					CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);
					CWnd *WndPt = pWnd->WindowFromPoint(lpMsg->pt);
					if(WndPt->GetSafeHwnd() != pCurrwnd)
					{
						m_bMouseIn = false;
						ShowWindow(SW_HIDE);
					}
					

					break;
				}
			}
			
		}	
		break; //WM_MOUSEMOVE
	}
	 
}

void CeToolTip::AddTool(CWnd *pWnd, CString strText, COLORREF clrTextColor)
{

	BTOOLINFO *stToolInfo;

	if(!m_ToolPtr.Lookup( pWnd, ( void*& )  stToolInfo))
	{
		stToolInfo = new BTOOLINFO;
		stToolInfo->hwndTool = pWnd->GetSafeHwnd();
		stToolInfo->strToolText = strText;
		if(clrTextColor==NULL)
			stToolInfo->clrToolTextClr = m_clrTextColor;
		else
			stToolInfo->clrToolTextClr = clrTextColor;
	
		m_ToolPtr.SetAt(pWnd, stToolInfo);
	}

}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions