📄 trianglebutton.cpp
字号:
// TriangleButton.cpp : implementation file
//
#include "stdafx.h"
#include "GtMpeg.h"
#include "TriangleButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
CTriangleButton::CTriangleButton()
{
WNDCLASS wndcls;
HINSTANCE hInst = AfxGetResourceHandle();
if (!(::GetClassInfo(hInst, "TriangleButtonCtrl", &wndcls)))
{
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
wndcls.hCursor = NULL;
wndcls.hbrBackground = NULL;//(HBRUSH) (Brush.operator HBRUSH());//COLOR_3DFACE + 1
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = "TriangleButtonCtrl";
if (!AfxRegisterClass(&wndcls))
AfxThrowResourceException();
}
m_nStates=1;
m_pToolTip = NULL;
}
CTriangleButton::~CTriangleButton()
{
if (m_pToolTip)
{
delete (m_pToolTip);
m_pToolTip = NULL;
}
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CTriangleButton, CWnd)
//{{AFX_MSG_MAP(CTriangleButton)
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT,0,0xFFFF,OnToolTipNotify)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
int CTriangleButton::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect;
GetClientRect(rect);
switch(m_nButtonType)
{
case _UP_BUTTON:
m_ptBorder[0].x=rect.Width()/2;
m_ptBorder[0].y=0;
m_ptBorder[1].x=0;
m_ptBorder[1].y=rect.bottom;
m_ptBorder[2].x=rect.right;
m_ptBorder[2].y=rect.bottom;
break;
case _LEFT_BUTTON:
m_ptBorder[0].x=0;
m_ptBorder[0].y=rect.Height()/2;
m_ptBorder[1].x=rect.right;
m_ptBorder[1].y=rect.top;
m_ptBorder[2].x=rect.right;
m_ptBorder[2].y=rect.bottom;
break;
case _RIGHT_BUTTON:
m_ptBorder[0].x=rect.right;
m_ptBorder[0].y=rect.Height()/2;
m_ptBorder[1].x=rect.left;
m_ptBorder[1].y=rect.top;
m_ptBorder[2].x=rect.left;
m_ptBorder[2].y=rect.bottom;
break;
case _DOWN_BUTTON:
m_ptBorder[0].x=rect.Width()/2;
m_ptBorder[0].y=rect.bottom;
m_ptBorder[1].x=0;
m_ptBorder[1].y=rect.top;
m_ptBorder[2].x=rect.right;
m_ptBorder[2].y=rect.top;
break;
}
ModifyStyleEx(0,WS_EX_TRANSPARENT);
//CRgn rgn;
//rgn.CreatePolygonRgn(m_ptBorder,3,WINDING);
//SetWindowRgn(rgn,1);
CreateTooltips();
return 0;
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CTriangleButton::OnLButtonDown(UINT nFlags, CPoint point)
{
HWND hOldFocusWnd = ::GetFocus();
if(m_nStates==1)
{
SetCapture();
m_nStates=-1;
Invalidate();
NMHDR Msg;
Msg.hwndFrom=m_hWnd;
switch(m_nButtonType)
{
case _UP_BUTTON:
Msg.code=_CTRL_UP_START;
break;
case _LEFT_BUTTON:
Msg.code=_CTRL_LEFT_START;
break;
case _RIGHT_BUTTON:
Msg.code=_CTRL_RIGHT_START;
break;
case _DOWN_BUTTON:
Msg.code=_CTRL_DOWN_START;
break;
}
GetParent()->SendMessage(WM_NOTIFY,_CTRL_INFO,(LPARAM)&Msg);
}
CWnd::OnLButtonDown(nFlags, point);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CTriangleButton::OnMouseMove(UINT nFlags, CPoint point)
{
if(MK_LBUTTON)
{
CRect rect;
GetClientRect(rect);
if(!rect.PtInRect(point))
{
ReleaseCapture();
if(m_nStates==-1)
{
m_nStates=1;
Invalidate();
NMHDR Msg;
Msg.hwndFrom=m_hWnd;
switch(m_nButtonType)
{
case _UP_BUTTON:
Msg.code=_CTRL_UP_STOP;
break;
case _LEFT_BUTTON:
Msg.code=_CTRL_LEFT_STOP;
break;
case _RIGHT_BUTTON:
Msg.code=_CTRL_RIGHT_STOP;
break;
case _DOWN_BUTTON:
Msg.code=_CTRL_DOWN_STOP;
break;
}
GetParent()->SendMessage(WM_NOTIFY,_CTRL_INFO,(LPARAM)&Msg);
}
}
}
CWnd::OnMouseMove(nFlags, point);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CTriangleButton::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_nStates==-1)
{
ReleaseCapture();
m_nStates=1;
Invalidate();
NMHDR Msg;
Msg.hwndFrom=m_hWnd;
switch(m_nButtonType)
{
case _UP_BUTTON:
Msg.code=_CTRL_UP_STOP;
break;
case _LEFT_BUTTON:
Msg.code=_CTRL_LEFT_STOP;
break;
case _RIGHT_BUTTON:
Msg.code=_CTRL_RIGHT_STOP;
break;
case _DOWN_BUTTON:
Msg.code=_CTRL_DOWN_STOP;
break;
}
GetParent()->SendMessage(WM_NOTIFY,_CTRL_INFO,(LPARAM)&Msg);
}
CWnd::OnLButtonUp(nFlags, point);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CTriangleButton::OnPaint()
{
CPaintDC dc(this);
CBrush LightBrush(RGB(0,0,255));
CBrush DarkBrush(RGB(0,0,118));
CRgn rgn;
rgn.CreatePolygonRgn(m_ptBorder,3,WINDING);
if(m_nStates==1)
dc.FillRgn(&rgn,&DarkBrush);
else
dc.FillRgn(&rgn,&LightBrush);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BOOL CTriangleButton::Create(CString sCaption,int nButtonType,CRect rect, CWnd* pParentWnd, UINT nID)
{
m_nButtonType=nButtonType;
m_sCaption=sCaption;
return CWnd::Create("TriangleButtonCtrl",NULL,WS_VISIBLE|WS_CHILD, rect, pParentWnd, nID);
//WS_EX_TRANSPARENT
}
//////////////////////////////////////
//
/////////////////////////////////////
void CTriangleButton::CreateTooltips()
{
if (m_pToolTip == NULL)
{
CRect rect;
GetClientRect(rect);
m_pToolTip = new CToolTipCtrl;
if(!m_pToolTip)
{
MessageBox(_T("Unable to allocate memory for ToolTips!"));
}
else
{
if( !m_pToolTip->Create(this, TTS_ALWAYSTIP) )
{
MessageBox(_T("Unable to Create ToolTips for Grid!"));
}
else
{
m_pToolTip->AddTool(this, LPSTR_TEXTCALLBACK, rect, 1);
m_pToolTip->Activate(TRUE);
m_pToolTip->SendMessage(TTM_SETDELAYTIME,TTDT_AUTOPOP,30000);
EnableToolTips(TRUE);
}
}
}
}
////////////////////////////////////////
//
///////////////////////////////////////
BOOL CTriangleButton::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_LBUTTONDOWN:
case WM_MOUSEMOVE:
case WM_LBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
if (m_pToolTip)
{
CPoint ptCurrentPos;
ptCurrentPos.x = LOWORD(pMsg->lParam);
ptCurrentPos.y = HIWORD(pMsg->lParam);
if (m_rectSearch.PtInRect(ptCurrentPos) == FALSE)
{
m_pToolTip->Activate(FALSE);
}
m_pToolTip->Activate(TRUE);
m_pToolTip->RelayEvent(pMsg);
}
}
return CWnd::PreTranslateMessage(pMsg);
}
////////////////////////////////////////
//
///////////////////////////////////////
BOOL CTriangleButton::OnToolTipNotify(UINT id,NMHDR *pNMH, LRESULT *pResult)
{
LPTOOLTIPTEXT lpttt;
lpttt = (LPTOOLTIPTEXT)pNMH;
lpttt->szText[0] = '\0';
POINT ptCurrentPos;
GetCursorPos(&ptCurrentPos);
ScreenToClient(&ptCurrentPos);
m_rectSearch.SetRect(ptCurrentPos.x - 3,ptCurrentPos.y - 3,ptCurrentPos.x + 3,ptCurrentPos.y + 3);
strcpy(lpttt->szText,m_sCaption);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -