From 863f21995955fb3e9aa471430218967d4e642c27 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期四, 29 五月 2025 16:11:24 +0800
Subject: [PATCH] Merge branch 'liuyang'
---
SourceCode/Bond/Servo/GridControl/TitleTip.cpp | 341 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 341 insertions(+), 0 deletions(-)
diff --git a/SourceCode/Bond/Servo/GridControl/TitleTip.cpp b/SourceCode/Bond/Servo/GridControl/TitleTip.cpp
new file mode 100644
index 0000000..b821a82
--- /dev/null
+++ b/SourceCode/Bond/Servo/GridControl/TitleTip.cpp
@@ -0,0 +1,341 @@
+////////////////////////////////////////////////////////////////////////////
+// TitleTip.cpp : implementation file
+//
+// Based on code by Zafir Anjum
+//
+// Adapted by Chris Maunder <cmaunder@mail.com>
+// Copyright (c) 1998-2002. All Rights Reserved.
+//
+// This code may be used in compiled form in any way you desire. This
+// file may be redistributed unmodified by any means PROVIDING it is
+// not sold for profit without the authors written consent, and
+// providing that this notice and the authors name and all copyright
+// notices remains intact.
+//
+// An email letting me know how you are using it would be nice as well.
+//
+// This file is provided "as is" with no expressed or implied warranty.
+// The author accepts no liability for any damage/loss of business that
+// this product may cause.
+//
+// For use with CGridCtrl v2.20+
+//
+// History
+// 10 Apr 1999 Now accepts a LOGFONT pointer and
+// a tracking rect in Show(...) (Chris Maunder)
+// 18 Apr 1999 Resource leak in Show fixed by Daniel Gehriger
+// 8 Mar 2000 Added double-click fix found on codeguru
+// web site but forgot / can't find who contributed it
+// 28 Mar 2000 Aqiruse (marked with //FNA)
+// Titletips now use cell color
+// 18 Jun 2000 Delayed window creation added
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "gridctrl.h"
+
+#ifndef GRIDCONTROL_NO_TITLETIPS
+
+#include "TitleTip.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static const char* THIS_FILE = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CTitleTip
+
+CTitleTip::CTitleTip()
+{
+ // Register the window class if it has not already been registered.
+ WNDCLASS wndcls;
+ HINSTANCE hInst = AfxGetInstanceHandle();
+ if(!(::GetClassInfo(hInst, TITLETIP_CLASSNAME, &wndcls)))
+ {
+ // otherwise we need to register a new class
+ wndcls.style = CS_SAVEBITS;
+ wndcls.lpfnWndProc = ::DefWindowProc;
+ wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
+ wndcls.hInstance = hInst;
+ wndcls.hIcon = NULL;
+ wndcls.hCursor = LoadCursor( hInst, IDC_ARROW );
+ wndcls.hbrBackground = (HBRUSH)(COLOR_INFOBK +1);
+ wndcls.lpszMenuName = NULL;
+ wndcls.lpszClassName = TITLETIP_CLASSNAME;
+
+ if (!AfxRegisterClass(&wndcls))
+ AfxThrowResourceException();
+ }
+
+ m_dwLastLButtonDown = ULONG_MAX;
+ m_dwDblClickMsecs = GetDoubleClickTime();
+ m_bCreated = FALSE;
+ m_pParentWnd = NULL;
+}
+
+CTitleTip::~CTitleTip()
+{
+}
+
+
+BEGIN_MESSAGE_MAP(CTitleTip, CWnd)
+ //{{AFX_MSG_MAP(CTitleTip)
+ ON_WM_MOUSEMOVE()
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CTitleTip message handlers
+
+BOOL CTitleTip::Create(CWnd * pParentWnd)
+{
+// ASSERT_VALID(pParentWnd);
+
+ // Already created?
+ if (m_bCreated)
+ return TRUE;
+
+ DWORD dwStyle = WS_BORDER | WS_POPUP;
+ DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
+ m_pParentWnd = pParentWnd;
+
+ m_bCreated = CreateEx(dwExStyle, TITLETIP_CLASSNAME, NULL, dwStyle,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ NULL, NULL, NULL );
+
+ return m_bCreated;
+}
+
+BOOL CTitleTip::DestroyWindow()
+{
+ m_bCreated = FALSE;
+
+ return CWnd::DestroyWindow();
+}
+
+// Show - Show the titletip if needed
+// rectTitle - The rectangle within which the original
+// title is constrained - in client coordinates
+// lpszTitleText - The text to be displayed
+// xoffset - Number of pixel that the text is offset from
+// left border of the cell
+void CTitleTip::Show(CRect rectTitle, LPCTSTR lpszTitleText, int xoffset /*=0*/,
+ LPRECT lpHoverRect /*=NULL*/,
+ const LOGFONT* lpLogFont /*=NULL*/,
+ COLORREF crTextClr /* CLR_DEFAULT */,
+ COLORREF crBackClr /* CLR_DEFAULT */)
+{
+ if (!IsWindow(m_hWnd))
+ Create(m_pParentWnd);
+
+// ASSERT( ::IsWindow( GetSafeHwnd() ) );
+
+ if (rectTitle.IsRectEmpty())
+ return;
+
+ // If titletip is already displayed, don't do anything.
+ if( IsWindowVisible() )
+ return;
+
+ m_rectHover = (lpHoverRect != NULL)? lpHoverRect : rectTitle;
+ m_rectHover.right++; m_rectHover.bottom++;
+
+ m_pParentWnd->ClientToScreen( m_rectHover );
+ ScreenToClient( m_rectHover );
+
+ // Do not display the titletip is app does not have focus
+ if( GetFocus() == NULL )
+ return;
+
+ // Define the rectangle outside which the titletip will be hidden.
+ // We add a buffer of one pixel around the rectangle
+ m_rectTitle.top = -1;
+ m_rectTitle.left = -xoffset-1;
+ m_rectTitle.right = rectTitle.Width()-xoffset;
+ m_rectTitle.bottom = rectTitle.Height()+1;
+
+ // Determine the width of the text
+ m_pParentWnd->ClientToScreen( rectTitle );
+
+ CClientDC dc(this);
+ CString strTitle = _T("");
+ strTitle += _T(" ");
+ strTitle += lpszTitleText;
+ strTitle += _T(" ");
+
+ CFont font, *pOldFont = NULL;
+ if (lpLogFont)
+ {
+ font.CreateFontIndirect(lpLogFont);
+ pOldFont = dc.SelectObject( &font );
+ }
+ else
+ {
+ // use same font as ctrl
+ pOldFont = dc.SelectObject( m_pParentWnd->GetFont() );
+ }
+
+ CSize size = dc.GetTextExtent( strTitle );
+
+ TEXTMETRIC tm;
+ dc.GetTextMetrics(&tm);
+ size.cx += tm.tmOverhang;
+
+ CRect rectDisplay = rectTitle;
+ rectDisplay.left += xoffset;
+ rectDisplay.right = rectDisplay.left + size.cx + xoffset;
+
+ // Do not display if the text fits within available space
+ if ( rectDisplay.right > rectTitle.right-xoffset )
+ {
+ // Show the titletip
+ SetWindowPos( &wndTop, rectDisplay.left, rectDisplay.top,
+ rectDisplay.Width(), rectDisplay.Height(),
+ SWP_SHOWWINDOW|SWP_NOACTIVATE );
+
+ // FNA - handle colors correctly
+ if (crBackClr != CLR_DEFAULT)
+ {
+ CBrush backBrush(crBackClr);
+ CBrush* pOldBrush = dc.SelectObject(&backBrush);
+ CRect rect;
+ dc.GetClipBox(&rect); // Erase the area needed
+
+ dc.PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
+ dc.SelectObject(pOldBrush);
+ }
+ // Set color
+ if (crTextClr != CLR_DEFAULT)//FNA
+ dc.SetTextColor(crTextClr);//FA
+
+ dc.SetBkMode( TRANSPARENT );
+ dc.TextOut( 0, 0, strTitle );
+ SetCapture();
+ }
+
+ dc.SelectObject( pOldFont );
+}
+
+void CTitleTip::Hide()
+{
+ if (!::IsWindow(GetSafeHwnd()))
+ return;
+
+ if (GetCapture()->GetSafeHwnd() == GetSafeHwnd())
+ ReleaseCapture();
+
+ ShowWindow( SW_HIDE );
+}
+
+void CTitleTip::OnMouseMove(UINT nFlags, CPoint point)
+{
+ if (!m_rectHover.PtInRect(point))
+ {
+ Hide();
+
+ // Forward the message
+ ClientToScreen( &point );
+ CWnd *pWnd = WindowFromPoint( point );
+ if ( pWnd == this )
+ pWnd = m_pParentWnd;
+
+ int hittest = (int)pWnd->SendMessage(WM_NCHITTEST,0,MAKELONG(point.x,point.y));
+
+ if (hittest == HTCLIENT) {
+ pWnd->ScreenToClient( &point );
+ pWnd->PostMessage( WM_MOUSEMOVE, nFlags, MAKELONG(point.x,point.y) );
+ } else {
+ pWnd->PostMessage( WM_NCMOUSEMOVE, hittest, MAKELONG(point.x,point.y) );
+ }
+ }
+}
+
+BOOL CTitleTip::PreTranslateMessage(MSG* pMsg)
+{
+ // Used to qualify WM_LBUTTONDOWN messages as double-clicks
+ DWORD dwTick=0;
+ BOOL bDoubleClick=FALSE;
+
+ CWnd *pWnd;
+ int hittest;
+ switch (pMsg->message)
+ {
+ case WM_LBUTTONDOWN:
+ // Get tick count since last LButtonDown
+ dwTick = GetTickCount();
+ bDoubleClick = ((dwTick - m_dwLastLButtonDown) <= m_dwDblClickMsecs);
+ m_dwLastLButtonDown = dwTick;
+ // NOTE: DO NOT ADD break; STATEMENT HERE! Let code fall through
+
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ {
+ POINTS pts = MAKEPOINTS( pMsg->lParam );
+ POINT point;
+ point.x = pts.x;
+ point.y = pts.y;
+
+ ClientToScreen( &point );
+ Hide();
+
+ pWnd = WindowFromPoint( point );
+ if (!pWnd)
+ return CWnd::PreTranslateMessage(pMsg);
+
+ if( pWnd->GetSafeHwnd() == GetSafeHwnd())
+ pWnd = m_pParentWnd;
+
+ hittest = (int)pWnd->SendMessage(WM_NCHITTEST,0,MAKELONG(point.x,point.y));
+
+ if (hittest == HTCLIENT)
+ {
+ pWnd->ScreenToClient( &point );
+ pMsg->lParam = MAKELONG(point.x,point.y);
+ }
+ else
+ {
+ switch (pMsg->message) {
+ case WM_LBUTTONDOWN:
+ pMsg->message = WM_NCLBUTTONDOWN;
+ break;
+ case WM_RBUTTONDOWN:
+ pMsg->message = WM_NCRBUTTONDOWN;
+ break;
+ case WM_MBUTTONDOWN:
+ pMsg->message = WM_NCMBUTTONDOWN;
+ break;
+ }
+ pMsg->wParam = hittest;
+ pMsg->lParam = MAKELONG(point.x,point.y);
+ }
+
+
+ // If this is the 2nd WM_LBUTTONDOWN in x milliseconds,
+ // post a WM_LBUTTONDBLCLK message instead of a single click.
+ pWnd->PostMessage( bDoubleClick ? WM_LBUTTONDBLCLK : pMsg->message,
+ pMsg->wParam,
+ pMsg->lParam);
+ return TRUE;
+ }
+
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ Hide();
+ m_pParentWnd->PostMessage( pMsg->message, pMsg->wParam, pMsg->lParam );
+ return TRUE;
+ }
+
+ if( GetFocus() == NULL )
+ {
+ Hide();
+ return TRUE;
+ }
+
+ return CWnd::PreTranslateMessage(pMsg);
+}
+
+#endif // GRIDCONTROL_NO_TITLETIPS
\ No newline at end of file
--
Gitblit v1.9.3