BalloonHelp.h
上传用户:lswyart
上传日期:2008-06-12
资源大小:3441k
文件大小:16k
源码类别:

杀毒

开发平台:

Visual C++

  1. /*-----------------------------------------------------------------------------
  2. # Name:        BalloonHelp.h
  3. # Product:     ClamWin Antivirus
  4. #
  5. # Licence:     
  6. #   This program is free software; you can redistribute it and/or modify
  7. #   it under the terms of the GNU General Public License as published by
  8. #   the Free Software Foundation; either version 2 of the License, or
  9. #   (at your option) any later version.
  10. #   This program is distributed in the hope that it will be useful,
  11. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #   GNU General Public License for more details.
  14. #   You should have received a copy of the GNU General Public License
  15. #   along with this program; if not, write to the Free Software
  16. #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #-----------------------------------------------------------------------------
  18. # 11 May 2004 Alch - Converted the class to pure win32 api - no MFC
  19. */
  20. // ******************************************************************************
  21. // BalloonHelp.cpp : header file
  22. // Copyright 2001-2002, Joshua Heyer
  23. //  You are free to use this code for whatever you want, provided you
  24. // give credit where credit is due.  (I seem to get a lot of questions
  25. // about that statement...  All i mean is, don't copy huge bits of code
  26. // and then claim you wrote it.  You don't have to put my name in an about
  27. // box or anything.  Though i'm not going to stop you if that's really what
  28. // you want :~) )
  29. //  I'm providing this code in the hope that it is useful to someone, as i have
  30. // gotten much use out of other peoples code over the years.
  31. //  If you see value in it, make some improvements, etc., i would appreciate it 
  32. // if you sent me some feedback.
  33. //
  34. // ******************************************************************************
  35. // ?/??/02 - Release #3: incomplete
  36. //
  37. //    Minor changes, bug fixes.
  38. // I fixed an ugly bug where deallocated memory was accessed when using the
  39. // strURL parameter to open a file or location when the balloon was clicked.
  40. // I also fixed a minor but very visible bug in the demo.
  41. // Added a couple of new options: 
  42. //    unDELAY_CLOSE works in tandem with a timeout value to delay the action
  43. // caused by the other unCLOSE_* options.  This allows you to keep a balloon
  44. // active indefinately, until the user gets back from coffee break, etc., and
  45. // has time to take a look at it.  For long timeout values, i'd advise also
  46. // using unSHOW_CLOSE_BUTTON so the user can get rid of it quickly if need be.
  47. //    unDISABLE_XP_SHADOW is exactly what it sounds like: if set, that cool
  48. // dropshadow XP uses for tooltips and menus isn't shown.  Note that the user
  49. // can also disable dropshadows globally, in which case this option has no effect.
  50. // ---
  51. // 5/30/02 - Release #2: i begin versioning
  52. //
  53. //    I suppose i should have kept a progress log for this.
  54. // But i didn't, so you'll just have to assume it was mostly right to begin with.
  55. // And i'll further confuse this by versioning it R2, even though it's the 
  56. // fourth release (?) (i haven't been keeping track, heheh).
  57. // I will, however, thank several people who have shown me better ways to do
  58. // things, and thus improved the class greatly.
  59. //
  60. // Thanks to:
  61. // Jan van den Baard for showing me the right way to use AnimateWindow(),
  62. //    and for demonstrating how WM_NCHITTEST can be used to provide hot tracking.
  63. //    Check out his ClassLib library on CP!
  64. // Maximilian H鋘el for his WTL port, and for demonstrating therein a
  65. //    nicer way to handle message hooks.
  66. // Mustafa Demirhan for the original idea and code for using keyboard hooks.
  67. // All the other people who have provided suggestions, feeback, and code on the
  68. // CP forums.  This class would not be half as useful as it is without you all.
  69. //
  70. // Ported from MFC to native win32 by Alch <alch at users dot sourceforge dot net
  71. // ******************************************************************************
  72. #ifndef _BALLOON_HELP_H_INCLUDED_
  73. #define _BALLOON_HELP_H_INCLUDED_
  74. // This was introduced to me by Maximilian H鋘el in his WTL port.  Cool, eh?
  75. ////////////////////////////////////////////////////////////////////////////////
  76. // The class _ThunkImpl is a renamed version of Andrew Nosenko CAuxThunk implementation.
  77. // Thanks Andrew, it's a fantastic class!
  78. //
  79. // Copyright (c) 1997-2001 by Andrew Nosenko <andien@nozillium.com>,
  80. // (c) 1997-1998 by Computer Multimedia System, Inc.,
  81. // (c) 1998-2001 by Mead & Co Limited
  82. //
  83. // http://www.nozillium.com/atlaux/
  84. // Version: 1.10.0021
  85. //
  86. #ifndef _M_IX86
  87. #pragma message("_ThunkImpl/ is implemented for X86 only!")
  88. #endif
  89. #pragma pack(push, 1)
  90. template <class T>
  91. class _ThunkImpl
  92. {
  93. private:
  94. BYTE m_mov; // mov ecx, %pThis
  95. DWORD m_this;  //
  96. BYTE m_jmp; // jmp func
  97. DWORD m_relproc; // relative jmp
  98. protected:
  99. typedef LRESULT (T::*TMFP)(int, unsigned int, long int);
  100. void InitThunk(TMFP method, const T* pThis)
  101. {
  102. union { DWORD func; TMFP method; } addr;
  103. addr.method = (TMFP)method;
  104. m_mov  = 0xB9;
  105. m_this = (DWORD)pThis;
  106. m_jmp  = 0xE9;
  107. m_relproc = addr.func - (DWORD)(this+1);
  108. ::FlushInstructionCache(GetCurrentProcess(), this, sizeof(*this));
  109. }
  110. FARPROC GetThunk() const 
  111.    {
  112. #ifdef _MSC_VER
  113. _ASSERTE(m_mov == 0xB9);
  114. #endif
  115. return (FARPROC)this; 
  116.    }
  117. };
  118. #pragma pack(pop) // _ThunkImpl
  119. // we need these three dummy classes so we can 
  120. // derive more than once from _ThunkImpl
  121. template <class T>
  122. class BHMouseHookThunk: public _ThunkImpl<T> {};
  123. template <class T>
  124. class BHKeybHookThunk: public _ThunkImpl<T> {};
  125. template <class T>
  126. class BHCallWndRetHookThunk: public _ThunkImpl<T> {};
  127. class CBalloonHelp : public CWnd,
  128.                      public BHKeybHookThunk<CBalloonHelp>,
  129.                      public BHMouseHookThunk<CBalloonHelp>,
  130.                      public BHCallWndRetHookThunk<CBalloonHelp>
  131. {
  132. public:
  133. CBalloonHelp();
  134. virtual ~CBalloonHelp();
  135.    // options
  136.    static const unsigned int unCLOSE_ON_LBUTTON_UP;   // closes window on WM_LBUTTON_UP
  137.    static const unsigned int unCLOSE_ON_MBUTTON_UP;   // closes window on WM_MBUTTON_UP
  138.    static const unsigned int unCLOSE_ON_RBUTTON_UP;   // closes window on WM_RBUTTON_UP
  139.    static const unsigned int unCLOSE_ON_LBUTTON_DOWN; // closes window on WM_LBUTTON_DOWN
  140.    static const unsigned int unCLOSE_ON_MBUTTON_DOWN; // closes window on WM_MBUTTON_DOWN
  141.    static const unsigned int unCLOSE_ON_RBUTTON_DOWN; // closes window on WM_RBUTTON_DOWN
  142.    static const unsigned int unCLOSE_ON_MOUSE_MOVE;   // closes window when user moves mouse past threshhold
  143.    static const unsigned int unCLOSE_ON_KEYPRESS;     // closes window on the next keypress message sent to this thread.
  144.    static const unsigned int unCLOSE_ON_ANYTHING;     // all of the above
  145.    static const unsigned int unDELAY_CLOSE;           // when a user action triggers the close, begins timer.  closes when timer expires.
  146.    static const unsigned int unDELETE_THIS_ON_CLOSE;  // deletes object when window is closed.  Used by LaunchBalloon(), use with care
  147.    static const unsigned int unSHOW_CLOSE_BUTTON;     // shows close button in upper right
  148.    static const unsigned int unSHOW_INNER_SHADOW;     // draw inner shadow in balloon
  149.    static const unsigned int unSHOW_TOPMOST;          // place balloon above all other windows
  150.    static const unsigned int unDISABLE_XP_SHADOW;     // disable Windows XP's drop-shadow effect (overrides system and user settings)
  151.    static const unsigned int unDISABLE_FADEIN;        // disable the fade-in effect (overrides system and user settings)
  152.    static const unsigned int unDISABLE_FADEOUT;       // disable the fade-out effect (overrides system and user settings)
  153.    static const unsigned int unDISABLE_FADE;          // disable the fade-in/fade-out effects (overrides system and user settings)
  154.    BOOL Create(const CStdString& strTitle,         // title of balloon
  155.                const CStdString& strContent,       // content of balloon
  156.                POINT& ptAnchor,          // anchor (tail position) of balloon
  157.                unsigned int unOptions,          // options (see above)
  158.                HWND hParentWnd = NULL,         // parent window (NULL == MFC main window)
  159.                const CStdString strURL = "",       // URL to open (ShellExecute()) when clicked
  160.                unsigned int unTimeout = 0,      // delay before closing automatically (milliseconds)
  161.                HICON hIcon = NULL);             // icon to display
  162.    // Show a help balloon on screen.
  163.    static void LaunchBalloon(const CStdString& strTitle, const CStdString& strContent, 
  164.                POINT& ptAnchor, 
  165.                LPCTSTR szIcon = IDI_EXCLAMATION,
  166.                unsigned int unOptions = unSHOW_CLOSE_BUTTON|CBalloonHelp::unSHOW_INNER_SHADOW|CBalloonHelp::unSHOW_TOPMOST,
  167.                HWND hParentWnd = NULL, 
  168.                const CStdString strURL = "",
  169.                unsigned int unTimeout = 10000);
  170.    // Sets the font used for drawing the balloon title.  Deleted by balloon, do not use CFont* after passing to this function.
  171.    void SetTitleFont(HFONT hFont);
  172.    // Sets the font used for drawing the balloon content.  Deleted by balloon, do not use CFont* after passing to this function.
  173.    void SetContentFont(HFONT hFont);
  174.    // Sets the icon displayed in the top left of the balloon (pass NULL to hide icon)
  175.    void SetIcon(HICON hIcon);
  176.    // Sets the icon displayed in the top left of the balloon (pass NULL to hide icon)
  177.    void SetIconScaled(HICON hIcon, int cx, int cy);
  178.    // Sets the icon displayed in the top left of the balloon (pass NULL hBitmap to hide icon)
  179.    void SetIcon(HBITMAP hBitmap, COLORREF crMask);
  180.    // Sets the icon displayed in the top left of the balloon
  181.    void SetIcon(HBITMAP hBitmap, HBITMAP hMask);
  182.    // Set icon displayed in the top left of the balloon to image # nIconIndex from pImageList
  183.    void SetIcon(HIMAGELIST hImageList, int nIconIndex);
  184.    // Sets the URL to be opened when balloon is clicked.  Pass "" to disable.
  185.    void SetURL(const CStdString& strURL);
  186.    // Sets the number of milliseconds the balloon can remain open.  Set to 0 to disable timeout.
  187.    void SetTimeout(unsigned int unTimeout);
  188.    // Sets the distance the mouse must move before the balloon closes when the unCLOSE_ON_MOUSE_MOVE option is set.
  189.    void SetMouseMoveTolerance(int nTolerance);
  190.    // Sets the point to which the balloon is "anchored"
  191.    void SetAnchorPoint(POINT& ptAnchor, HWND hWndAnchor = NULL);
  192.    // Sets the title of the balloon
  193.    void SetTitle(const CStdString& strTitle);
  194.    // Sets the content of the balloon (plain text only)
  195.    void SetContent(const CStdString& strContent);
  196.    // Sets the forground (text and border) color of the balloon
  197.    void SetForegroundColor(COLORREF crForeground);
  198.    // Sets the background color of the balloon
  199.    void SetBackgroundColor(COLORREF crBackground);   
  200. protected:
  201. // message handler
  202. LRESULT CALLBACK WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  203.    // layout constants
  204.    static const int nTIP_TAIL;
  205.    static const int nTIP_MARGIN;
  206.    // calculate anchor position (adjust for client coordinates if used)
  207.    POINT GetAnchorPoint();
  208.    // determine bounds of screen anchor is on (Multi-Monitor compatibility)
  209.    void GetAnchorScreenBounds(RECT& rect);
  210.    // determine section of the screen balloon is on
  211.    enum BALLOON_QUADRANT { BQ_TOPRIGHT, BQ_TOPLEFT, BQ_BOTTOMRIGHT, BQ_BOTTOMLEFT };
  212.    BALLOON_QUADRANT GetBalloonQuadrant();
  213.    // Draw the non-client area
  214.    virtual void DrawNonClientArea(HDC hDC);
  215.    // Draw the client area
  216.    virtual void DrawClientArea(HDC hDC);
  217.    // Calculate the dimensions and draw the balloon header
  218.    virtual SIZE DrawHeader(HDC hDC, bool bDraw = TRUE);
  219.    // Calculate the dimensions and draw the balloon contents
  220.    virtual SIZE DrawContent(HDC hDC, int nTop, bool bDraw = TRUE);
  221.    // Calculate the dimensions required to draw the balloon header
  222.    SIZE CalcHeaderSize(HDC hDC) { return DrawHeader(hDC, FALSE); }
  223.    // Calculate the dimensions required to draw the balloon content
  224.    SIZE CalcContentSize(HDC hDC) { return DrawContent(hDC, 0, FALSE); }
  225.    // Calculate the total size needed by the balloon window
  226. SIZE CalcWindowSize();
  227.    // Calculate the total size needed by the client area of the balloon window
  228. SIZE CalcClientSize();
  229.    // Size and position the balloon window on the screen.
  230. void PositionWindow();
  231.    // Displays the balloon on the screen, performing fade-in if enabled.
  232.    void ShowBalloon(void);
  233.    // Removes the balloon from the screen, performing the fade-out if enabled
  234.    void HideBalloon(void);
  235.    // Returns the class ATOM for a BalloonHelp control.  Registers the class first, if necessary.
  236.    static ATOM GetClassAtom(BOOL bShadowed);
  237. // message handlers
  238.    
  239.    LRESULT OnPrint(HWND hwnd, WPARAM wParam, LPARAM lParam);
  240.    LRESULT OnPrintClient(HWND hwnd, WPARAM wParam, LPARAM lParam);
  241. static void OnClose(HWND hwnd);
  242. static void OnDestroy(HWND hwnd);
  243. static BOOL OnEraseBkgnd(HWND hwnd, HDC hdc);
  244. static void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
  245. static void OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags);
  246. static void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags);
  247. static UINT OnNCCalcSize(HWND hwnd, BOOL fCalcValidRects, NCCALCSIZE_PARAMS * lpcsp);
  248. static void OnNCDestroy(HWND hwnd);
  249. static UINT OnNCHitTest(HWND hwnd, int x, int y);
  250. static void OnNCPaint(HWND hwnd, HRGN hrgn);
  251. static void OnPaint(HWND hwnd);
  252. static void OnShowWindow(HWND hwnd, BOOL fShow, UINT status);
  253. static void OnTimer(HWND hwnd, UINT id);
  254. private:
  255.    // Keyboard hook
  256.    void SetKeyboardHook();
  257.    void RemoveKeyboardHook();
  258.    // Mouse hook
  259.    void SetMouseHook();
  260.    void RemoveMouseHook();
  261.    // Call Window Return hook
  262.    void SetCallWndRetHook();
  263.    void RemoveCallWndRetHook();
  264.    // Keyboard hook callback
  265.    LRESULT KeyboardHookProc( int code, WPARAM wParam, LPARAM lParam);
  266.    // Mouse hook callback
  267. LRESULT MouseHookProc(int code, WPARAM wParam, LPARAM lParam);
  268.    // Call Window Return hook callback (automatic following)
  269. LRESULT CallWndRetProc(int code, WPARAM wParam, LPARAM lParam);
  270.    // animate window API, if available
  271.    typedef BOOL (WINAPI* FN_ANIMATE_WINDOW)(HWND,DWORD,DWORD);
  272.    FN_ANIMATE_WINDOW m_fnAnimateWindow;
  273.    // hook handles, if set
  274.    HHOOK          m_hKeyboardHook;
  275.    HHOOK          m_hMouseHook;
  276.    HHOOK          m_hCallWndRetHook;
  277.    unsigned int   m_unOptions;
  278.    unsigned int   m_unTimeout;      // max time to show, in milliseconds
  279.    unsigned int   m_unTimerClose;   // ID of kill timer
  280.    CStdString     m_strContent;     // text to show in content area
  281.    CStdString     m_strURL;         // url to open, if clicked.
  282.    HWND           m_hwndAnchor;     // window to anchor to (can be NULL for desktop anchor)
  283.    POINT          m_ptAnchor;       // "anchor" (point of tail)
  284. HIMAGELIST     m_hilIcon;         // icon
  285.    HFONT          m_hTitleFont;     // font to use for title
  286.    HFONT          m_hContentFont;   // font to use for content
  287.    
  288.    COLORREF       m_crBackground;   // Background color for balloon   
  289.    COLORREF       m_crForeground;   // Foreground color for balloon
  290.    
  291.    RECT           m_screenRect;     // bounds of screen anchor is on
  292.    HRGN           m_hrgnComplete;    // Clipping / Drawing region
  293.    POINT          m_ptMouseOrig;    // original mouse position; for hiding on mouse move
  294.    UINT           m_uCloseState;    // current state of the close button
  295.    int            m_nMouseMoveTolerance;  // distance mouse has to move before balloon will close.
  296.    // class atoms (shadowed/not shadowed)
  297.    static ATOM    s_ClassAtom;
  298.    static ATOM    s_ClassAtomShadowed;
  299. };
  300. #endif // _BALLOON_HELP_H_INCLUDED_