Win32学习(第六天)初识gdi

gdi 是图形设备接口 可以在屏幕上输出图形图像
gdi函数的分类
1、取得和释放设备上下文的函数
2、取得有关设备内容信息的函数
3、绘图函数
4、设定和取得设备上下文参数的函数
5、调用gdi对象的函数

gdi在屏幕上可以输出的图形图像分为四类
1、直线和曲线(像LineTo()函数可以画线,Arc()函数可以画弧)
2、填充区域(像FillEllipse()填充椭圆—)
3、文字(TextOut()函数输出字符串)
4、位图(像GetDC() 所获得的是屏幕的DC, 使用此DC ,可以对屏幕进行绘图)
设备上下文:dc(设备环境)包含有关某个设备的绘制属性信息的windows数据结构

在窗口绘制图形,图形分为四步
1、得到设备的环境句柄(hdc=GetDC(hWnd);)
2、修改设备属性
3、绘图
4、释放设备环境句柄(ReleaseDC(hWnd,hdc)?

在Windows里面得到设备环境句柄有两种情况:
1、在WM_PAINT消息里面去得到设备环境句柄
那么什么情况下窗口会响应paint消息:
(1)、在窗口最初创建时
(2)、窗口出现无效区域(使用的情况较多)
2、窗口一共有四种情况会出现无效区域
(1)、窗口移动或者大小改变
(2)、窗口隐藏之后重新显示或被其他窗口遮掩部分重新可见
(3)、调用InvalidateRect、InvalidateRgn函数,使窗口出现无效区域
(4)、ScrollDC和ScrollWindow函数,滚动客户区或窗口,出现无效区域。
2、在WM_PAINT消息外面去得到设备环境句柄(GetDC),第四步通过ReleaseDC释放环境句柄

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_RBUTTONDOWN:
	{
						   hdc = GetDC(hWnd);
						   RECT r = { 0, 0, 1024, 768 };
						   HBRUSH hr = CreateSolidBrush(0xffffff);//填充区域,填充r这个矩形区域,用hr这个画刷
						   FillRect(hdc, &r, hr);
						   ReleaseDC(hWnd, hdc);
	}
	/*	break;
	case WM_LBUTTONDOWN:
		{ hdc = GetDC(hWnd);
						   for (int i = 0; i < 100; ++i)
						   {
							   SetPixel(hdc, 100 + i, 10, RGB(255, 0, 0));
						   }
						   for (int i = 0; i < 100; ++i)
						   {
							   SetPixel(hdc, 100 + i, 200, GetPixel(hdc, 100 + i, 100));
						   }
						   ReleaseDC(hWnd, hdc);
	}
		break;*/
	case WM_LBUTTONDOWN:
	{
//1、得到设备的环境的句柄
		hdc = GetDC(hWnd);
		//2、修改设备属性
		//没有设定画笔即为nullptr,默认为黑色
		HPEN hpen = nullptr;//画笔句柄
		hpen = (HPEN)GetStockObject(WHITE_PEN);//使用系统预设资源
		hpen = CreatePen(PS_DOT//画笔风格
			//1、画笔的笔宽,如果笔宽大于1,不管什么风格都会变成PS_SOLID
			,1, RGB(255, 0, 0));//画笔的颜色
		SelectObject(hdc, hpen);//选择gdi对象进dc
	
//3、绘图
//画线
		MoveToEx(hdc, 100, 100, nullptr);//把画笔移动到某一个点
		LineTo(hdc, 200, 200);//画线到某个点,如果之前没有设定起点,默认起点为0,0坐标,如果之前有画线,上个终点将是新起点
		LineTo(hdc, 400, 200);//
		//画圆弧:借助这个圆的外接矩形来确认圆的大小(逆时针来画)
		//起点和终点可以不必在圆上,如果起(终)点在圆外,从圆心到起点做连线与圆的交点为起点(终)点,如果在圆内,从圆内到点做连线再做延长线与圆的交点,如果在圆心,沿x轴正方向与圆的交点

		Arc(hdc, 
			100, 100, 600, 400, //圆或圆弧的外接矩形
			0, 0,//圆弧的起点位置
			350, 250);//圆弧的终点位置
//注意:如果有SelectObject就一定要用DeleteObject来释放gdi对象		   
		DeleteObject(hpen);
		//释放环境句柄
		ReleaseDC(hWnd,hdc);
	}
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择: 
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO:  在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值