运行效果:
源代码:
#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); //在指定矩形区域内显示当前颜色的相反色
}