WINDOWS GDI 2

.图形绘制
HDC不用时就释放,以免溢出
3.1画笔

   HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor);
      参数1:样式 PS_SOLID实现实线PS_DASH短线
                 PS_DOT点 PS_DASHDOT 短线点
      第二个参数: 画笔的宽度
      第三个参数: 颜色RGB,直接构建 COLORREF color = RGB(255,255,255)

**绘图四大步骤

1.获得设备环境句柄
2.修改设备属性
3.绘图
4. 释放设备环境句柄

paint内部

   BeginPaint(窗口句柄, PAINTSTRUCT结构体指针); 
   EndPaint(窗口句柄, 结构体指针);

消息外部

    GetDC(窗口句柄)//返回上下文句柄
    ReleaseDC(窗口句柄,设备句柄)
#include "stdafx.h"
#include "class06.h"
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_LBUTTONDOWN:
	{
     break;	 }
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
case WM_LBUTTONDOWN:
	{  
						   //画笔除了画线外可以画点
						   hdc = GetDC(hWnd);

						   for (int i = 0; i < 100; ++i)
							   SetPixel(hdc, 100 + i, 100, RGB(255, 0, 0));//在x,y位置设置一个颜色点
						   for (int i = 0; i < 100; ++i)
							   SetPixel(hdc, 100 + i, 200, GetPixel(hdc, 100 + i, 100));

						   //HPEN hpen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
						   //SelectObject(hdc, hpen);
						   //MoveToEx(hdc, 100, 100, nullptr);
						   //LineTo(hdc, 200, 200);
						   //DeleteObject(hpen);
						   ReleaseDC(hWnd, hdc);
	}
		break;
case WM_LBUTTONDOWN:
	{          
	           1、得到设备环境句柄
				hdc = GetDC(hWnd);
						   定义一个设备属性,以供第2步来进行修改
			HPEN hpen = nullptr;//画笔句柄
		    hpen = (HPEN)GetStockObject(WHITE_PEN);//得到系统预设的画笔
		    hpen = CreatePen(PS_DASHDOT, //画笔的风格
						            1, //画笔的宽度,如果这个宽度大于1,无论画笔的风格是什么,都会是实线风格PS_SOLID
						   RGB(255, 0, 0));//画笔颜色//创建自定义画笔
				  2、修改设备属性
		 SelectObject(hdc, hpen);//给hdc关联了一个新的画笔对象
	  //没有设置第2步也可以画gdi的对象,但是要注意dc里面是有默认的数据的,在dc里面默认设置了一只黑色的画笔,用来画线
				//3、绘图
			  画线
						   MoveToEx(hdc,100,200,nullptr);//移动到某一个点
						   LineTo(hdc, 200, 200);//画一条线到某一个点
					   
				   //画圆弧(画图形会有一个外接矩形,逆时针画)
					   Arc(hdc, 100, 100, 400, 400, 0, 0, 250, 400);//圆弧的终点
					   		   DeleteObject(hpen);//第2步的释放新的gdi对象
	//					   //4、释放设备环境句柄
	//					   ReleaseDC(hWnd, hdc);
	//}
	//	break;

3.2画刷

   实心画刷:HBRUSH  CreateSolidBrush(颜色)
   阴影画刷:  HBRUSH  CreateHatchBrush(样式,颜色)
        HS_BDIAGONAL---正斜线, HS_FDIAGONAL----反斜线
        HS_DIAGCROSS---正反交叉  HS_CROSS---井字格
   位图画刷: CreatePatternBrush(位图句柄)
             HBITMAP hBmp = LoadBitmap( 
             g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1) );
            HBRUSH hBrush = CreatePatternBrush( hBmp ); 
case WM_LBUTTONDOWN:
	{
	          //位图
	      	//gdi里面只支持位图(bmp后缀格式)
						   //注意:1、位图无法预设
						   hdc = GetDC(hWnd);//1、得到设备环境句柄
						   //第2步:创建一个兼容dc
						   HDC bitDc = CreateCompatibleDC(hdc);//根据hdc创建一个兼容的bitDC     要不然会出现闪屏
						   HBITMAP hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));//从资源加载IDB_BITMAP1这个位图
						   SelectObject(bitDc, hBitmap);//修改兼容dc的设备属性

						   BitBlt(hdc,0,0,1024,768,bitDc,0,0,SRCCOPY);//3、绘图
						   DeleteObject(hBitmap);//释放兼容dc关联的位图
						   DeleteDC(bitDc);//兼容dc的释放
						   ReleaseDC(hWnd, hdc);//4、释放设备环境句柄
	}
		break;


	case WM_LBUTTONDOWN:
	{
					   hdc = GetDC(hWnd);
						   HFONT hfont = nullptr;//字体句柄
					   hfont = CreateFont(100,//字体的高度
					   0,//字体的宽度,如果给出了高度,宽度给0,那么自动匹配字体的宽高比,非0的话,这个值就是宽度
						   0/*900*/,//文字的倾斜角度,10表示1度
						   0,//基线的倾斜角度
						   0,//笔画的粗细,400以下为细体,700以上为粗体
						   false,//斜体
						   false,//是否有下划线
						   false,//是否水平线
						   GB2312_CHARSET,//字符集
					       ANSI_CHARSET,
							   0,
							   0,
							   0,
							   0,
						   _T("Buxton Sketch"));//字样名
						   SelectObject(hdc, hfont);

						   //锚点  默认为左上角
						   for (int i = -1; i < 2; i++)
						   {
							   for (int j = -1; j < 2; ++j)
							   {
								   SetPixel(hdc, 400 + i, 200 + j, RGB(255, 0, 0));
							   }
					   }

						   HBRUSH hr = CreateSolidBrush(RGB(255, 255, 0));
						   SelectObject(hdc, hr);
						   Rectangle(hdc, 300, 100, 600, 400);

						   //SetTextAlign(hdc, TA_RIGHT | TA_TOP);//设置文本的锚点
						   SetTextColor(hdc, RGB(255, 0, 0));//设置文本的前景色
						   SetBkColor(hdc, RGB(0, 0, 255));//设置文本的背景色
						   SetBkMode(hdc, TRANSPARENT);//默认模式 OPAQUE,用自身的背景色来填充

						   TextOut(hdc, 400, 200, _T("abc虽非机动车"), 8);
						   //DrawText()
					   DeleteObject(hfont);
					   ReleaseDC(hWnd, hdc);
	}
	break;
case WM_RBUTTONDOWN:
	{             //画两种不同颜色的细线
						   hdc = GetDC(hWnd);
						   HPEN hp = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    						SelectObject(hdc, hp);
						   MoveToEx(hdc, 700, 100, nullptr);
						   LineTo(hdc, 800, 100);
						   DeleteObject(hp);
               //画线  
						   HPEN hp1 = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
						   SelectObject(hdc, hp1);
					        LineTo(hdc,900,100);
						   DeleteObject(hp1);
						   ReleaseDC(hWnd, hdc);

						   hdc = GetDC(hWnd);
						   RECT r = { 0, 0, 1024, 768 }; //存储矩形框
						   HBRUSH hr = CreateSolidBrush(RGB(255, 255, 255));
					       FillRect(hdc,&r,hr);//颜色填充矩形区域,没有描边
						   DeleteObject(hr);
						   ReleaseDC(hWnd, hdc);
	}
		break;
case WM_LBUTTONDOWN:
	{
						   //gdi中,同一时刻只能使用同一类的一个gdi对象
						   //画刷是用来做一个区域的操作
						   //如果没有设置画刷,系统提供了一只白色的画刷,去填充一个区域,这个区域是有描边
						   //如果没有设置画笔,系统提供了一只黑色的画笔,所以画刷的描边是用系统默认的画笔
						   hdc = GetDC(hWnd);
						   HPEN hp = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
						   SelectObject(hdc, hp);

						   HBRUSH hr = nullptr;//画刷句柄
						   hr = CreateSolidBrush(RGB(255,0,0));//创建一个纯色的画刷
						   hr = CreateHatchBrush(HS_BDIAGONAL, RGB(255, 0, 0));//创建风格画刷
						   HBITMAP hbitmap = (HBITMAP)LoadImage(hInst, _T("2.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
						   hr = CreatePatternBrush(hbitmap);//创建位图画刷
						   SelectObject(hdc, hr);

						   Rectangle(hdc,400,400,600,768);//用画刷填充矩形
						   Pie(hdc, 100, 100, 600, 400, 350, 400, 350, 400);//画饼图
					   Chord(hdc, 100, 100, 600, 400, 350, 400, 350, 400);//画弦图

						   DeleteObject(hr);

						   HBRUSH hr1 = CreateHatchBrush(HS_HORIZONTAL, RGB(0, 0, 255));
						   SelectObject(hdc, hr1);

						   Ellipse(hdc, 150, 150, 600, 500);//用画刷填充圆

					   DeleteObject(hp);
						   DeleteObject(hr1);
						   ReleaseDC(hWnd, hdc);
	}
		break;
switch (message)
	{
	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;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

3.3设定设备上下文参数
直白点就是把画笔等应用到DC中

 Selectobject(设备上下文句柄,需要选择的句柄);//画刷句柄,文字等
  deleteSObject(需要删除的其他句柄); //删除句柄,释放内存

3.4画点

COLORREF SetPixel(设备句柄,x,y,RGB);//返回原来点颜色
GetPixel()获取某个点的颜色  

3.5 画线

  LineTo(设备环境句柄,终点x,终点y) true划线成功 否则失败
  MoveToEx(设备环境句柄,起点x,起点Y,NULL);

3.6画圆

  BOOL Ellipse(HDC hdc, int nLeftRect,   int nTopRect, 
            nRightRect,  int nBottomRect)//参数左顶右底

3.7画矩形

 Rectangle(上下文句柄,左角x,左角y,右下x,右下y);
 成功返回非0,读法:
  RoundRect(  DC: HDC;   X1, Y1, X2, Y2, X3, Y3)//圆角矩形1、点2是构成矩形的坐标; X3是圆角宽度、Y3是圆角高度

3.8画图

1 得到dc
  2 创建兼容dc
  3 加载位图
  LoadImage(实例句柄,位图名,图片类型,宽,高,加载方式);
  4.选用位图对象 selectobject()
  5.进行贴图 bitblt()
    刷新区域
  ValidateRect(窗口句柄,const RECT * L);//更新窗口,第二个参数NULL

3.9文字

   文字输出函数:
     TextOut(文字输出DC句柄,x坐标,y坐标,字符串指针,字符串个数)
     DrawText(设备句柄,字符串,字符串长度,LPRECT绘制区域,绘制模式)
     绘制模式如下: 
         DT_BOTTOM--底部对齐,和DT_SINGLELINE一起使用
         DT_LETF  DT_RIGHT DT_TOP DT_SINGLELINE 单行显示
设置文字颜色:COLORREF SetTextColor(设备句柄,颜色)
设置文字背景透明:SetBKMode(设备句柄,模式)
模式:QPAQUE 不透明  TRANSPARENT----透明 
创建字体:
   BOOL CreateFont( int nHeight逻辑高度, 
int nWidth逻辑宽度, 
int nEscapement显示角度, //显示的坡度
int nOrientation字体角度, //水平上字体的斜角度
int nWeight字体磅数,
BYTE bItalic是否斜体, 
BYTE bUnderline是否下划线,
 					BYTE cStrikeOut是否删除线, 
BYTE nCharSet所需字符集,
 					BYTE nOutPrecision输出精度,
BYTEnClipPrecision裁剪精度, 
BYTE nQuality输出质量,
 					BYTE nPitchAndFamily字符间距的字符集, 
LPCTSTR lpszFacename字体名称 );
BOOL PolyTextOut(HDC hdc, CONST POLYTEXT *pptxt, int cStrings);
功能:在指定设备环境下以当前所选的字体和正文颜色绘制多个字符串。
CreateFontIndirect 可以用来设置字体属性等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风赤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值