coolbtn.cpp

来自「一个支持FTP,SFTP的客户端程序」· C++ 代码 · 共 838 行 · 第 1/2 页

CPP
838
字号
	
}

////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  DrawArrow
//
// DESCRIPTION:	Draws drop down arrow, we could use DrawFrameControl - a bit too 
//              messy
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
void CCoolBtn::DrawArrow(CDC* pDC,CPoint ArrowTip)
{
  if (m_bMenuPushed)
	  ArrowTip.Offset(CSize(1,1));
  CPoint ptDest;

  CPen* pPen = pDC->GetCurrentPen();
  LOGPEN logPen;
  pPen->GetLogPen(&logPen);
  pDC->SetPixel(ArrowTip, logPen.lopnColor);

  ArrowTip -= CPoint(1,1);
  pDC->MoveTo(ArrowTip);
  
  ptDest = ArrowTip;
  ptDest += CPoint(3,0);
  pDC->LineTo(ptDest);

  ArrowTip -= CPoint(1,1);
  pDC->MoveTo(ArrowTip);

  ptDest = ArrowTip;
  ptDest += CPoint(5,0);
  pDC->LineTo(ptDest);

  ArrowTip -= CPoint(1,1);
  pDC->MoveTo(ArrowTip);

  ptDest = ArrowTip;
  ptDest += CPoint(7,0);
  pDC->LineTo(ptDest);
}


////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  OnLButtonDown
//
// DESCRIPTION:	handles button pressed state, including drop down menu
//              
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
void CCoolBtn::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
	if (m_bMenuPushed)
	{
		m_bMenuPushed = FALSE;
		Invalidate();
		return;
		
	}
	
	if (HitMenuBtn(point))
	{
		m_bMenuPushed = TRUE;
		Invalidate();
		
		CRect rc;
		GetWindowRect(rc);
		
		int x = rc.left;
		int y = rc.bottom;
		
		m_menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, x, y, this);

		m_bMenuPushed=FALSE;
	}
	else
	{
		m_bPushed = TRUE;
	}
	
	Invalidate();
	
	if (m_bPushed)
		CButton::OnLButtonDown(nFlags, point);
}

////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  OnLButtonUp
//
// DESCRIPTION:	Redraws button in normal state
//              
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
void CCoolBtn::OnLButtonUp(UINT nFlags, CPoint point) 
{
	m_bMouseMovedOut=FALSE;
	if (m_bMenuPushed)
	{
		m_bMenuPushed = FALSE;
		Invalidate();
		return;
	}
	if (m_bPushed)
	{
		m_bPushed = FALSE;
		Invalidate();
	}
	
	CButton::OnLButtonUp(nFlags, point);
}

////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  OnMouseMove
//
// DESCRIPTION:	Tracks mouse whilst pressed
//              
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
void CCoolBtn::OnMouseMove(UINT nFlags, CPoint point) 
{
	if (m_bPushed)
	{
		ClientToScreen(&point);
		
		if (WindowFromPoint(point) != this)
		{
			m_bPushed = FALSE;
			m_bMouseMovedOut = TRUE;
			Invalidate();
		}
	}
	else if (m_bMouseMovedOut)
	{
		ClientToScreen(&point);
		
		if (WindowFromPoint(point) == this)
		{
			m_bPushed = TRUE;
			m_bMouseMovedOut = FALSE;
			Invalidate();
		}
	}
	else
	{
		if (m_bHovering && !m_bHoveringDropdown)
		{
			if (HitMenuBtn(point))
			{
				m_bHovering = FALSE;
				m_bHoveringDropdown = TRUE;
				Invalidate(FALSE);
			}
		}
		else if (!m_bHovering && m_bHoveringDropdown)
		{
			if (!HitMenuBtn(point))
			{
				m_bHovering = TRUE;
				m_bHoveringDropdown = FALSE;
				Invalidate(FALSE);
			}
		}
		else if(!m_bHovering && !HitMenuBtn(point))
		{
			m_bHovering = TRUE;
			
			Invalidate(FALSE);
			
			TRACKMOUSEEVENT tmEvent;
			
			tmEvent.cbSize = sizeof(tmEvent);
			tmEvent.dwFlags = TME_LEAVE;
			tmEvent.hwndTrack = m_hWnd;
			
			::_TrackMouseEvent(&tmEvent);
		}
		else if(!m_bHoveringDropdown && HitMenuBtn(point))
		{
			m_bHoveringDropdown = TRUE;
			
			Invalidate(FALSE);
			
			TRACKMOUSEEVENT tmEvent;
			
			tmEvent.cbSize = sizeof(tmEvent);
			tmEvent.dwFlags = TME_LEAVE;
			tmEvent.hwndTrack = m_hWnd;
			
			::_TrackMouseEvent(&tmEvent);
		}
	}
	
	CButton::OnMouseMove(nFlags, point);
}

////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  SetButtonImage
//
// DESCRIPTION:	Sets the button image, COLORREF crMask specifics the transparency
//              color              
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
BOOL CCoolBtn::SetButtonImage(UINT nResourceId, COLORREF crMask)
{
  // The ID must exist also as a bitmap resource!!!
  m_btnImage.LoadBitmap(nResourceId);  
  m_btnImage.GetObject(sizeof m_bm, &m_bm);
  m_IL.Create( nResourceId, m_bm.bmWidth, 1, crMask );
  m_bLoaded = TRUE;
  m_crMask = crMask;

  HBITMAP bmTemp;
  COLORMAP mapColor;
  mapColor.from = crMask;
  mapColor.to  = RGB(255,255,255);

  bmTemp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, nResourceId, IMAGE_BITMAP, &mapColor, 1);
  m_hbmpDisabled = (HBITMAP)::CopyImage(bmTemp, IMAGE_BITMAP, m_bm.bmWidth, m_bm.bmHeight, LR_COPYDELETEORG);

  return m_bLoaded;
}

void CCoolBtn::OnSetFocus(CWnd* pOldWnd) 
{
	CButton::OnSetFocus(pOldWnd);
	
	Invalidate();
	
}

void CCoolBtn::OnKillFocus(CWnd* pNewWnd) 
{
	CButton::OnKillFocus(pNewWnd);
		

}

////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  OnSysColorChange
//
// DESCRIPTION:	Called when system colors change, force a button redraw
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
void CCoolBtn::OnSysColorChange() 
{
	CButton::OnSysColorChange();
  Invalidate();	
}
 
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  HitMenuBtn
//
// DESCRIPTION:	Helper function to test for menu button hit...
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
BOOL CCoolBtn::HitMenuBtn(CPoint point)
{
  if (!m_bMenuLoaded)
    return FALSE; // Don't allow menu button drop down if no menu items are loaded
  
  ClientToScreen(&point);

  CRect rect;
  GetWindowRect(rect);
  rect.left = rect.right - nDropBtnWidth;

  return rect.PtInRect(point);    
}


////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  AddMenuItem
//
// DESCRIPTION:	Adds a menu item and id to our menu.
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
BOOL CCoolBtn::AddMenuItem(UINT nMenuId,const CString strMenu, UINT nMenuFlags)
{
  BOOL bRet = m_menu.AppendMenu(nMenuFlags | MF_STRING, nMenuId, (LPCTSTR)strMenu);
  
  m_bMenuLoaded |= bRet;
  
  return bRet;
}

////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION:	  AddMenuItem
//
// DESCRIPTION:	Adds a menu item and id to our menu.
//
// NOTES:			
//
// MAINTENANCE:
// Name:		  Date:	  Version:	Notes:
// NT ALMOND	210100	1.0			  Origin
//
////////////////////////////////////////////////////////////////////////////////
BOOL CCoolBtn::AddMenuItem(UINT nMenuId, UINT nMenuFlags)
{
	CString str;
	if (nMenuId)
		str.LoadString(nMenuId);
	BOOL bRet = m_menu.AppendMenu(nMenuFlags | MF_STRING, nMenuId, str);
	
	m_bMenuLoaded |= bRet;
	
	return bRet;
}

void CCoolBtn::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	OnLButtonDown(nFlags, point);	
	CButton::OnLButtonDblClk(nFlags, point);
}

BOOL CCoolBtn::OnCommand(WPARAM wParam, LPARAM lParam) 
{
	m_bMenuPushed = FALSE;
	
	return m_pParentWnd->SendMessage(WM_COMMAND, wParam, lParam);
}

BOOL CCoolBtn::RemoveMenuItem(UINT nIndex)
{
	return m_menu.RemoveMenu(nIndex, MF_BYPOSITION);
}

BOOL CCoolBtn::InsertMenuItem(UINT nIndex, UINT nMenuId, UINT nMenuFlags)
{
	CString str;
	if (nMenuId)
		str.LoadString(nMenuId);
	BOOL bRet = m_menu.InsertMenu(nIndex, nMenuFlags | MF_BYPOSITION | MF_STRING, nMenuId, str);
	
	m_bMenuLoaded |= bRet;
	
	return bRet;
}


BOOL CCoolBtn::InsertMenuItem(UINT nIndex, UINT nMenuId, const CString strMenu, UINT nMenuFlags)
{
	CString str;
	BOOL bRet = m_menu.InsertMenu(nIndex, nMenuFlags | MF_BYPOSITION | MF_STRING, nMenuId, strMenu);
	
	m_bMenuLoaded |= bRet;
	
	return bRet;
}

LRESULT CCoolBtn::OnMouseLeave(WPARAM, LPARAM)
{
	m_bHovering = FALSE;
	m_bHoveringDropdown = FALSE;

	Invalidate(FALSE);

	return 0;
}

⌨️ 快捷键说明

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