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

📄 area.cpp

📁 Windows 图形编程 书籍
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				{
					if ( rbutton.IsOnButton(lParam) )
						MessageBox(hWnd, "Rectangle Button Clicked", "PtInRegion", MB_OK);

					if ( ebutton.IsOnButton(lParam) )
						MessageBox(hWnd, "Ellipse Button Clicked", "PtInRegion", MB_OK);
				}
			}
			return 0;

		default:
			lr = DefWindowProc(hWnd, uMsg, wParam, lParam);
	}

	return lr;
}


const TCHAR * SysColorName[] = 
{
	"COLOR_SCROLLBAR",
	"COLOR_BACKGROUND",
	"COLOR_ACTIVECAPTION",
	"COLOR_INACTIVECAPTION",
	"COLOR_MENU",
	"COLOR_WINDOW",
	"COLOR_WINDOWFRAME",
	"COLOR_MENUTEXT",
	"COLOR_WINDOWTEXT",
	"COLOR_CAPTIONTEXT",
	"COLOR_ACTIVEBORDER",
	"COLOR_INACTIVEBORDER",
	"COLOR_APPWORKSPACE",
	"COLOR_HIGHLIGHT",
	"COLOR_HIGHLIGHTTEXT",
	"COLOR_BTNFACE",
	"COLOR_BTNSHADOW",
	"COLOR_GRAYTEXT",
	"COLOR_BTNTEXT",
	"COLOR_INACTIVECAPTIONTEXT",
	"COLOR_BTNHIGHLIGHT",
	"COLOR_3DDKSHADOW",
	"COLOR_3DLIGHT",
	"COLOR_INFOTEXT",
	"COLOR_INFOBK",
	"??",
	"COLOR_HOTLIGHT",
	"COLOR_GRADIENTACTIVECAPTION",
	"COLOR_GRADIENTINACTIVECAPTION"
};


void KMyCanvas::TestSysColorBrush(HDC hDC)
{
	for (int idx=0; GetSysColorBrush(idx); idx++)
	{
		TCHAR temp[64];

		int y = idx*18 + 20;

		SelectObject(hDC, GetSysColorBrush(idx));

		TextOut(hDC, 20, y, SysColorName[idx], _tcslen(SysColorName[idx]));

		wsprintf(temp, "%2d %08x", idx, GetSysColorBrush(idx));
		TextOut(hDC, 280, y, temp, _tcslen(temp));

		COLORREF cr = GetSysColor(idx);
		wsprintf(temp, "RGB(0x%02x, 0x%02x, 0x%02x)", GetRValue(cr), GetGValue(cr), GetBValue(cr));
		TextOut(hDC, 540, y, temp, _tcslen(temp));

		Rectangle(hDC, 420, y, 520, y+15);

		BOOL rslt = DeleteObject(GetSysColorBrush(idx));
	}
}


void Mark(HDC hDC, int x, int y, int dx, int dy, const char * yl, const TCHAR * xl)
{
	HGDIOBJ hPen = CreatePen(PS_SOLID, 1, RGB(0xFF, 0, 0));
	HGDIOBJ hOld = SelectObject(hDC, hPen);

	TextOut(hDC, x+dx,y,      yl, _tcslen(yl));
	TextOut(hDC, x+2, y+dy-8, xl, _tcslen(xl));

	MoveToEx(hDC, x+dx, y, NULL); LineTo(hDC, x, y); LineTo(hDC, x, y+dy);
	
	SelectObject(hDC, hOld);
	DeleteObject(hPen);
}


void KMyCanvas::TestRectangle(HDC hDC)
{
	HBRUSH hBlue = CreateSolidBrush(RGB(0, 0, 0xFF));

	SelectObject(hDC, hBlue);
	
	for (int i=0; i<6; i++)
	{
		SetViewportOrgEx(hDC, (i%3)*180, (i/3)*180, NULL);

		const TCHAR * Title []= 
		{ 
			_T("black pen"), 
			_T("null pen"), 
			_T("3-pixel pen"), 
			_T("black pen, advanced"), 
			_T("3-pixel inside frame pen"), 
			_T("red pen, R2_NOTCOPYPEN")
		};

		HGDIOBJ hPen;
		
		switch (i)
		{
			case 0: hPen = GetStockObject(BLACK_PEN);
					break;
			case 1: hPen = GetStockObject(NULL_PEN);
					break;
			case 2: hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
					break;
			case 3: hPen = GetStockObject(BLACK_PEN); SetGraphicsMode(hDC, GM_ADVANCED);
				    break;
			case 4: hPen = CreatePen(PS_INSIDEFRAME, 3, RGB(0, 0, 0));
					break;
			case 5: hPen = CreatePen(PS_SOLID, 1, RGB(0xFF, 0x0, 0x0));
				    SetROP2(hDC, R2_NOTCOPYPEN);
		}

		HGDIOBJ hOld = SelectObject(hDC, hPen);
		Rectangle(hDC, 60, 60, 50, 50);
		SelectObject(hDC, hOld);
		SetGraphicsMode(hDC, GM_COMPATIBLE);
		DeleteObject(hPen);
		SetROP2(hDC, R2_COPYPEN);

		ZoomRect(hDC, 48, 48, 62, 62, 80, 50, 7);
		TextOut(hDC, 50, 180, Title[i], _tcslen(Title[i]));

		Mark(hDC, 80+ 2*8, 50+ 2*8, -25, -25, "T", "L");
		Mark(hDC, 80+12*8, 50+12*8,  25,  25, "B", "R");
	}

	////////////////////
	for (i=0; i<4; i++)
	{
		SetViewportOrgEx(hDC, (i%4)*180, 360+(i/4)*180, NULL);

		const TCHAR * Title []= 
		{ 
			_T("FillRect"), 
			_T("FrameRect"), 
			_T("InvertRect"), 
			_T("DrawFocusRect")
		};
	
		RECT rect = { 50, 50, 60, 60 };

	//	InflateRect(&rect, 2, 2);
	//	HBRUSH hBlue = CreateSolidBrush(RGB(0, 0, 0xFF));
	//	FillRect(hDC, & rect, hBlue);
	//	DeleteObject(hBlue);
	//	InflateRect(&rect, -2, -2);

		switch (i)
		{
			case 0:
				FillRect(hDC, & rect, hBlue);
				break;

			case 1:
				FrameRect(hDC, & rect, hBlue);
				break;

			case 2:
				InvertRect(hDC, & rect);
				break;

			case 3:
				DrawFocusRect(hDC, & rect);
				break;
		}

		ZoomRect(hDC, 48, 48, 62, 62, 80, 50, 7);
		TextOut(hDC, 50, 180, Title[i], _tcslen(Title[i]));

		Mark(hDC, 80+ 2*8, 50+ 2*8, -25, -25, "T", "L");
		Mark(hDC, 80+12*8, 50+12*8,  25,  25, "B", "R");

	}

	SelectObject(hDC, GetStockObject(WHITE_BRUSH));
	DeleteObject(hBlue);

	SetViewportOrgEx(hDC, 0, 0, NULL);
}


void DrawControls(HDC hDC, int typ, const int state[], int no)
{
	for (int s=0; s<no; s++)
	{
		int x =    s * 56 + 20;
		int y = typ  * 56 - 40;

		RECT rect = { x, y, x+40, y+40 };

		InflateRect(&rect, 3, 3);
		FillRect(hDC, & rect, GetSysColorBrush(COLOR_BTNFACE));
		InflateRect(&rect, -3, -3);

		DrawFrameControl(hDC, & rect, typ, state[s]);
	}
}

void KMyCanvas::TestDrawFrameControl(HDC hDC)
{
	////////////////////////
	const int CaptionState[] = { DFCS_CAPTIONCLOSE,
								 DFCS_CAPTIONMIN,
								 DFCS_CAPTIONMAX,
								 DFCS_CAPTIONRESTORE,
								 DFCS_CAPTIONHELP,
								 DFCS_CAPTIONHELP | DFCS_FLAT,
								 DFCS_CAPTIONHELP | DFCS_INACTIVE
	};

	DrawControls(hDC, DFC_CAPTION, CaptionState, sizeof(CaptionState)/sizeof(int));

	////////////////////////
	const int ButtonState[] = { DFCS_BUTTONCHECK, 
								DFCS_BUTTONRADIOIMAGE,
							    DFCS_BUTTONRADIOMASK, 
								DFCS_BUTTONRADIO,
								DFCS_BUTTON3STATE,
								DFCS_BUTTONPUSH,
								DFCS_BUTTONPUSH | DFCS_FLAT,
								DFCS_BUTTONPUSH | DFCS_INACTIVE

	}; 	

	DrawControls(hDC, DFC_BUTTON, ButtonState, sizeof(ButtonState)/sizeof(int));

	////////////////////////
	const int MenuState[] = { DFCS_MENUARROW,
							  DFCS_MENUCHECK,
							  DFCS_MENUBULLET,
							  DFCS_MENUARROWRIGHT,
							  DFCS_MENUARROWRIGHT | DFCS_FLAT,
							  DFCS_MENUARROWRIGHT | DFCS_INACTIVE
	};
	DrawControls(hDC, DFC_MENU, MenuState, sizeof(MenuState)/sizeof(int));

	////////////////////////
	const int ScrollState[] = { DFCS_SCROLLUP,
								DFCS_SCROLLDOWN,
								DFCS_SCROLLLEFT,
								DFCS_SCROLLRIGHT,
								DFCS_SCROLLCOMBOBOX,
								DFCS_SCROLLSIZEGRIP,
								DFCS_SCROLLSIZEGRIPRIGHT,
								DFCS_SCROLLSIZEGRIPRIGHT | DFCS_FLAT,
								DFCS_SCROLLSIZEGRIPRIGHT | DFCS_INACTIVE
	};
	
	DrawControls(hDC, DFC_SCROLL, ScrollState, sizeof(ScrollState)/sizeof(int));

	/////////////////////////
	const int PopupMenuState[] = { 0,
							  1,
							  2,
							  3,
							  3 | DFCS_FLAT,
							  3 | DFCS_INACTIVE
	};

	DrawControls(hDC, DFC_POPUPMENU, PopupMenuState, sizeof(PopupMenuState)/sizeof(int));

	//////////////////////////
	SetViewportOrgEx(hDC, 0, 280, NULL);

	for (int e=0; e<4; e++)
	{
		int Edge[] = { EDGE_RAISED, EDGE_SUNKEN, EDGE_ETCHED, EDGE_BUMP };
		int Flag[] = { BF_MIDDLE | BF_BOTTOM, 
					   BF_MIDDLE | BF_BOTTOMLEFT, 
					   BF_MIDDLE | BF_BOTTOMLEFT | BF_TOP,
					   BF_MIDDLE | BF_RECT, 
					   BF_MIDDLE | BF_RECT | BF_FLAT, 
					   BF_MIDDLE | BF_RECT | BF_MONO, 
					   BF_MIDDLE | BF_RECT | BF_SOFT, 
					   BF_MIDDLE | BF_RECT | BF_DIAGONAL, 
					   BF_MIDDLE | BF_RECT | BF_ADJUST };

		for (int f=0; f<sizeof(Flag)/sizeof(Flag[0]); f++)
		{
			RECT rect = { f*56+20, e*56 + 20, f*56+60, e*56+60 };

			InflateRect(&rect, 3, 3);   // bigger background
			FillRect(hDC, & rect, GetSysColorBrush(COLOR_BTNFACE));
			InflateRect(&rect, -3, -3); // restore size

			DrawEdge(hDC, & rect, Edge[e], Flag[f]);
		}
	}

	SetViewportOrgEx(hDC, 0, 0, NULL);
}


void Label(HDC hDC, int x, int y, const TCHAR * mess)
{
	TextOut(hDC, x, y, mess, _tcslen(mess));
}


void KMyCanvas::TestEllipse(HDC hDC)
{
	int nSave = SaveDC(hDC);

	HGDIOBJ hBrush = CreateSolidBrush(RGB(0xFF, 0xFF, 0));
	SelectObject(hDC, hBrush);

	// Zoomed in display shows the dimension of ellipse
	
	for (int i=0; i<=6; i+=3)
	{
		SetViewportOrgEx(hDC, i*200/3, 0, NULL);

		HGDIOBJ hPen = CreatePen(PS_INSIDEFRAME, i/3, RGB(0,0,0xFF));
		SelectObject(hDC, hPen);

		if (i==3)
			SetGraphicsMode(hDC, GM_ADVANCED);

		Ellipse(hDC, 30, 30, 40+i, 40+i);
		SetGraphicsMode(hDC, GM_COMPATIBLE);

		SelectObject(hDC, GetStockObject(BLACK_PEN));
		DeleteObject(hPen);

		ZoomRect(hDC, 28, 28, 42+i, 42+i, 70, 40, 7);
	
		Mark(hDC, 70+ 2*8,     40+ 2*8,     -30, -30, "Top", "Left");
		Mark(hDC, 70+12*8+i*8, 40+12*8+i*8,  30,  30, "Bottom", "Right");

		switch (i)
		{
			case 0: Label(hDC, 70, 230, "Solid pen"); break;
			case 3: Label(hDC, 70, 230, "Solid pen, advanced mode"); break;
			case 6: Label(hDC, 70, 230, "Inside frame pen"); break;
		}
	}


	const int A = 100;
	const int B = 100;
	
	POINT P[5] = { -A, -B, A, -B, A, B, -A, B, -A, -B };
	POINT S    = {  A*3/2,    0 };
	POINT E    = {  -A*4/3, - B*3/4 };

	for (i=0; i<3; i++)
	{
		if ( i==0 )
		{
			SetViewportOrgEx(hDC, 160, 420, 0);
			SetArcDirection(hDC, AD_COUNTERCLOCKWISE);
			Label(hDC, -65, P[0].y-60, "Chord, Anticlockwise");
		}
		else
		{
			SetViewportOrgEx(hDC, 160 + i* A * 3, 420, 0);
			SetArcDirection(hDC, AD_CLOCKWISE);

			if ( i==1)
				Label(hDC, -55, P[0].y-60, "Pie, Clockwise");
			else if (i==2)
			{
				Label(hDC, -30, P[0].y-60, "Ellipse");
			}
		}
	
		// defining lines
		{
			HGDIOBJ hOldBrush = SelectObject(hDC, GetStockObject(HOLLOW_BRUSH));

			HPEN hPen = CreatePen(PS_DOT, 0, RGB(0xFF, 0, 0)); // dotted line
			HPEN hOld = (HPEN) SelectObject(hDC, hPen);

			// bounding rectangle, start/end lines
			Rectangle(hDC, P[0].x, P[0].y, P[2].x, P[2].y);
			Ellipse(hDC, P[0].x, P[0].y, P[2].x, P[2].y);

			if ( i!=2 )
			{
				Line(hDC, 0, 0, S.x, S.y); 
				Line(hDC, 0, 0, E.x, E.y);
			}

			SelectObject(hDC, hOld);
			DeleteObject(hPen);

			SelectObject(hDC, hOldBrush);
		}

		LOGBRUSH logbrush = { BS_SOLID, RGB(0, 0, 0xFF), 0 };

		HPEN hPen;
		
		switch ( i )
		{
			case 0:	
				hPen = ExtCreatePen(PS_COSMETIC | PS_ALTERNATE, 1, & logbrush, 0, NULL); 
				break;
			
			case 1:	
				hPen = ExtCreatePen(PS_GEOMETRIC | PS_INSIDEFRAME | PS_JOIN_MITER, 10, & logbrush, 0, NULL); 
				break;

			case 2:	
				logbrush.lbStyle = BS_HATCHED;
				logbrush.lbHatch = HS_DIAGCROSS;
				hPen = ExtCreatePen(PS_GEOMETRIC | PS_INSIDEFRAME, 10, & logbrush, 0, NULL); 
				break;
		}

		HPEN hOld = (HPEN) SelectObject(hDC, hPen);

		switch ( i )
		{
			case 0:
				Chord(hDC, P[0].x, P[0].y, P[2].x, P[2].y, S.x, S.y, E.x, E.y);
				break;

			case 1:
				Pie(hDC, P[0].x, P[0].y, P[2].x, P[2].y, S.x, S.y, E.x, E.y);
				break;

			case 2:
				{
					HINSTANCE hCards = LoadLibrary("cards.dll");

					SetBkColor(hDC, RGB(0xFF, 0xFF, 0));
					SetBkMode(hDC, OPAQUE);
					HBITMAP hBitmap = LoadBitmap(hCards, MAKEINTRESOURCE(52));

					hBrush = CreatePatternBrush(hBitmap);
					DeleteObject(hBitmap);
	
					HGDIOBJ hOld = SelectObject(hDC, hBrush);

					Ellipse(hDC, P[0].x, P[0].y, P[2].x, P[2].y);
					SelectObject(hDC, hOld);
					DeleteObject(hBrush);

					SetBkMode(hDC, TRANSPARENT);
					break;
				}
		}

		SelectObject(hDC, hOld);

⌨️ 快捷键说明

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