skinsplitter.cpp

来自「网狐棋牌(家园版)最新版本7.1.1源代码,共享组件源码」· C++ 代码 · 共 446 行

CPP
446
字号
#include "Stdafx.h"
#include "Resource.h"
#include "SkinSplitter.h"

//////////////////////////////////////////////////////////////////////////

//宏定义
#define IDC_SPLITTER_BUTTON		100										//按钮 ID

//静态变量
CSkinSplitterAttribute			CSkinSplitter::m_SkinAttribute;			//拆分条属性

//////////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CSkinSplitter, CWnd)

BEGIN_MESSAGE_MAP(CSkinSplitter, CWnd)
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_KILLFOCUS()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_SETCURSOR()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_BN_CLICKED(IDC_SPLITTER_BUTTON, OnSplitterButton)
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////

//构造函数
CSkinSplitterAttribute::CSkinSplitterAttribute() : CSkinAttribute(TEXT("CSkinSplitter"))
{
	//注册属性
	RegisterAttribute(SKIN_SPLITTER_IMAGEHOR_PATH,&m_strImageHorPath,false);
	RegisterAttribute(SKIN_SPLITTER_IMAGEVOR_PATH,&m_strImageVorPath,false);

	return;
}

//析构函数
CSkinSplitterAttribute::~CSkinSplitterAttribute() 
{
}

//加载配置
bool __cdecl CSkinSplitterAttribute::LoadSkinOption()
{
	HINSTANCE hInstance=GetModuleHandle(SKIN_CONTROL_DLL_NAME);
	m_ImageHor.SetLoadInfo(IDB_SKIN_SPLITTER_HOR,hInstance);
	m_ImageVor.SetLoadInfo(IDB_SKIN_SPLITTER_VOR,hInstance);

	return true;
}

//保存配置
bool __cdecl CSkinSplitterAttribute::SaveSkinOption()
{
	WriteString(SKIN_SPLITTER_IMAGEHOR_PATH,m_strImageHorPath);
	WriteString(SKIN_SPLITTER_IMAGEVOR_PATH,m_strImageVorPath);
	return true;
}

//////////////////////////////////////////////////////////////////////////

//构造函数
CSkinSplitter::CSkinSplitter(enSplitterType SplitterType, ISplitterSink * pISplitterSink)
{
	m_nMaxPos=0;
	m_nLessPos=0;
	m_bEnalbe=true;
	m_bMouseDown=false;
	m_SplitterType=SplitterType;
	m_pISplitterSink=pISplitterSink;
}

//析构函数
CSkinSplitter::~CSkinSplitter()
{
}

//设置拆分范围
void CSkinSplitter::SetSplitterRange(int nLessPos, int nMaxPos)
{
	m_nMaxPos=nMaxPos;
	m_nLessPos=nLessPos;
	return;
}

//设置拆分类型
void CSkinSplitter::SetSplitterType(enSplitterType SplitterType)
{
	m_SplitterType=SplitterType;
	return;
}

//设置回调接口
void CSkinSplitter::SetSplitterSink(ISplitterSink * pISplitterSink)
{
	m_pISplitterSink=pISplitterSink;
	return;
}

//设置启用
void CSkinSplitter::EnableSplitter(bool bEnable)
{
	m_bEnalbe=bEnable;
	return;
}

//隐藏按钮
bool CSkinSplitter::HideSplitterButton()
{
	if (m_SplitterButton.m_hWnd!=NULL) m_SplitterButton.DestroyWindow();
	return true;
}

//显示按钮
bool CSkinSplitter::ShowSplitterButton(UINT uButtonImage, HINSTANCE hInstance)
{
	//建立按钮
	if (m_SplitterButton.m_hWnd==NULL)
	{
		CRect rcButton(0,0,0,0);
		m_SplitterButton.Create(NULL,WS_CHILD,rcButton,this,IDC_SPLITTER_BUTTON);
	}

	//设置按钮
	CRect ClientRect,rcButton;
	GetClientRect(&ClientRect);
	m_SplitterButton.SetButtonImage(uButtonImage,hInstance,false);
	m_SplitterButton.GetWindowRect(&rcButton);
	int nXPos=(ClientRect.Width()-rcButton.Width())/2;
	int nYPos=(ClientRect.Height()-rcButton.Height())/2;
	m_SplitterButton.MoveWindow(nXPos,nYPos,rcButton.Width(),rcButton.Height());
	m_SplitterButton.ShowWindow(SW_SHOW);

	return true;
}

//重画消息
void CSkinSplitter::OnPaint()
{
	CPaintDC dc(this);

	//绘画边框
	CRect ClientRect;
	CImageHandle ImageHandle;
	GetClientRect(&ClientRect);
	if (m_SplitterType==HorSpliter)	ImageHandle.AttachResource(&m_SkinAttribute.m_ImageHor);
	else  ImageHandle.AttachResource(&m_SkinAttribute.m_ImageVor);
	if (ImageHandle.IsResourceValid())
	{
		if (m_SplitterType==VorSpliter)
		{
			int nImageHeight=ImageHandle->GetHeight();
			for (int nYPos=0;nYPos<ClientRect.Height();nYPos+=nImageHeight)
			{
				ImageHandle->StretchBlt(dc,0,nYPos,ClientRect.Width(),nImageHeight); 
			}
		}
		else
		{
			int nImageWidth=ImageHandle->GetWidth();
			for (int nXPos=0;nXPos<ClientRect.Width();nXPos+=nImageWidth)
			{
				ImageHandle->StretchBlt(dc,nXPos,0,nImageWidth,ClientRect.Height());
			}
		}
	}
	else 
	{
		dc.FillSolidRect(&ClientRect,RGB(192,192,192));
		dc.Draw3dRect(&ClientRect,RGB(125,125,125),RGB(125,125,125));
	}

	return;
}

//按键消息
void CSkinSplitter::OnSplitterButton()
{
	if (m_pISplitterSink!=NULL) m_pISplitterSink->OnSplitterButton(this,&m_SplitterButton);
	return;
}

//绘画背景
BOOL CSkinSplitter::OnEraseBkgnd(CDC * pDC)
{
	Invalidate(FALSE);
	UpdateWindow();
	return TRUE;
}

//失去焦点
void CSkinSplitter::OnKillFocus(CWnd * pNewWnd)
{
	__super::OnKillFocus(pNewWnd);

	if (m_bMouseDown==true)
	{
		//恢复参数
		ReleaseCapture();
		m_bMouseDown=false;
		
		//获取位置
		CRect ClientRect;
		GetClientRect(&ClientRect);
		
		//绘画拆分线
		CDC * pDC=GetDC();
		CBrush * pBrush=CDC::GetHalftoneBrush();
		CBrush * pOldBrush=pDC->SelectObject(pBrush);
		pDC->PatBlt(m_rcSplitter.left,m_rcSplitter.top,m_rcSplitter.Width(),m_rcSplitter.Height(),PATINVERT);
		m_rcSplitter.SetRectEmpty();
		pDC->SelectObject(pOldBrush);
		ReleaseDC(pDC);
	}

	return;
}

//鼠标消息
void CSkinSplitter::OnMouseMove(UINT nFlags, CPoint point)
{
	if (m_bMouseDown==true)
	{
		//获取位置
		CRect ClientRect;
		GetClientRect(&ClientRect);

		//效验位置
		CPoint PointCheck(point);
		MapWindowPoints(GetParent(),&PointCheck,1);
		if (m_SplitterType==HorSpliter)
		{
			if ((PointCheck.y>m_nMaxPos)||(PointCheck.y<m_nLessPos))
			{
				PointCheck.y=__min(m_nMaxPos,PointCheck.y);
				PointCheck.y=__max(m_nLessPos,PointCheck.y);
				SetCursor(LoadCursor(NULL,IDC_NO));
			}
			else SetCursor(LoadCursor(NULL,IDC_SIZENS));
		}
		else
		{
			if ((PointCheck.x>m_nMaxPos)||(PointCheck.x<m_nLessPos))
			{
				PointCheck.x=__min(m_nMaxPos,PointCheck.x);
				PointCheck.x=__max(m_nLessPos,PointCheck.x);
				SetCursor(LoadCursor(NULL,IDC_NO));
			}
			else SetCursor(LoadCursor(NULL,IDC_SIZEWE));
		}
		GetParent()->MapWindowPoints(this,&PointCheck,1);
		
		//计算区域
		CRect NewSpliterRect=ClientRect;
		if (m_SplitterType==HorSpliter)
		{
			NewSpliterRect.top=PointCheck.y-ClientRect.Height()/2;
			NewSpliterRect.bottom=PointCheck.y+ClientRect.Height()/2;
		}
		else
		{
			NewSpliterRect.left=PointCheck.x-ClientRect.Width()/2;
			NewSpliterRect.right=PointCheck.x+ClientRect.Width()/2;
		}
		
		//绘画拆分线
		if (NewSpliterRect!=m_rcSplitter)
		{
			CDC * pDC=GetDC();
			CBrush * pBrush=CDC::GetHalftoneBrush();
			CBrush * pOldBrush=pDC->SelectObject(pBrush);
			pDC->PatBlt(m_rcSplitter.left,m_rcSplitter.top,m_rcSplitter.Width(),m_rcSplitter.Height(),PATINVERT);
			pDC->PatBlt(NewSpliterRect.left,NewSpliterRect.top,NewSpliterRect.Width(),NewSpliterRect.Height(),PATINVERT);
			m_rcSplitter=NewSpliterRect;
			pDC->SelectObject(pOldBrush);
			ReleaseDC(pDC);
		}
	}
	
	__super::OnMouseMove(nFlags,point);
}

//鼠标消息
void CSkinSplitter::OnLButtonUp(UINT nFlags, CPoint point)
{
	if (m_bMouseDown==true)
	{
		//恢复参数
		ReleaseCapture();
		m_bMouseDown=false;

		//获取位置
		CRect ClientRect;
		GetClientRect(&ClientRect);
		MapWindowPoints(GetParent(),&ClientRect);
	
		//绘画拆分线
		CDC * pDC=GetDC();
		CBrush * pBrush=CDC::GetHalftoneBrush();
		CBrush * pOldBrush=pDC->SelectObject(pBrush);
		pDC->PatBlt(m_rcSplitter.left,m_rcSplitter.top,m_rcSplitter.Width(),m_rcSplitter.Height(),PATINVERT);
		m_rcSplitter.SetRectEmpty();
		pDC->SelectObject(pOldBrush);
		ReleaseDC(pDC);

		//移动位置
		CPoint PointCheck(point);
		CRect SplitterRect(ClientRect);
		MapWindowPoints(GetParent(),&PointCheck,1);
		if (m_SplitterType==HorSpliter)
		{
			int nSpace=ClientRect.Height()/2;
			PointCheck.y=__min(m_nMaxPos,PointCheck.y);
			PointCheck.y=__max(m_nLessPos,PointCheck.y);
			SplitterRect.top=PointCheck.y-nSpace;
			SplitterRect.bottom=PointCheck.y+ClientRect.Height()-nSpace;
		}
		else
		{
			int nSpace=ClientRect.Width()/2;
			PointCheck.x=__min(m_nMaxPos,PointCheck.x);
			PointCheck.x=__max(m_nLessPos,PointCheck.x);
			SplitterRect.left=PointCheck.x-nSpace;
			SplitterRect.right=PointCheck.x+ClientRect.Width()-nSpace;
		}
		if (SplitterRect!=ClientRect)
		{
			Invalidate();
			MoveWindow(&SplitterRect);
			if (m_pISplitterSink!=NULL)
			{
				m_pISplitterSink->OnSplitterEvent(this,GetWindowLong(GetSafeHwnd(),GWL_ID),PointCheck.x,PointCheck.y);
			}
		}
	}
	__super::OnLButtonUp(nFlags, point);
}

//鼠标消息
void CSkinSplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (m_bEnalbe)
	{
		//获取位置
		CRect ClientRect;
		GetClientRect(&ClientRect);

		//设置参数
		SetFocus();
		SetCapture();
		m_bMouseDown=true;

		//绘画拆分线
		CDC * pDC=GetDC();
		CBrush * pBrush=CDC::GetHalftoneBrush();
		CBrush * pOldBrush=pDC->SelectObject(pBrush);
		m_rcSplitter=ClientRect;
		if (m_SplitterType==HorSpliter)
		{
			m_rcSplitter.top=point.y-ClientRect.Height()/2;
			m_rcSplitter.bottom=point.y+ClientRect.Height()/2;
		}
		else
		{
			m_rcSplitter.left=point.x-ClientRect.Width()/2;
			m_rcSplitter.right=point.x+ClientRect.Width()/2;
		}
		pDC->PatBlt(m_rcSplitter.left,m_rcSplitter.top,m_rcSplitter.Width(),m_rcSplitter.Height(),PATINVERT);
		pDC->SelectObject(pOldBrush);
		ReleaseDC(pDC);
	}
	
	__super::OnLButtonDown(nFlags, point);
}

//位置消息
void CSkinSplitter::OnSize(UINT nType, int cx, int cy)
{
	__super::OnSize(nType, cx, cy);

	//移动按钮
	if (m_SplitterButton.m_hWnd!=NULL)
	{
		CRect rcButton;
		m_SplitterButton.GetWindowRect(&rcButton);
		int nXPos=(cx-rcButton.Width())/2;
		int nYPos=(cy-rcButton.Height())/2;
		m_SplitterButton.MoveWindow(nXPos,nYPos,rcButton.Width(),rcButton.Height());
		m_SplitterButton.ShowWindow(SW_SHOW);
	}

	return;
}

//光标消息
BOOL CSkinSplitter::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message)
{
	if (m_bEnalbe)
	{
		//获取当前点
		POINT Point;
		GetCursorPos(&Point);
		
		//判断是否按钮
		bool bButtonRgn=false;
		if (m_SplitterButton.m_hWnd!=NULL)
		{
			CRect rcButton;
			m_SplitterButton.GetWindowRect(&rcButton);
			if (rcButton.PtInRect(Point)) bButtonRgn=true;
		}

		//计算光标
		if (bButtonRgn==false)
		{
			GetParent()->ScreenToClient(&Point);
			if (m_SplitterType==VorSpliter) SetCursor(LoadCursor(NULL,IDC_SIZEWE));
			else SetCursor(LoadCursor(NULL,IDC_SIZENS));
			return TRUE;
		}
	}
	return __super::OnSetCursor(pWnd,nHitTest,message);
}
//初始化拆分条
bool CSkinSplitter::InitSplitBar(UINT uLessPos, UINT uMaxPos, bool bHorSplit)
{
	m_nMaxPos=uMaxPos;
	m_nLessPos=uLessPos;

	if (bHorSplit)
	{
		m_SplitterType=HorSpliter;
	}
	else
	{
		m_SplitterType=VorSpliter;		
	}

	return true;
}
//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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