📄 gradientstatic.cpp
字号:
// GradientStatic.cpp : implementation file
//
#include "stdafx.h"
#include "GradientStatic.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGradientStatic
CPoint ta5[5]; //定义五个变量表示哲学家所在位置
CPoint tropic5[5]; //筷子闲置时的位置
CPoint usetropic[5];//筷子使用时的位置,每个哲学家用两个筷子
int radius;
CPoint CenterPoint;
CGradientStatic::CGradientStatic()
{
m_iLeftSpacing = 10;
clLeft = GetSysColor(COLOR_ACTIVECAPTION);
clRight = GetSysColor(COLOR_BTNFACE);
clText = GetSysColor(COLOR_CAPTIONTEXT);
m_bCenter = FALSE;
hinst_msimg32 = LoadLibrary( "msimg32.dll" );
m_bCanDoGradientFill = FALSE;
pFont = NULL;
if(hinst_msimg32)
{
m_bCanDoGradientFill = TRUE;
dllfunc_GradientFill = ((LPFNDLLFUNC1) GetProcAddress( hinst_msimg32, "GradientFill" ));
}
m_RunBrush.CreateSolidBrush(RGB(255,0,0));
m_IdleBrush.CreateSolidBrush(RGB(255,255,255));
bmp1.LoadBitmap(IDB_BITMAP31);
bmp2.LoadBitmap(IDB_BITMAP21);
bmp3.LoadBitmap(IDB_BITMAP11);
maskbmp1.LoadBitmap(IDB_BITMAPm31);
maskbmp2.LoadBitmap(IDB_BITMAPm21);
maskbmp3.LoadBitmap(IDB_BITMAPm11);
zuomianbmp.LoadBitmap(IDB_BITMAPZM); //桌面的图片
m_back.CreatePatternBrush(&zuomianbmp);
m_pen.CreatePen(PS_SOLID,4,RGB(255,255,255));
}
CGradientStatic::~CGradientStatic()
{
FreeLibrary( hinst_msimg32 );
bmp1.DeleteObject();
bmp2.DeleteObject();
bmp3.DeleteObject();
maskbmp1.DeleteObject();
maskbmp2.DeleteObject();
maskbmp3.DeleteObject();
m_back.DeleteObject();
m_pen.DeleteObject();
}
BEGIN_MESSAGE_MAP(CGradientStatic, CStatic)
//{{AFX_MSG_MAP(CGradientStatic)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGradientStatic message handlers
void CGradientStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
static BOOL IsRgn = FALSE;
if(m_bCanDoGradientFill)//绘制整个渐变的背景
{
TRIVERTEX rcVertex[2];
rect.right--; // exclude this point, like FillRect does
rect.bottom--;
rcVertex[0].x=rect.left;
rcVertex[0].y=rect.top;
rcVertex[0].Red=GetRValue(clLeft)<<8; // color values from 0x0000 to 0xff00 !!!!
rcVertex[0].Green=GetGValue(clLeft)<<8;
rcVertex[0].Blue=GetBValue(clLeft)<<8;
rcVertex[0].Alpha=0x0000;
rcVertex[1].x=rect.right;
rcVertex[1].y=rect.bottom;
rcVertex[1].Red=GetRValue(clRight)<<8;
rcVertex[1].Green=GetGValue(clRight)<<8;
rcVertex[1].Blue=GetBValue(clRight)<<8;
rcVertex[1].Alpha=0;
GRADIENT_RECT rect;
rect.UpperLeft=0;
rect.LowerRight=1;
// fill the area
dllfunc_GradientFill( dc,rcVertex,2,&rect,1,GRADIENT_FILL_RECT_H);
//if Gradient Fil works - let's use font color defined by user
::SetTextColor(dc,clText);
}
else
{
//there is no gradient, so let's use standart color
::SetTextColor(dc,GetSysColor(COLOR_BTNTEXT));
}
//int i;
//CBrush *oldBrush;
//dc.Polygon(ta5,5);
int i;
CPen *oldpen;
//= (CPen*)dc.SelectObject(&m_pen);
int x1,y1,x2,y2;
int top,left,right,bottom;
if(!IsRgn)
{
for(i = 0;i<5;i++)
{
/*dc.BeginPath();
dc.MoveTo(tropic5[i].x,tropic5[i].y);
dc.LineTo((tropic5[i].x - (tropic5[i].x - CenterPoint.x)/4),
(tropic5[i].y - (tropic5[i].y - CenterPoint.y)/4));
dc.CloseFigure();
dc.EndPath();
m_pthinker->rgn[i].CreateFromPath(&dc);
CRect rect;*/
x1 = tropic5[i].x;
y1 = tropic5[i].y;
x2 = tropic5[i].x - (tropic5[i].x - CenterPoint.x)/4;
y2 = tropic5[i].y - (tropic5[i].y - CenterPoint.y)/4;
left = min(x1,x2);
top = min(y1,y2);
right = max(x1,x2);
bottom = max(y1,y2);
m_pthinker->Idlerect[i].SetRect(left,top,right,bottom);
m_pthinker->Idlerect[i].InflateRect(5,5);
}
for(i = 0;i<5;i++)
{
/*dc.BeginPath();
dc.MoveTo(usetropic[i].x,usetropic[i].y);
dc.LineTo((usetropic[i].x - (usetropic[i].x - CenterPoint.x)/4),
(usetropic[i].y - (usetropic[i].y - CenterPoint.y)/4));
dc.EndPath();
m_pthinker->usergn[i].CreateFromPath(&dc);*/
x1 = usetropic[i].x;
y1 = usetropic[i].y;
x2 = usetropic[i].x - (usetropic[i].x - CenterPoint.x)/4;
y2 = usetropic[i].y - (usetropic[i].y - CenterPoint.y)/4;
left = min(x1,x2);
top = min(y1,y2);
right = max(x1,x2);
bottom = max(y1,y2);
m_pthinker->userect[i].SetRect(left,top,right,bottom);
m_pthinker->userect[i].InflateRect(5,5);
}
IsRgn = TRUE;
}
//dc.SelectObject(oldpen);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap *oldbitmap;
BITMAP bmpInfo;
oldbitmap = memDC.SelectObject(&maskbmp1);
maskbmp1.GetBitmap(&bmpInfo);
dc.BitBlt(ta5[0].x-bmpInfo.bmWidth/2,30,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&bmp1);
dc.BitBlt(ta5[0].x-bmpInfo.bmWidth/2,30,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&maskbmp1);
maskbmp1.GetBitmap(&bmpInfo);
dc.BitBlt(ta5[1].x-bmpInfo.bmWidth/2,ta5[1].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&bmp1);
dc.BitBlt(ta5[1].x-bmpInfo.bmWidth/2,ta5[1].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&maskbmp1);
maskbmp1.GetBitmap(&bmpInfo);
dc.BitBlt(ta5[4].x-bmpInfo.bmWidth/2,ta5[4].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&bmp1);
dc.BitBlt(ta5[4].x-bmpInfo.bmWidth/2,ta5[4].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT);
memDC.SelectObject(oldbitmap);
CBrush *oldbrush;
oldbrush = (CBrush*)dc.SelectObject(&m_back);
dc.Ellipse(CenterPoint.x - (radius-10),CenterPoint.y - (radius-10),
CenterPoint.x + (radius-10),CenterPoint.y + (radius-10));
dc.SelectObject(oldbrush);
oldbitmap = memDC.SelectObject(&maskbmp2);
maskbmp2.GetBitmap(&bmpInfo);
dc.BitBlt(ta5[3].x-5-8,ta5[3].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&bmp2);
dc.BitBlt(ta5[3].x-5-8,ta5[3].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&maskbmp3);
maskbmp3.GetBitmap(&bmpInfo);
dc.BitBlt(ta5[2].x-bmpInfo.bmWidth+8,ta5[2].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND);
memDC.SelectObject(oldbitmap);
oldbitmap = memDC.SelectObject(&bmp3);
dc.BitBlt(ta5[2].x-bmpInfo.bmWidth+8,ta5[2].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT);
memDC.SelectObject(oldbitmap);
oldpen = (CPen*)dc.SelectObject(&m_pen);
BOOL ShouldDrawtropic = FALSE;
for(i = 0;i<5;i++)
{
if(m_pthinker->tropicStatus[i] == 0)
{
dc.MoveTo(tropic5[i].x,tropic5[i].y);
dc.LineTo((tropic5[i].x - (tropic5[i].x - CenterPoint.x)/4),
(tropic5[i].y - (tropic5[i].y - CenterPoint.y)/4));
}
}
for( i = 0;i<5;i++)
{
if(m_pthinker->thinkerStatus[i] == EATING_STATUS)
{
dc.MoveTo(usetropic[i].x,usetropic[i].y);
dc.LineTo((usetropic[i].x - (usetropic[i].x - CenterPoint.x)/4),
(usetropic[i].y - (usetropic[i].y - CenterPoint.y)/4));
}
}
//for(i = 0;i<5;i++)
//{
// dc.Rectangle(m_pthinker->thinkerRect[i]);
//}
dc.SelectObject(oldpen);
HFONT hfontOld;
if(pFont)
hfontOld = (HFONT)SelectObject(dc.m_hDC, (HFONT)pFont->m_hObject);
::SetBkMode(dc, TRANSPARENT);
GetClientRect(&rect);
for(i = 0;i<THINKER_NUM;i++)
{
//if(i == 0)
//{
if(m_pthinker->thinkerStatus[i] == THINKING_STATUS)
m_sTEXT = "1+1=?";
else if(m_pthinker->thinkerStatus[i] == EATING_STATUS)
m_sTEXT = "好香呀!";
else if(m_pthinker->thinkerStatus[i] == HUNGRY_STATUS)
m_sTEXT = "我饿喔!";
else m_sTEXT = " ";
::DrawText(dc, m_sTEXT, -1, &m_pthinker->thinkerRect[i],
DT_SINGLELINE|DT_VCENTER|DT_CENTER);
// }
}
/*if(m_bCenter)
::DrawText(dc, m_sTEXT, -1, &rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
else
{
rect.left+=m_iLeftSpacing;
::DrawText(dc, m_sTEXT, -1, &rect, DT_SINGLELINE|DT_VCENTER|DT_LEFT);
}*/
if(pFont)
::SelectObject(dc.m_hDC, hfontOld);
}
void CGradientStatic::SetWindowText(LPCSTR lpszString)
{
m_sTEXT = lpszString;
Invalidate(TRUE);
}
CString CGradientStatic::GetWindowText()
{
return m_sTEXT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -