www.pudn.com > XRayImg.rar > PPTooltip.h


//
// Class: CPPTooltip
//
// Compiler: Visual C++
// Tested on: Visual C++ 6.0
// Visual C++ .NET 2003
//
// Version: See GetVersionC() or GetVersionI()
//
// Created: xx/xxxx/2004
// Updated: 21/November/2004
//
// Author: Eugene Pustovoyt pustovoyt@mail.ru
//
// Disclaimer
// ----------
// THIS SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED "AS IS" AND WITHOUT
// ANY WARRANTIES WHETHER EXPRESSED OR IMPLIED. NO REPONSIBILITIES FOR POSSIBLE
// DAMAGES OR EVEN FUNCTIONALITY CAN BE TAKEN. THE USER MUST ASSUME THE ENTIRE
// RISK OF USING THIS SOFTWARE.
//
// Terms of use
// ------------
// THIS SOFTWARE IS FREE FOR PERSONAL USE OR FREEWARE APPLICATIONS.
// IF YOU WISH TO THANK MY WORK, YOU MAY DONATE ANY SUM OF MONEY TO ME
// FOR SUPPORT OF DEVELOPMENT OF THIS CLASS.
// IF YOU USE THIS SOFTWARE IN COMMERCIAL OR SHAREWARE APPLICATIONS YOU
// ARE GENTLY ASKED TO DONATE ANY SUM OF MONEY TO THE AUTHOR:
//
//
//--- History ------------------------------
// 2004/03/01 *** Releases version 2.0 ***
//------------------------------------------
// 2004/04/04 [ADD] Added method SetCssStyles(DWORD dwIdCssStyle, LPCTSTR lpszPathDll /* = NULL */)
// 2004/04/14 [FIX] Fixed correct drawing for some tooltip's directions
// 2004/04/15 [FIX] Fixed changing a z-order of the some windows by show a tooltip on Win9x
// 2004/04/27 [FIX] Corrected a work with a tooltip's directions with a large tooltip
// 2004/04/28 [ADD] Disables a message translation if object was't created (thanks to Stoil Todorov)
// 2004/07/02 [UPD] Changes a GetWndFromPoint mechanism of the window's searching
// 2004/09/01 [ADD] New SetMaxTipWidth method was added
// 2004/10/12 [FIX] Now a tooltip has a different methods to show a menu's tooltip and other
// control's tooltip
//------------------------------------------
// 2004/11/19 *** Releases version 2.1 ***
//------------------------------------------
// 2004/11/30 [FIX] Corrected the debug window drawing
// [FIX] Changes a GetWndFromPoint mechanism of the window's searching
////////////////////////////////////////////////////////////////////
//
// "SmoothMaskImage" and "GetPartialSums" functions by Denis Sarazhinsky (c)2003
// Modified by Eugene Pustovoyt to use with image's mask instead of full color image.
//
/////////////////////////////////////////////////////////////////////
//

#ifndef _PPTOOLTIP_H
#define _PPTOOLTIP_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// PPTooltip.h : header file

#pragma warning(disable : 4786)

#include "PPHtmlDrawer.h"
#include <vector>
#include <map>

//ENG: Comments a next line if you never use a tooltip for a menu
//RUS: Закоментируйте следующую строку, если вы не планируете использовать тултип для элементов меню
#define PPTOOLTIP_USE_MENU

#define PPTOOLTIP_CLASSNAME _T("CPPToolTip") // Window class name

//The
#define UDM_TOOLTIP_FIRST (WM_USER + 100)
#define UDM_TOOLTIP_DISPLAY (UDM_TOOLTIP_FIRST) //User was changed the data
#define UDM_TOOLTIP_REPAINT (UDM_TOOLTIP_FIRST + 1)
#define UDM_TOOLTIP_HIDING (UDM_TOOLTIP_FIRST + 2)

//The behaviours
#define PPTOOLTIP_MULTIPLE_SHOW 0x00000001 //Multiple show for single control
#define PPTOOLTIP_TRACKING_MOUSE 0x00000002 //Tracking for mouse
#define PPTOOLTIP_CLOSE_LEAVEWND 0x00000004 //Close tooltip if mouse leave the control
#define PPTOOLTIP_NOCLOSE_OVER 0x00000008 //No close tooltip if mouse over him
#define PPTOOLTIP_DISABLE_AUTOPOP 0x00000010 //Disables autopop tooltip from timer
//#define PPTOOLTIP_NOCLOSE_MOUSEDOWN 0x00000020 //Disables autopop tooltip from timer

//The masks
#define PPTOOLTIP_MASK_STYLES 0x0001 // The styles for the tooltip gets from the structures
#define PPTOOLTIP_MASK_EFFECT 0x0002 // The background's type for the tooltip gets from the structures
#define PPTOOLTIP_MASK_COLORS 0x0004 // The background's colors for the tooltip gets from the structures
#define PPTOOLTIP_MASK_DIRECTION 0x0008 // The align for the tooltip gets from the structures
#define PPTOOLTIP_MASK_BEHAVIOUR 0x0010 // The behaviour for the tooltip gets from the structures
#define PPTOOLTIP_MASK_TRANSPARENCY 0x0020 //

//The constants of the timers
#define PPTOOLTIP_TIME_INITIAL TTDT_INITIAL
#define PPTOOLTIP_TIME_AUTOPOP TTDT_AUTOPOP
#define PPTOOLTIP_TIME_FADEIN 4
#define PPTOOLTIP_TIME_FADEOUT 5
#define PPTOOLTIP_TIME_ANIMATION 6

//Tooltip's directions
#define PPTOOLTIP_TOPEDGE_LEFT 0x00
#define PPTOOLTIP_TOPEDGE_RIGHT 0x01
#define PPTOOLTIP_TOPEDGE_CENTER 0x02
#define PPTOOLTIP_BOTTOMEDGE_LEFT 0x10
#define PPTOOLTIP_BOTTOMEDGE_RIGHT 0x11
#define PPTOOLTIP_BOTTOMEDGE_CENTER 0x12
#define PPTOOLTIP_LEFTEDGE_TOP 0x20
#define PPTOOLTIP_LEFTEDGE_BOTTOM 0x21
#define PPTOOLTIP_LEFTEDGE_VCENTER 0x22
#define PPTOOLTIP_RIGHTEDGE_TOP 0x30
#define PPTOOLTIP_RIGHTEDGE_BOTTOM 0x31
#define PPTOOLTIP_RIGHTEDGE_VCENTER 0x32
//----- Old version (1.x) ---------
#define PPTOOLTIP_LEFT_TOP PPTOOLTIP_TOPEDGE_LEFT
#define PPTOOLTIP_RIGHT_TOP PPTOOLTIP_TOPEDGE_RIGHT
#define PPTOOLTIP_LEFT_BOTTOM PPTOOLTIP_BOTTOMEDGE_LEFT
#define PPTOOLTIP_RIGHT_BOTTOM PPTOOLTIP_BOTTOMEDGE_RIGHT

#ifdef PPTOOLTIP_USE_MENU
//ENG: Anchor's position about a menu item
//RUS: Выравнивание кончика тултипа относительно элемента меню
#define PPTOOLTIP_MENU_LEFT 0x00
#define PPTOOLTIP_MENU_RIGHT 0x01
#define PPTOOLTIP_MENU_CENTER 0x02
#define PPTOOLTIP_MENU_TOP 0x00
#define PPTOOLTIP_MENU_BOTTOM 0x10
#define PPTOOLTIP_MENU_VCENTER 0x20

#define PPTOOLTIP_MENU_HMASK 0x0F
#define PPTOOLTIP_MENU_VMASK 0xF0
#endif //PPTOOLTIP_USE_MENU

// This info structure
typedef struct tagPPTOOLTIP_INFO
{
UINT nIDTool; // ID of tool
CRect rectBounds; // Bounding rect for toolinfo to be displayed
CString sTooltip; // The string of the tooltip
UINT nMask; // The mask
UINT nStyles; // The tooltip's styles
UINT nDirection; // Direction display the tooltip relate cursor point
UINT nEffect; // The color's type or effects
UINT nBehaviour; // The tooltip's behaviour
BYTE nGranularity; // The effect's granularity
BYTE nTransparency; // The factor of the window's transparency (0-100)
COLORREF crBegin; // Begin Color
COLORREF crMid; // Mid Color
COLORREF crEnd; // End Color
} PPTOOLTIP_INFO;

// This structure sent to PPTooltip parent in a WM_NOTIFY message
typedef struct tagNM_PPTOOLTIP_DISPLAY {
NMHDR hdr;
HWND hwndTool;
LPPOINT pt;
PPTOOLTIP_INFO * ti;
} NM_PPTOOLTIP_DISPLAY;

/////////////////////////////////////////////////////////////////////////////
// CPPToolTip window

class CPPToolTip : public CWnd
{
// friend BOOL CALLBACK EnumChildWinF(HWND hwnd, LPARAM lParam);
// Construction
public:
BOOL Create(CWnd* pParentWnd, BOOL bBalloon = TRUE);

CPPToolTip();
virtual ~CPPToolTip();

// Attributes
public:
enum { PPTTSZ_ROUNDED_CX = 0,
PPTTSZ_ROUNDED_CY,
PPTTSZ_MARGIN_CX,
PPTTSZ_MARGIN_CY,
PPTTSZ_WIDTH_ANCHOR,
PPTTSZ_HEIGHT_ANCHOR,
PPTTSZ_MARGIN_ANCHOR,
PPTTSZ_OFFSET_ANCHOR_CX,
PPTTSZ_OFFSET_ANCHOR_CY,

PPTTSZ_MAX_SIZES
};

enum { SHOWEFFECT_NONE = 0,
SHOWEFFECT_FADEINOUT,

SHOWEFFECT_MAX
};

// Operations
protected:
enum TooltipState {
PPTOOLTIP_STATE_HIDEN = 0,
PPTOOLTIP_STATE_SHOWING,
PPTOOLTIP_STATE_SHOWN,
PPTOOLTIP_STATE_HIDING
};

enum TooltipType {
PPTOOLTIP_NORMAL = 0,
PPTOOLTIP_HELP,
PPTOOLTIP_MENU
};

CPPHtmlDrawer m_drawer; //HTML drawer object

HWND m_hParentWnd; // The handle of the parent window
HWND m_hNotifyWnd; // The handle of the notified window

BOOL m_bHyperlinkEnabled;
BOOL m_bDebugMode;

POINT m_ptOriginal;

// Info about last displayed tool
HWND m_hwndDisplayedTool;
TooltipType m_nTooltipType;
PPTOOLTIP_INFO m_tiDisplayed; //Info about displayed tooltip

// Info about last displayed tool
BOOL m_bDelayNextTool;
BOOL m_bNextToolExist;
HWND m_hwndNextTool;
TooltipType m_nNextTooltipType;
PPTOOLTIP_INFO m_tiNextTool; //Info about next tooltip

// Info about current tool
CRect m_rcCurTool;
DWORD m_dwCurDirection;
BYTE m_dwCurTransparency;
TooltipState m_nTooltipState;

//Colors
COLORREF m_clrBeginBk;
COLORREF m_clrMidBk;
COLORREF m_clrEndBk;

//Background
HBITMAP m_hBitmapBk; //A bitmap with tooltip's background only
HBITMAP m_hUnderTooltipBk;

//Border of the tooltip
HBRUSH m_hbrBorder;
SIZE m_szBorder;

//Shadow of the tooltip
BOOL m_bGradientShadow;
SIZE m_szOffsetShadow;
SIZE m_szDepthShadow;
BYTE m_nDarkenShadow;

HRGN m_hrgnTooltip;

//Default values for the window
DWORD m_dwTimeAutoPop; //Retrieve the length of time the tool tip window remains visible if the pointer is stationary within a tool's bounding rectangle
DWORD m_dwTimeInitial; //Retrieve the length of time the pointer must remain stationary within a tool's bounding rectangle before the tool tip window appears
DWORD m_dwTimeFadeIn;
DWORD m_dwTimeFadeOut;

DWORD m_dwBehaviour; //The tooltip's behaviour
DWORD m_dwEffectBk;
DWORD m_dwDirection; //The default tooltip's direction
DWORD m_dwStyles;
BYTE m_nGranularity;
BYTE m_nTransparency; //The current value of transparency
DWORD m_dwShowEffect; //
DWORD m_dwHideEffect;
int m_nSizes [PPTTSZ_MAX_SIZES]; //All sizes

#ifdef PPTOOLTIP_USE_MENU
DWORD m_dwMenuToolPos;
#endif //PPTOOLTIP_USE_MENU

//
CRect m_rcTipArea; //The bound rect around the tip's area in the client coordinates.
CRect m_rcTooltip; //The bound rect around the body of the tooltip in the client coordinates.
CRect m_rcBoundsTooltip; //The bound rect around a tooltip include an anchor
CRect m_rcUnderTooltip; //The bound rect of the window under the tooltip in the screen coordinates

//Initialize tools
typedef std::vector<PPTOOLTIP_INFO> arHotArea; // array of Tips rectangular spots
typedef std::map<HWND, arHotArea>::iterator mapIter; // simplify reading
std::map<HWND, arHotArea> m_ToolMap;

//Initialize list of toolbars
typedef std::vector<HWND> arToolBarWnd;
arToolBarWnd m_wndToolBars; // array of HWND of the toolbars

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPPToolTip)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
virtual BOOL DestroyWindow();
//}}AFX_VIRTUAL

