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

📄 gbutton.cpp

📁 一个简单而又高效的嵌入式操作系统.包括GUI及文件系统.仿Windows设计,类似于MFC风格
💻 CPP
字号:
// GButton.cpp: implementation of the GButton class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
#include "GButton.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

GButton::GButton()
{
	m_nStyle=0;
	m_nState=0;
}

GButton::~GButton()
{

}

//消息处理函数
void GButton::WndProc(int nMessage, int wParam, int lParam)
{
	switch(nMessage)
	{
	case WM_PAINT:
		if(wParam & ODA_EDGE)OnNcPaint();
		if(wParam & ~ODA_EDGE)OnPaint();
		break;
	case WM_LBUTTONDOWN:
		m_nState |= ODS_GRAYED;
		PostMessage(WM_PAINT,ODA_CLIENT,-1);
		break;
	case WM_LBUTTONUP:
		m_nState &= ~ODS_GRAYED;
		nMessage=PtInRect(wParam,lParam,m_rectWnd);
		switch(m_nStyle & 0x0f)
		{
		case BS_PUSHBUTTON:
			SetCheck(0);
			break;
		case BS_CHECKBOX:
			if(nMessage)SetCheck(-1);
			else PostMessage(WM_PAINT,ODA_CLIENT,-1);
			break;
		case BS_RADIOBUTTON:
			if(nMessage)SetCheck(1);
			else PostMessage(WM_PAINT,ODA_CLIENT,-1);
			break;
		case BS_OWNERDRAW:
			PostMessage(WM_PAINT,ODA_CLIENT,-1);
		}
		if(nMessage && m_pParent)
		{
			m_pParent->PostMessage(WM_COMMAND,(int)this,BN_CLICKED);
		}
		break;
	case WM_MOVE:
		OnMove();
		break;
	case WM_CREATE:
		OnCreate();
		break;
	default:
		break;
	}
}

void GButton::OnPaint()
{
	switch(m_nStyle & 0x0f)
	{
	case BS_PUSHBUTTON:
		if(m_nStyle & BS_LINKLIKE)DrawLinkButton();
		else DrawButton();
		break;
	case BS_CHECKBOX:
	case BS_RADIOBUTTON:
		if(m_nStyle & BS_PUSHLIKE)DrawButton();
		else DrawCheckBox();
		break;
	case BS_OWNERDRAW:
		m_pParent->WndProc(WM_DRAWITEM,(int)this,m_nState);
		break;
	}
}


void GButton::DrawButton()
{
	int c=m_nForeColor;
	RECT r=m_Rect;

	if(m_nStyle & WS_FLAT)
	{
		m_nForeColor=EdgeRGB(255);
		Rectangle(r);
	}
	else if(m_nStyle & BS_FLAT)
	{
		if(m_nState & (ODS_CHECKED|ODS_GRAYED))
		{
			Draw3dRect(r,EdgeRGB(128),EdgeRGB(255));
		}
		else
		{
			Draw3dRect(r,EdgeRGB(255),EdgeRGB(128));
		}
	}
	else
	{
		if(m_nState & (ODS_CHECKED|ODS_GRAYED))
		{
			m_nForeColor=EdgeRGB(0);
			Rectangle(r);
			m_nForeColor=EdgeRGB(128);
			r.left+=1;r.right-=1;
			r.top+=1;r.bottom-=1;
			Rectangle(r);
		}
		else
		{
			DrawEdge(r,EDGE_RAISED);
			r.left+=1;r.right-=1;
			r.top+=1;r.bottom-=1;
		}
	}
	r.left+=1;r.right-=1;
	r.top+=1;r.bottom-=1;
	if(m_nBackColor!=CLR_NONE)
	{
		if((m_nStyle & BS_PUSHLIKE) && (m_nState & ODS_CHECKED))
		{
			FillRect(r,RGB(255,255,255),m_nBackColor);
		}
		else FillRect(r,m_nBackColor);
	}
	r.left+=2;r.right-=2;
	r.top+=2;r.bottom-=2;
	if(m_nState & ODS_FOCUS)
	{
		m_nForeColor=(c & CLR_MASK) | PS_DOT1;
		Rectangle(r);
	}
	if(m_nState & (ODS_CHECKED|ODS_GRAYED))
	{
		r.left+=1;r.top+=1;
	}
	else
	{
		r.right-=1;r.bottom-=1;
	}
	
	m_nForeColor=c;
	DrawText(m_strText,r,DT_CENTER|DT_VCENTER);
}

void GButton::DrawCheckBox()
{
	int c=m_nForeColor;
	RECT r,r2=m_Rect;
	SIZE size=GetTextExtent(1);

	if(m_nBackColor!=CLR_NONE)FillRect(m_Rect,m_nBackColor);

	r.top=(m_Rect.top+m_Rect.bottom-size.cy+2)/2;
	r.bottom=r.top+size.cy-3;
	r2.top=(m_Rect.top+m_Rect.bottom-size.cy)/2;
	r2.bottom=r2.top+size.cy-1;
	if(m_nStyle & BS_LEFTTEXT)
	{
		r.right=m_Rect.right;
		r.left=r.right-size.cy+1;
		r2.right=r.left-size.cx;
		r2.left=r2.right-size.cx*m_strText.GetLength()+1;
	}
	else
	{
		r.left=m_Rect.left;
		r.right=r.left+size.cy-3;
		r2.left=r.right+size.cx;
		r2.right=r2.left+size.cx*m_strText.GetLength()-1;
	}
	if(m_nStyle & (WS_FLAT|BS_FLAT))
	{
		m_nForeColor=EdgeRGB(255);
		Rectangle(r);
		r.left+=1;r.right-=1;
		r.top+=1;r.bottom-=1;
		Rectangle(r);
	}
	else
	{
		DrawEdge(r,EDGE_SUNKEN);
		r.left+=2;r.right-=2;
		r.top+=2;r.bottom-=2;
	}
	if(m_nState & ODS_GRAYED)
	{
		FillRect(r,RGB(192,192,192));
	}
	else FillRect(r,RGB(255,255,255));
	if(m_nState & ODS_CHECKED)
	{
		r.left+=2;r.top+=2;
		r.right-=2;r.bottom-=2;
		Draw3dRect(r,RGB(192,192,192),RGB(128,128,128));
		r.left+=1;r.top+=1;
		r.right-=1;r.bottom-=1;
		FillRect(r,c);
	}
	m_nForeColor=(m_nState & ODS_FOCUS)?(c & CLR_MASK)|PS_DOT1:(m_nBackColor & CLR_MASK);
	r.left=r2.left-size.cx/2;r.top=r2.top-1;
	r.right=r2.right+size.cx/2;r.bottom=r2.bottom+1;
	Rectangle(r);
	
	m_nForeColor=c;
	DrawText(m_strText,r2,DT_CENTER|DT_VCENTER);
}

void GButton::DrawLinkButton()
{
	int c;
	RECT r;
	SIZE size=GetTextExtent(1);

	r.top=(m_Rect.top+m_Rect.bottom-size.cy-4)/2;
	r.bottom=r.top+size.cy+3;
	c=size.cx*m_strText.GetLength()+4;
	r.left=(m_Rect.left+m_Rect.right-c)/2;
	r.right=r.left+c+1;
	c=m_nForeColor;

	if(m_nBackColor!=CLR_NONE)FillRect(m_Rect,m_nBackColor);
	if(m_nState & (ODS_CHECKED | ODS_GRAYED))
	{
		Draw3dRect(r,EdgeRGB(128),EdgeRGB(255));
	}
	else if(m_nState & ODS_FOCUS)
	{
		m_nForeColor=EdgeRGB(192) | PS_DOT1;
		Rectangle(r);
	}
	m_nForeColor=c & CLR_MASK;
	Line(r.left+2,r.bottom-1,r.right-2,r.bottom-1);
	m_nForeColor=c;
	DrawText(m_strText,m_Rect,DT_CENTER|DT_VCENTER);

	m_nForeColor=c;
}

void GButton::SetCheck(BOOL bCheck)
{
	switch(m_nStyle & 0x0f)
	{
	case BS_RADIOBUTTON:
	{
		if(!(m_nState & ODS_CHECKED))
		{
			int i;
			for(i=m_nWndIndex+1;i<m_nWndCount;i++)
			{
				if(m_aWnd[i]->m_pParent!=m_pParent)break;
				if(m_aWnd[i]->m_nStyle & WS_GROUP)break;
				if(m_aWnd[i]->m_nStyle & BS_RADIOBUTTON)
				{
					if(m_aWnd[i]->m_nState & ODS_CHECKED)
					{
						m_aWnd[i]->m_nState &= ~ODS_CHECKED;
						m_aWnd[i]->PostMessage(WM_PAINT,ODA_CLIENT,-1);
						i=-1;
						break;
					}
				}
			}
			i=(i==-1 || (m_nStyle & WS_GROUP))?-1:m_nWndIndex-1;
			for(;i>=0;i--)
			{
				if(m_aWnd[i]->m_pParent!=m_pParent)break;
				if(m_aWnd[i]->m_nStyle & BS_RADIOBUTTON)
				{
					if(m_aWnd[i]->m_nState & ODS_CHECKED)
					{
						m_aWnd[i]->m_nState &= ~ODS_CHECKED;
						m_aWnd[i]->PostMessage(WM_PAINT,ODA_CLIENT,-1);
						break;
					}
				}
				if(m_aWnd[i]->m_nStyle & WS_GROUP)break;
			}
			m_nState |= ODS_CHECKED;
			PostMessage(WM_PAINT,ODA_CLIENT,-1);
		}
	}
	default:
		if(bCheck<0)bCheck=(m_nState & ODS_CHECKED)?0:1;
		if(bCheck)m_nState |= ODS_CHECKED;
		else m_nState &= ~ODS_CHECKED;
		PostMessage(WM_PAINT,ODA_CLIENT,-1);
	}
}

BOOL GButton::GetCheck()
{
	return (m_nState & ODS_CHECKED)?TRUE:FALSE;
}

void GButton::OnCreate()
{

}

⌨️ 快捷键说明

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