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

📄 panels.h

📁 C语言大赛的平台。分为环境模块和策略模块。
💻 H
字号:
/**
 * Panels often used
 */

#pragma once

class SolidPanel: public virtual Panel
{
	public:
		SolidPanel(Window *pWnd, int x, int y, int width, int height, COLORREF bkColor = 0xDDDDDD):
			Panel(pWnd, x, y, width, height),
			mBkColor(bkColor)
	{
	}

		virtual ~SolidPanel(void)
		{
		}

	protected:
		virtual void drawBkg(void)
		{
			RECT rect = {
				0, 0, mWidth, mHeight};
			HBRUSH hBr = CreateSolidBrush(mBkColor);
			FillRect(mhMemDC, &rect, hBr);
			DeleteObject(hBr);
		}

	protected:
		COLORREF mBkColor;
};

class AlphaSolidPanel: public virtual Panel
{
	public:
		AlphaSolidPanel(Window *pWnd, int x, int y, int width, int height,
				COLORREF bkColor = 0, unsigned char alpha = 127):
			Panel(pWnd, x, y, width, height, DIRTY_STATE_ALL),
			mBkColor(bkColor), mAlpha(alpha)
	{
	}

		virtual ~AlphaSolidPanel(void)
		{
		}

	protected:
		virtual void drawBkg(void)
		{
			RECT rect = {
				0, 0, mWidth, mHeight};
			HBRUSH hBr = CreateSolidBrush(mBkColor);
			FillRect(mhMemDC, &rect, hBr);
			DeleteObject(hBr);
		}

		virtual void BitBlt(void)
		{
			alert(mpWnd->gethMemDC() == NULL);

			BLENDFUNCTION bf;
			bf.BlendOp = AC_SRC_OVER;
			bf.BlendFlags = 0;
			bf.SourceConstantAlpha = mAlpha;
			bf.AlphaFormat = 0;

			AlphaBlend(mpWnd->gethMemDC(), mX, mY, mWidth, mHeight, mhMemDC, 0, 0, mWidth, mHeight, bf);
		}

	protected:
		COLORREF mBkColor;
		unsigned char mAlpha;
};

class TransparentPanel: public virtual Panel
{
	public:
		TransparentPanel(Window *pWnd, int x, int y, int width, int height):
			Panel(pWnd, x, y, width, height, DIRTY_STATE_ALL)
	{
		alert(mpWnd == NULL);
		alert(mpWnd->gethWnd() == NULL);
	}

		virtual ~TransparentPanel(void)
		{
		}

	protected:
		virtual void drawBkg(void)
		{
			RECT rect = {
				0, 0, mWidth, mHeight};
			HBRUSH hBr = CreateSolidBrush(0);
			FillRect(mhMemDC, &rect, hBr);
			DeleteObject(hBr);
		}

		virtual void BitBlt(void)
		{
			alert(mpWnd->gethMemDC() == NULL);
			TransparentBlt(mpWnd->gethMemDC(), mX, mY, mWidth, mHeight,
					mhMemDC, 0, 0, mWidth, mHeight, 0x000000);
		}
};

class ImagePanel: public virtual Panel
{
	public:
		ImagePanel(Window *pWnd, int x, int y, int width, int height, wchar_t *filename):
			Panel(pWnd, x, y, width, height),
			mhImageBmp(NULL),
			mhImageDC(NULL)
	{
		alert(mpWnd == NULL);
		alert(mpWnd->gethWnd() == NULL);

		mhImageDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
		alert(mhImageDC == NULL);
		mhImageBmp = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		alert(mhImageBmp == NULL);
		mhBmpOld = (HBITMAP)SelectObject(mhImageDC, mhImageBmp);
	}

		virtual ~ImagePanel(void)
		{
			HBITMAP hBmpOld = (HBITMAP)SelectObject(mhImageDC, mhBmpOld);
			alert(mhImageBmp != hBmpOld);
			DeleteObject(mhImageBmp);
			DeleteDC(mhImageDC);
		}

	protected:
		virtual void drawBkg(void)
		{
			::BitBlt(mhMemDC, 0, 0, mWidth, mHeight, mhImageDC, 0, 0, SRCCOPY);
		}

	protected:
		HBITMAP mhImageBmp, mhBmpOld;
		HDC mhImageDC;
};

class TransparentImagePanel: public virtual Panel
{
	public:
		TransparentImagePanel(Window *pWnd, int x, int y, int width, int height, wchar_t *filename):
			Panel(pWnd, x, y, width, height, DIRTY_STATE_ALL),
			mhImageBmp(NULL),
			mhImageDC(NULL)
	{
		alert(mpWnd == NULL);
		alert(mpWnd->gethWnd() == NULL);

		mhImageDC = CreateCompatibleDC(GetDC(mpWnd->gethWnd()));
		alert(mhImageDC == NULL);
		mhImageBmp = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		alert(mhImageBmp == NULL);
		mhBmpOld = (HBITMAP)SelectObject(mhImageDC, mhImageBmp);
	}

		virtual ~TransparentImagePanel(void)
		{
			HBITMAP hBmpOld = (HBITMAP)SelectObject(mhImageDC, mhBmpOld);
			alert(mhImageBmp != hBmpOld);
			DeleteObject(mhImageBmp);
			DeleteDC(mhImageDC);
		}

	protected:
		virtual void drawBkg(void)
		{
			RECT rect = {
				0, 0, mWidth, mHeight};
			HBRUSH hBr = CreateSolidBrush(0);
			FillRect(mhMemDC, &rect, hBr);
			DeleteObject(hBr);

			::BitBlt(mhMemDC, 0, 0, mWidth, mHeight, mhImageDC, 0, 0, SRCCOPY);
		}

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

	protected:
		HBITMAP mhImageBmp, mhBmpOld;
		HDC mhImageDC;
};

class SnapshotPanel: public virtual Panel
{
	public:
		SnapshotPanel(Window *pWnd, int x, int y, int width, int height):
			Panel(pWnd, x, y, width, height)
	{
	}

		virtual ~SnapshotPanel(void)
		{
		}

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

	protected:
		virtual void drawBkg(void)
		{
		}
};

const int MAX_MESSAGE_LEN = 1024;

class MessagePanel: public virtual Panel
{
	public:
		MessagePanel(Window *pWnd, int x, int y, int width, int height,
				COLORREF bkColor = 0xDDDDDD, COLORREF borderColor = 0xAAAAAA):
			Panel(pWnd, x, y, width, height),
			mBkColor(bkColor), mBorderColor(borderColor)
	{
		wcsncpy(mMessage, L"", MAX_MESSAGE_LEN);
	}

		virtual ~MessagePanel(void)
		{
		}

		void setMessage(wchar_t *message)
		{
			wcsncpy(mMessage, message, MAX_MESSAGE_LEN);
			mMessage[MAX_MESSAGE_LEN - 1] = 0;

			draw(false);
		}

	protected:
		virtual void drawBkg(void)
		{
			if((mWidth < 2) || (mHeight < 2))
				return;

			RECT rect = {
				1, 1, mWidth - 1, mHeight - 1};
			HBRUSH hBr = CreateSolidBrush(mBkColor);
			FillRect(mhMemDC, &rect, hBr);
			DeleteObject(hBr);

			HPEN hPen, hPenOld;
			hPen = CreatePen(PS_SOLID, 1, mBorderColor);
			hPenOld = (HPEN)SelectObject(mhMemDC, hPen);
			MoveToEx(mhMemDC, 0, 0, NULL);
			LineTo(mhMemDC, mWidth - 1, 0);
			LineTo(mhMemDC, mWidth - 1, mHeight);
			MoveToEx(mhMemDC, 0, 0, NULL);
			LineTo(mhMemDC, 0, mHeight - 1);
			LineTo(mhMemDC, mWidth, mHeight - 1);
			SelectObject(mhMemDC, hPenOld);
			DeleteObject(hPen);

			HFONT hFontOld;
			hFontOld = (HFONT)SelectObject(mhMemDC, leader.getStdFont());
			SetBkMode(mhMemDC, TRANSPARENT);
			DrawTextW(mhMemDC, mMessage, wcslen(mMessage), &rect, 0);
			SelectObject(mhMemDC, hFontOld);
		}

	protected:
		COLORREF mBkColor, mBorderColor;
		wchar_t mMessage[MAX_MESSAGE_LEN];
};

⌨️ 快捷键说明

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