// Implementation
public:
BOOL RelayEvent(MSG* pMsg);

//Tools
void AddToolBar(CToolBar * pBar);
void AddTool(CWnd * pWnd, DWORD dwIdString, LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void AddTool(CWnd * pWnd, LPCTSTR lpszString = NULL, LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void AddTool(CWnd * pWnd, PPTOOLTIP_INFO &amt; ti);
//To compatible with old version of CPPToolTip
void AddTool(CWnd * pWnd, DWORD dwIdString, HICON hIcon, LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void AddTool(CWnd * pWnd, DWORD dwIdString, DWORD dwIdIcon, CSize &amt; szIcon = CSize(0, 0), LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void AddTool(CWnd * pWnd, LPCTSTR lpszString, HICON hIcon, LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void AddTool(CWnd * pWnd, LPCTSTR lpszString, DWORD dwIdIcon, CSize &amt; szIcon = CSize(0, 0), LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void AddTool(CWnd * pWnd, LPCTSTR lpszString, DWORD dwIdBitmap, COLORREF crMask, CSize &amt; szBitmap = CSize(0, 0), LPCRECT lpRectBounds = NULL, DWORD dwIDTool = 0);
void RemoveTool(CWnd * pWnd, LPCRECT lpRectBounds = NULL);
void RemoveAllTools();

BOOL GetToolInfo(PPTOOLTIP_INFO &amt; ti, CWnd * pWnd, LPCRECT lpRectBounds = NULL);
BOOL GetToolInfo(PPTOOLTIP_INFO &amt; ti, CWnd * pWnd, DWORD dwIDTool = 0);
void UpdateTipText(LPCTSTR lpszText, CWnd * pWnd, DWORD dwIDTool = 0);
void DelTool(CWnd * pWnd, DWORD dwIDTool = 0);
void SetToolRect(CWnd * pWnd, DWORD dwIDTool, LPCRECT lpRectBounds);

//Help tooltip
void ShowHelpTooltip (LPPOINT pt, DWORD dwIdText, HICON hIcon = NULL);
void ShowHelpTooltip (LPPOINT pt, DWORD dwIdText, DWORD dwIdIcon, CSize &amt; szIcon = CSize(0, 0));
void ShowHelpTooltip (LPPOINT pt, LPCTSTR lpszString, HICON hIcon = NULL);
void ShowHelpTooltip (LPPOINT pt, LPCTSTR lpszString, DWORD dwIdIcon, CSize &amt; szIcon = CSize(0, 0));
void ShowHelpTooltip (LPPOINT pt, PPTOOLTIP_INFO &amt; ti);
void HideTooltip();

// color's functions
void SetColorBk(COLORREF color);
void SetColorBk(COLORREF clrBegin, COLORREF clrEnd);
void SetColorBk(COLORREF clrBegin, COLORREF clrMid, COLORREF clrEnd);
void SetEffectBk(DWORD dwEffect, BYTE nGranularity = 5);

//behaviour's methods
void SetBehaviour(DWORD dwBehaviour = 0);
DWORD GetBehaviour();

void SetDelayTime(DWORD dwDuration, DWORD dwTime);
DWORD GetDelayTime(DWORD dwDuration) const;

void SetImageList(UINT nIdBitmap, int cx, int cy, int nCount, COLORREF crMask = RGB(255, 0, 255));
void SetImageList(HBITMAP hBitmap, int cx, int cy, int nCount, COLORREF crMask = RGB(255, 0, 255));

//functions for sizes
void SetSize(int nSizeIndex, int nValue);
int GetSize(int nSizeIndex);
void SetDefaultSizes(BOOL bBalloonSize = TRUE);

//functions for direction
void SetDirection (DWORD dwDirection = PPTOOLTIP_BOTTOMEDGE_LEFT);
DWORD GetDirection();

void SetCallbackHyperlink(HWND hWnd, UINT nMessage, LPARAM lParam = 0);

void EnableHyperlink(BOOL bEnable = TRUE);
void SetDebugMode(BOOL bDebug = TRUE);

// void EnableTextWrap(BOOL bEnable = TRUE){m_drawer.EnableTextWrap(bEnable);};
void SetMaxTipWidth(int nWidth = 0){m_drawer.SetMaxWidth(nWidth);};

//functions for
void SetNotify(HWND hWnd);
void SetNotify(BOOL bParentNotify = TRUE);

void SetTextStyle(LPCTSTR lpszStyleName, LPCTSTR lpszStyleValue);
void SetCssStyles(LPCTSTR lpszCssStyles = NULL);
void SetCssStyles(DWORD dwIdCssStyle, LPCTSTR lpszPathDll = NULL); //Sets the CSS styles
LPCTSTR GetCssStyles();

void EnableEscapeSequences(BOOL bEnable);

void HideBorder();
void SetBorder(COLORREF color, int nWidth = 1, int nHeight = 1);
void SetBorder(HBRUSH hbr, int nWidth = 1, int nHeight = 1);

//Transparency of tooltip
void SetTransparency(BYTE nTransparency = 0);
inline BYTE GetTransparency() {return m_nTransparency;};

//Shadow of the tooltip
void SetTooltipShadow(int nOffsetX, int nOffsetY, BYTE nDarkenPercent = 50, BOOL bGradient = TRUE, int nDepthX = 7, int nDepthY = 7);
void SetImageShadow(int nOffsetX, int nOffsetY, BYTE nDarkenPercent = 50, BOOL bGradient = TRUE, int nDepthX = 7, int nDepthY = 7);

#ifdef PPTOOLTIP_USE_MENU
//Methods for the menu
void MenuToolPosition(DWORD nPos = PPTOOLTIP_MENU_LEFT | PPTOOLTIP_MENU_TOP);
inline DWORD GetMenuToolPosition() {return m_dwMenuToolPos;};
void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSubMenu);
void OnEnterIdle(UINT nWhy, CWnd* pWho);
HWND GetRunningMenuWnd();
#endif //PPTOOLTIP_USE_MENU

static short GetVersionI() {return 0x22;}
static LPCTSTR GetVersionC() {return (LPCTSTR)_T("2.2 beta");}

private:
virtual void OnDrawBorder(HDC hDC, HRGN hRgn);

// Generated message map functions
protected:
void Pop();
void KillTimers(DWORD dwIdTimer = NULL);
void SetNewTooltip(HWND hWnd, const PPTOOLTIP_INFO &amt; ti, BOOL bDisplayWithDelay = TRUE, TooltipType type = PPTOOLTIP_NORMAL);
HWND GetWndFromPoint(LPPOINT lpPoint, PPTOOLTIP_INFO &amt; ti, BOOL bCheckTool = TRUE);
LRESULT SendNotify(LPPOINT pt, PPTOOLTIP_INFO &amt; ti);

BOOL IsCursorOverTooltip() const;
inline BOOL IsVisible() const {return ((GetStyle() &amt; WS_VISIBLE) == WS_VISIBLE);}
BOOL IsNotify(); //Is enabled notification

void PrepareDisplayTooltip(LPPOINT lpPoint);
void OnRedrawTooltip(HDC hDC, BYTE nTransparency = 0);

void OutputTooltipOnScreen(LPPOINT lpPoint, HDC hDC = NULL);
void SetAutoPopTimer(); //Sets autopop timer

void FreeResources();
CString GetDebugInfoTool(LPPOINT lpPoint);

DWORD GetTooltipDirection(DWORD dwDirection, const CPoint &amt; ptPoint, CPoint &amt; ptAnchor, CRect &amt; rcBody, CRect &amt; rcFull, CRect &amt; rcTipArea);
HRGN GetTooltipRgn(DWORD dwDirection, int x, int y, int nWidth, int nHeight);

CString GetMaxDebugString(LPCTSTR lpszText);
CString CreateDebugCell(CString sTitle, LPCTSTR lpszDescription);

BOOL FindTool(HWND hWnd, const LPPOINT lpPoint, PPTOOLTIP_INFO &amt; ti);
HWND FindTool(const LPPOINT lpPoint, PPTOOLTIP_INFO &amt; ti);
HWND FindToolBarItem(POINT point, PPTOOLTIP_INFO &amt; ti);
BOOL IsComboBoxControl(HWND hWnd, UINT nStyle);

//{{AFX_MSG(CPPToolTip)
afx_msg void OnPaint();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
//}}AFX_MSG
#if _MSC_VER < 1300
afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
#else
afx_msg void OnActivateApp(BOOL bActive, DWORD hTask);
#endif
afx_msg LRESULT OnRepaintWindow(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};

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

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif