【游戏程序设计】GDI绘图

运行效果:

 

源代码:

#include <windows.h>
#pragma comment(lib, "winmm.lib")									//调用PlaySound函数所需库文件t

#define WINDOW_WIDTH 1000
#define WINDOW_HEIGHT 800
#define WINDOW_TITLE L"【游戏程序设计】GDI绘图"

HINSTANCE hInst;
HDC hdc;															//画布
int  MyWindowClass(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyDraw(HDC);
/********************************************************************************************************
声明画笔hPen[7],画刷hBrush[7]和hFont,并分别将7种画笔形式,6种画刷形式存入sPen[7],sBrush[6]中
*********************************************************************************************************/
HPEN hPen[7];
HBRUSH hBrush[7];
HFONT hFont;
int sPen[7] = {PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME};
int sBrush[6] = {HS_VERTICAL, HS_HORIZONTAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_BDIAGONAL};

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstace,
									LPSTR lpCmdLine, int nCmdShow) 
{
	MyWindowClass(hInstance);
	PlaySound(L"sound.wav", NULL, SND_FILENAME| SND_ASYNC| SND_LOOP);	//循环播放背景音乐
	if(!InitInstance(hInstance, nCmdShow))
		return FALSE;
	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

int MyWindowClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = NULL;
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = L"gamebase";
	wcex.hIconSm = NULL;

	return RegisterClassEx(&wcex); 
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	hInst = hInstance;
	HWND hwnd = CreateWindow(L"gamebase", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, 
		CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
	if(!hwnd)
		return FALSE;
	MoveWindow(hwnd, 10, 10, WINDOW_WIDTH, WINDOW_HEIGHT, true);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
/***************************************************************************************************
利用for循环分别产生7种画笔对象和6种画刷对象
***************************************************************************************************/
	for(int i = 0; i < 7; ++i)
	{
		hPen[i] = CreatePen(sPen[i], 1, RGB(255, 0, 0));  
		if(i == 6)
			hBrush[i] = CreateSolidBrush(RGB(0, 255, 0));
		else
			hBrush[i] = CreateHatchBrush(sBrush[i], RGB(0, 255, 0));
	}
	hFont = CreateFont
	(
		60,																	//字符高度为60
		20,																	//字符宽度为20
		20,																	//字符倾斜度20
		0,																	//字体旋转角度为0
		FW_THIN,															//字体磅重为100
		0,																	//非斜体
		1,																	//有下划线
		1,																	//有删除线
		DEFAULT_CHARSET,
		OUT_STROKE_PRECIS,
		CLIP_STROKE_PRECIS,
		DRAFT_QUALITY,
		FIXED_PITCH | FF_MODERN,
		L"FONT"																//自定义字体名称为“FONT”
	);

	hdc = GetDC(hwnd);
	MyDraw(hdc);
	ReleaseDC(hwnd, hdc);  

	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;

	switch(message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		MyDraw(hdc);
		EndPaint(hwnd, &ps);
		break;
/**************************************************************************************************************
在退出程序前,往往在此处删除创建的画笔对象和画刷对象
***************************************************************************************************************/
	case WM_DESTROY:
		for(int i = 0; i < 7; ++i)
		{
			DeleteObject(hPen[i]);
			DeleteObject(hBrush[i]);
		}
		DeleteObject(hFont);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}
/***************************************************************************************************************
用各式画笔及画刷绘制线条及填充矩形
****************************************************************************************************************/
void MyDraw(HDC hdc)
{
	int y;
	for(int i = 0; i != 7; ++i)
	{
		y = (i + 1) * 30;
		SelectObject(hdc, hPen[i]); 
		MoveToEx(hdc, 30, y, NULL);								//确定直线的起点
		LineTo(hdc, 100, y);									//用于在当前点与起点之间绘制一条直线
	}
	int x1 = 120;
	int x2 = 180;
	for(int i = 0; i != 7; ++i)
	{
		SelectObject(hdc, hBrush[i]);
		Rectangle(hdc, x1, 30, x2, y);							//绘制矩形
		x1 += 70;
		x2 += 70;
	}
	SetTextColor(hdc, RGB(0,0,255));							//设置字体颜色
	SelectObject(hdc, hFont);
	//TextOut(hdc, 100, y+10, L"输出的文本", 10);					//输出字体
	RECT rect = {200,550,700,800};								//产生一个区域
	//DrawText(hdc, L"第二个文本", 10, &rect, DT_CENTER);			//在选择的区域格式化文本
	
	Rectangle(hdc, 100, 300, 200, 500);
	Arc(hdc,100, 300, 200, 500, 150, 250, 250, 400);			//绘制圆弧
	//将生成椭圆弧的起点与生成椭圆弧前一点线段连接起来
	//ArcTo(hdc,100, 300, 200, 500, 150, 250, 250, 400);
	
	Ellipse(hdc, 300, 300, 400, 500);							//绘制椭圆
	//绘制扇形,将椭圆弧起点和终点与椭圆中心连接起来构成一个区域
	Pie(hdc,500, 300, 600, 500, 550, 250, 550, 400);
	
	POINT p[3];
	p[0].x = 600;
	p[0].y = 300;
	p[1].x = 900;
	p[1].y = 400;
	p[2].x = 800;
	p[2].y = 500;
	//绘制一个封闭的多边形 将多段线的起点和终点连接起来构成一个区域
	Polygon(hdc, p, 3);						
	rect.left = 100,
	rect.top = 550,
	rect.right = 200,
	rect.bottom = 700;
	FillRect(hdc, &rect, hBrush[6]);					//用指定的画刷填充一个矩形区域
	//FrameRect(hdc, &rect, hBrush[2]);					用指定的画刷绘制矩形的边框
	InvertRect(hdc, &rect);								//在指定矩形区域内显示当前颜色的相反色
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值