.图形绘制
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 可以用来设置字体属性等