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 + -
显示快捷键?