第二章 windows的图形设备接口及windows绘图

绘图效果

在这里插入图片描述

代码及注释说明

#include<windows.h>


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//该程序是一个画图程序,定义设备环境、画笔和画刷、及包含绘图信息的机构体变量、以及一个点数组。
	HDC hDC;  //定义设备环境句柄。要在设备环境里处理消息。
	HPEN hPen;
	HBRUSH hBrush;
	PAINTSTRUCT PtStr;  //定义包含绘图信息的结构体变量
	POINT points[6] = { {100,212},{70,227},{70,250},{130,250},{130,227},{100,212} };

	switch (message)
	{
	/*
	//系统会在多个不同的时机发送WM_PAINT消息:
	//当第一次创建一个窗口时,
	//当改变窗口的大小时,
	//当把窗口从另一个窗口背后移出时,
	//当最大化或最小化窗口时,
	//等等......
	*/
	case WM_PAINT:  //第一次创建窗口时就会发出一个WM_PAINT消息
		hDC = BeginPaint(hwnd, &PtStr);  //开始画图,将绘图信息的结构取出放到设备环境

		hPen = (HPEN)GetStockObject(NULL_PEN);
		hBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
		SelectObject(hDC, hPen);  //加载画笔到设备环境
		SelectObject(hDC, hBrush);  //加载画刷到设备环境
		LineTo(hDC, 50, 50);  //用空笔画线,实质是把画笔移到起始位置
		DeleteObject(hPen);  //用完当前画笔不用,要删除
		
		//画三角形
		hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));  //设置画笔
		SelectObject(hDC, hPen);  //加载画笔
		LineTo(hDC, 150, 50);
		LineTo(hDC, 100, 137);
		LineTo(hDC, 50, 50);
		Polyline(hDC, points, 6);  //用points数组的点画图形
		Arc(hDC, 63, 137, 138, 212, 100, 137, 100, 137);  //画圆
		Pie(hDC, 213, 137, 288, 212, 240, 137, 260, 137);  //画饼图
		Rectangle(hDC, 213, 212, 287, 250);  //画矩形
		RoundRect(hDC, 213, 100, 287, 137, 20, 20);  //画圆角矩形

		DeleteObject(hPen);  //删除画笔
		DeleteObject(hBrush);  //删除画刷
		EndPaint(hwnd, &PtStr);  //结束画图
		return 0;
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
	WNDCLASS wndclass;
	char lpszClassName[] = "Paint";
	wndclass.style = 0;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.lpfnWndProc = WndProc;  //wndclass对消息的处理用WndProc
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszClassName = lpszClassName;
	wndclass.lpszMenuName = 0;

	return RegisterClass(&wndclass);
}
BOOL InitWindow(HINSTANCE hInstance, int nCmdShow)
{
	HWND hwnd;
	char lpszTitleName[] = "PaintingTool";

	hwnd = CreateWindow(
		"Paint",
		lpszTitleName,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		0,
		CW_USEDEFAULT,
		0,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	if (!hwnd)
		return FALSE;
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	return TRUE;
}


int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
	if (!InitWindowsClass(hThisInst))  return FALSE;
	if (!InitWindow(hThisInst, nCmdShow))  return FALSE;

	MSG msg;  //定义一条消息
	/*
	此时只有一条消息,即在WinMain中定义的msg,GetMessage取出的就是msg。
	初始化时,指定了hThisInst中的消息由WndProc处理。
	*/
	while (GetMessage(&msg, NULL, 0, 0))  //GetMessage每次从线程消息中取出一条消息
	{
		TranslateMessage(&msg);  //TranslateMessage把虚拟键消息转换为字符消息。对一些键盘事件预处理。
		DispatchMessage(&msg);  //DispatchMessage把取出的消息发送到目的窗口
	}
	return msg.wParam;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值