⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfxlisttip.cpp

📁 一个多线程的网络数据采集系统(客户端)
💻 CPP
字号:
// GfxListTip.cpp : implementation file
//

#include "stdafx.h"
#include "WspProcess.h"

#include "GfxListTip.h"

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

#define GFXLISTTIP_CLASSNAME _T("ZGfxListTip")

/////////////////////////////////////////////////////////////////////////////
// CGfxListTip

CGfxListTip::CGfxListTip()
{
	//确保注册窗口类"ZGfxListTip"
	WNDCLASS wndcls;
	HINSTANCE hInst = AfxGetInstanceHandle();
	if(!(::GetClassInfo(hInst, GFXLISTTIP_CLASSNAME, &wndcls)))
	{
		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 = GFXLISTTIP_CLASSNAME;
		if (!AfxRegisterClass(&wndcls)) AfxThrowResourceException();
	}
}

CGfxListTip::~CGfxListTip()
{
}


BEGIN_MESSAGE_MAP(CGfxListTip, CWnd)
	//{{AFX_MSG_MAP(CGfxListTip)
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CGfxListTip message handlers

BOOL CGfxListTip::PreTranslateMessage(MSG* pMsg) 
{
	CWnd *pWnd;
	int hittest;
	switch(pMsg->message)
	{
	case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
	case WM_MBUTTONDOWN:{
		POINTS pts = MAKEPOINTS(pMsg->lParam);
		POINT  point;
		point.x = pts.x;
		point.y = pts.y;
		ClientToScreen(&point);
		pWnd = WindowFromPoint(point);
		if( pWnd == this ) 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);
		}
		ReleaseCapture();
		ShowWindow(SW_HIDE);
		pWnd->PostMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
		return TRUE;}		
	case WM_KEYDOWN:
	case WM_SYSKEYDOWN:
		ReleaseCapture();
		ShowWindow(SW_HIDE);
		m_pParentWnd->PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
		return TRUE;
	}

	if (GetFocus() == NULL)
	{
		ReleaseCapture();
		ShowWindow(SW_HIDE);
		return TRUE;
	}

	return CWnd::PreTranslateMessage(pMsg);
}

BOOL CGfxListTip::Create(CWnd * pParentWnd)
{
	ASSERT_VALID(pParentWnd);
	DWORD dwStyle = WS_BORDER | WS_POPUP; 
	DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
	m_pParentWnd = pParentWnd;
	return CreateEx(dwExStyle, GFXLISTTIP_CLASSNAME, NULL, dwStyle, 0, 0, 0, 0, NULL, NULL, NULL);
}


void CGfxListTip::Show(CRect rectTitle, LPCTSTR lpszTitleText, int xoffset)
{
	if (!::IsWindow( m_hWnd )) return;
	if (rectTitle.IsRectEmpty()) return;

	ASSERT(!rectTitle.IsRectEmpty());

	if (lpszTitleText == NULL || *lpszTitleText == 0) return;
	if (IsWindowVisible()) return;
	if (GetFocus() == NULL) return;
	m_rectTitle.top = -1;
	m_rectTitle.left = -xoffset-1;
	m_rectTitle.right = rectTitle.Width()-xoffset;
	m_rectTitle.bottom = rectTitle.Height()+1;
	m_pParentWnd->ClientToScreen( rectTitle );
	CClientDC dc(this);
	CString strTitle(lpszTitleText);
	CFont *pFont = m_pParentWnd->GetFont(); 	// use same font as ctrl
	CFont *pFontDC = dc.SelectObject( pFont );
	CRect rectDisplay = rectTitle;
	CSize size = dc.GetTextExtent( strTitle );
	rectDisplay.left += xoffset;
	rectDisplay.right = rectDisplay.left + size.cx + 3;
	if (rectDisplay.right <= rectTitle.right-xoffset) return;
	SetWindowPos(&wndTop, rectDisplay.left, rectDisplay.top, rectDisplay.Width(), rectDisplay.Height(), SWP_SHOWWINDOW|SWP_NOACTIVATE);
	dc.SetBkMode(TRANSPARENT);
	dc.TextOut(0, 0, strTitle);
	dc.SelectObject(pFontDC);
	SetCapture();
}

void CGfxListTip::OnMouseMove(UINT nFlags, CPoint point) 
{
	 if (!m_rectTitle.PtInRect(point)) 
	 {
		  ReleaseCapture();
		  ShowWindow( SW_HIDE );
		  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));
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -