📄 gbutton.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 + -