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

📄 panel.cpp

📁 C语言大赛的平台。分为环境模块和策略模块。
💻 CPP
字号:
#include "GKL.h"

using namespace GKL;


Panel::Panel(Window *pWnd, int x/* = 0*/, int y/* = 0*/,
		int width/* = 0*/, int height/* = 0*/, int dirtyMark/* = DIRTY_STATE_UPPER*/):
	DIRTY_MARK(dirtyMark),
	mpWnd(pWnd),
	mhMemDC(NULL),
	mhMemBMP(NULL), mhMemBMPOld(NULL),
	mhDrawProc(NULL),
	mX(x), mY(y),
	mWidth(width), mHeight(height),
	mDirtyState(DIRTY_STATE_INIT)
{
	alert(mpWnd == NULL);
	alert(mpWnd->gethWnd() == NULL);

	// Prepare the memory DC
	HDC hDC = GetDC(mpWnd->gethWnd());
	mhMemDC = CreateCompatibleDC(hDC);
	alert(mhMemDC == NULL);
	mhMemBMP = CreateCompatibleBitmap(hDC, width, height);
	alert(mhMemBMP == NULL);
	mhMemBMPOld = (HBITMAP)SelectObject(mhMemDC, mhMemBMP);
}

Panel::~Panel(void)
{
	if(mhMemDC != NULL)
	{
		alert(mhMemBMP != SelectObject(mhMemDC, mhMemBMPOld));
		mhMemBMPOld = NULL;
		DeleteObject(mhMemBMP);
		mhMemBMP = NULL;
		DeleteDC(mhMemDC);
		mhMemDC = NULL;
	}

	// remove all controls, don't forget it
	clearControlList();
}

int Panel::addControl(Control *pControl)
{
	list<Control*>::iterator itor;
	itor = find(mControlList.begin(), mControlList.end(), pControl);
	alert(itor != mControlList.end());

	if(pControl->mpPnl != NULL)
		pControl->mpPnl->removeControl(pControl);
	mControlList.push_back(pControl);
	pControl->mpPnl = this;
	return 0;
}

int Panel::removeControl(Control *pControl)
{
	list<Control*>::iterator itor;
	itor = find(mControlList.begin(), mControlList.end(), pControl);
	if(itor == mControlList.end())
		return -1;
	mControlList.erase(itor);
	pControl->mpPnl = NULL;
	return 0;
}

int Panel::clearControlList(void)
{
	list<Control*>::iterator itor;
	for(itor = mControlList.begin(); itor != mControlList.end(); itor++)
		(*itor)->mpPnl = NULL;
	mControlList.clear();
}

HDC Panel::gethMemDC(void)
{
	return mhMemDC;
}

void Panel::getPosition(int &x, int &y)
{
	x = mX;
	y = mY;
}

void Panel::getPosition(POINT &point)
{
	point.x = mX;
	point.y = mY;
}

void Panel::getSize(int &width, int &height)
{
	width = mWidth;
	height = mHeight;
}

void Panel::WindowToPanel(int &x, int &y)
{
	x -= mX;
	y -= mY;
}

void Panel::WindowToPanel(POINT &point)
{
	point.x -= mX;
	point.y -= mY;
}

void Panel::draw(bool needThread)
{
	if(needThread)
	{
		if(mhDrawProc == NULL)
			mhDrawProc = CreateThread(NULL, 0, drawProc, (LPVOID)this, 0, NULL);
	}
	else
	{
		drawBkg();
		drawControls();
		markDirty();
	}
}

int Panel::onTrigger(void *pParam)
{
	RefreshParam *pRP = (RefreshParam*)pParam;

	switch(pRP->flag & METHOD_MASK)
	{
		case METHOD_DETECT:
			detect(pParam);
			break;
		case METHOD_REFRESH:
			refresh(pParam);
			break;
		default:
			alert(true);
	}
}

void Panel::detect(void *pParam)
{
	RefreshParam *pRP = (RefreshParam*)pParam;
	list<Control*>::iterator itor;

	if(mDirtyState == DIRTY_STATE_INIT)
		draw(false);
	else
	{
		int flagDraw = DRAW_NONE;
		for(itor = mControlList.begin(); itor != mControlList.end(); itor++)
		{
			if(((*itor)->onDrawDetect(flagDraw)) < 0)
				break;
		}
		switch(flagDraw)
		{
			case DRAW_NONE:
				break;
			case DRAW_NORMAL:
				draw(false);
				break;
			case DRAW_USETHREAD:
				draw(true);
				break;
			default:
				alert(true);
		}
	}

	switch(mDirtyState)
	{
		case DIRTY_STATE_CLEAN:
			break;
		case DIRTY_STATE_UPPER:
			if((pRP->flag & REFRESH_MASK) == REFRESH_NONE)
			{
				pRP->flag = (pRP->flag & METHOD_MASK) | REFRESH_UPPER;
				pRP->pChanger = this;
			}
			break;
		case DIRTY_STATE_ALL:
			if((pRP->flag & REFRESH_MASK) != REFRESH_ALL)
			{
				pRP->flag = (pRP->flag & METHOD_MASK) | REFRESH_ALL;
				pRP->pChanger = this;
			}
			break;
		default:
			alert(true);
	}

	mDirtyState = DIRTY_STATE_CLEAN;
}

void Panel::refresh(void *pParam)
{
	RefreshParam *pRP = (RefreshParam*)pParam;

	switch(pRP->flag & REFRESH_MASK)
	{
		case REFRESH_NONE:
			break;
		case REFRESH_UPPER:
			if(pRP->pChanger == this)
			{
				pRP->flag = (pRP->flag & METHOD_MASK) | REFRESH_ALL;
				BitBlt();
			}
			break;
		case REFRESH_ALL:
			BitBlt();
			break;
		default:
			alert(true);
	}
}

void Panel::drawControls(void)
{
	list<Control*>::iterator itor;
	for(itor = mControlList.begin(); itor != mControlList.end(); itor++)
		(*itor)->reDraw();
}

void Panel::markDirty(void)
{
	mDirtyState = DIRTY_MARK;
}

void Panel::BitBlt(void)
{
	alert(mpWnd->gethMemDC() == NULL);
	::BitBlt(mpWnd->gethMemDC(), mX, mY, mWidth, mHeight, mhMemDC, 0, 0, SRCCOPY);
}

DWORD WINAPI Panel::drawProc(LPVOID pParam)
{
	Panel *pPnl = (Panel*)pParam;
	pPnl->drawBkg();
	pPnl->drawControls();
	pPnl->markDirty();

	CloseHandle(pPnl->mhDrawProc);
	pPnl->mhDrawProc = NULL;

	return EXIT_SUCCESS;
}

⌨️ 快捷键说明

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