点的绘制和获取
绘制: COLORREF SetPixel(
HDC hdc, //DC句柄
int X, //x坐标
int Y, //y坐标
COLORREF crColor ); // 点的颜色
获取: COLORREF GetPixel(
HDC hdc, //DC句柄
int XPos, //x坐标
int nYPos ); //y坐标
返回指定坐标位置的点的颜色
直线的绘制
MoveToEx 移动当前点到指定位置
LineTo 从当前点绘制直线到指定位置
弧的绘制
Arc和AngleArc提供不同的绘制弧的方式:
BOOL Arc( HDC hdc,
int nLeftRect, // 外切矩形的坐标
int nTopRect,//外切矩形的坐标
int nRightRect,//外切矩形的坐标
int nBottomRect,//外切矩形的坐标
int nXStartArc,//起始切割半径的X坐标
int nYStartArc,//起始切割半径的Y坐标
int nXEndArc, //终止切割半径的X坐标
int nYEndArc ); //终止切割半径的X坐标
可以使用SetArcDirection函数,设置Arc函数
切割方向:顺时针和逆时针.
BOOL AngleArc(
HDC hdc, // handle to device context
int X, //圆心的X坐标
int Y, //圆心的Y坐标
DWORD dwRadius,//圆的半径
FLOAT eStartAngle,//开始角度
FLOAT eSweepAngle );//夹角
折线
BOOL Polyline(
HDC hdc, //DC句柄
CONST POINT *lppt,//Polyline顶点的坐标数组
int cPoints ); //顶点数组的长度
PolylineTo 与Polyline类似, 只是在
绘制Polyline前,从当前点使用LineTo绘
制直线到Polyline的第一个顶点.
绘制多组折线 PolyPolyline
BOOL PolyPolyline( HDC hdc,
CONST POINT *lppt,//所有点的数组
CONST DWORD *lpdwPolyPoints,//每组点的数量
DWORD cCount );//分组的数量
例如:
DWORD nGroup[] = { 4, 3 };
PolyPolyline( hDC, ptPolyLine,nGroup, 2 );
Bizer曲线
BOOL PolyBezier(HDC hdc,
CONST POINT *lppt,//点数组,最少4个点
DWORD cPoints );//点的数量
4个点: 1和4是端点,2.3点是控制点
7个点: 1.4.7是端点,其余是控制点
多样式的线条
BOOL PolyDraw( HDC hdc,
CONST POINT *lppt,//各个点的数组
CONST BYTE *lpbTypes, //从某点到下一点的绘制方式 pointer to line and curve identifiers
int cCount); //点的数量
lpbTypes - PT_MOVETO 移动到该点
PT_LINETO 绘直线
PT_BIZERTO Biezer曲线
矩形的绘制
普通矩形 Rectangle
带圆角的矩形
BOOL RoundRect( HDC hdc,
int nLeftRect, //左上X坐标
int nTopRect, //左上Y坐标
int nRightRect,//右下X坐标
int nBottomRect, //右下Y坐标
int nWidth, //生成圆角的椭圆的宽度
int nHeight );//生成圆角的椭圆的高度
椭圆和圆
BOOL Ellipse( HDC hdc,
int nLeftRect, //外切矩形左上X坐标
int nTopRect,//外切矩形左上Y坐标
int nRightRect, //外切矩形右下X坐标
int nBottomRect); //外切矩形右下Y坐标
饼Pie
BOOL Pie( HDC hdc,
int nLeftRect, //外切矩形左上X坐标
int nTopRect, //外切矩形左上Y坐标
int nRightRect, //外切矩形右下X坐标
int nBottomRect, //外切矩形右下Y坐标
int nXRadial1,//切割起始半径X坐标
int nYRadial1,//切割起始半径Y坐标
int nXRadial2,//切割终止半径X坐标
int nYRadial2 );//切割终止半径Y坐标
弦
BOOL Chord( HDC hdc,
int nLeftRect, //外切矩形左上X坐标
int nTopRect, //外切矩形左上Y坐标
int nRightRect, //外切矩形右下X坐标
int nBottomRect, //外切矩形右下Y坐标
int nXRadial1,//切割起始半径X坐标
int nYRadial1,//切割起始半径Y坐标
int nXRadial2,//切割终止半径X坐标
int nYRadial2 );//切割终止半径Y坐标
多边形
BOOL Polygon( HDC hdc,
CONST POINT *lpPoints, //多边形的顶点
int nCount ); //顶点的数量
PolyPolygon 可以绘制多组多边形
GDI绘图对象 - 画笔
2.1 画笔的作用
可以控制线条的颜色、样式、宽度。
2.2 画笔的使用
2.2.1 创建画笔 CreatePen
HPEN CreatePen(
int fnPenStyle, //画笔的样式
int nWidth, //画笔的宽度
COLORREF crColor);//画笔的颜色
2.2.2 置成当前DC可以使用的画笔
HGDIOBJ SelectObject(
HDC hdc, // 当前DC的句柄
HGDIOBJ hgdiobj );//要使用的GDI对象句柄
返回当前DC原来使用的同类型的GDI对象句柄。
2.2.3 绘制图形
2.2.4 从当前DC中取出画笔,即将旧画笔
放入当前DC中
SelectObject( hDC, hOldPen );
2.2.5 销毁画笔
DeleteObject( hPen );
画笔使用时,由于绘图资源有限,一定要
注意释放。
GDI绘图对象 - 画刷
3.1 画刷的作用
填充封闭图形,包括样式、颜色等。
3.2 画刷的使用
3.2.1 创建画刷
CreateSolidBrush 创建实心画刷
CreateHatchBrush 创建阴影线的画刷
3.2.2 置成当前DC可以使用的画刷
SelectObject 和画笔使用方式类似
3.2.3 绘制图形
3.2.4 取出画刷
SelectObject 和画笔使用方式类似
3.2.5 销毁画刷
DeleteObject 和画笔使用方式类似
GDI绘图对象 - 位图
1 位图 - 通过保存图像上每个点的颜色,生成相应
的位图文件。
光栅图 - 可以理解为图像点阵的保存
矢量图 - 可以理解为绘图命令的保存
2 位图资源的使用
2.1 加载位图资源
HBITMAP LoadBitmap(
HINSTANCE hInstance, //位图资源所在应用程序句柄
LPCTSTR lpBitmapName ); //位图资源ID字符串
返回位图句柄HBITMAP
2.2 创建放置位图的DC
HDC CreateCompatibleDC( HDC hDC );
创建一个和指定的hDC相匹配的DC(DC中
包含信息一致)
2.3 将位图放入创建的DC中
SelectObject
2.4 绘制位图到当前DC中
BOOL BitBlt(
HDC hdcDest, //绘制的目的DC句柄
int nXDest, //绘制的目的左上x坐标
int nYDest, //绘制的目的左上y坐标
int nWidth, //绘制的目的宽
int nHeight, //绘制的目的高
HDC hdcSrc, //需要绘制的DC句柄
int nXSrc, //需要绘制的原图的起始X坐标
int nYSrc, //需要绘制的原图的起始y坐标
DWORD dwRop); //绘图方式
BOOL StretchBlt(
HDC hdcDest, //绘制的目的DC句柄
int nXOriginDest,//绘制的目的左上x坐标
int nYOriginDest, //绘制的目的左上y坐标
int nWidthDest,//绘制的目的宽
int nHeightDest, //绘制的目的高
HDC hdcSrc, //需要绘制的DC句柄
int nXOriginSrc,//需要绘制的原图的起始X坐标
int nYOriginSrc,//需要绘制的原图的起始y坐标
int nWidthSrc,//需要绘制的原图的宽
int nHeightSrc,//需要绘制的原图的高
DWORD dwRop ); //绘图方式
2.5 取出位图
SelectObject
2.6 删除创建的DC
DeleteDC
2.7 删除位图
DeleteObject
2.8 获取位图信息
int GetObject(
HGDIOBJ hgdiobj,//GDI对象句柄,这里就是HBITMAP
int cbBuffer,//位图信息的BUFF的大小
LPVOID lpvObject ); //位图信息的BUFF指针
位图的BUFF类型为 BITMAP 结构
文字和字体
1 文字的绘制
1.1 TextOut
1.2 DrawText
int DrawText(
HDC hDC,//DC句柄
LPCTSTR lpString, //字符串
int nCount,//字符串长度
LPRECT lpRect,//绘制字符串的矩形区域
UINT uFormat ); //绘制方式
DT_CENTER - 水平居中
DT_VCENTER - 垂直居中
DT_SINGLELINE - 单行显示不换行
DT_NOCLIP - 超出矩形框不剪切
DT_WORDBREAK - 换行
1.3 ExtTextOut
绘制字符时,可以设置字符间距.
对于汉字字符,由于一个字符占2个字节,
所以汉字字符之间的间距应该为0;
CHAR szText2[12] = "E你xtTex好";
INT nText[10] = { 30, 0, 30, 30, 30,
30, 30, 30, 0, 10 };
ExtTextOut( hDC, 100, 300, ETO_OPAQUE,
NULL, szText2, strlen(szText2), nText );
1.4 字符绘制的相关属性
SetTextColor 设置字符的颜色
SetBkColor 设置背景色
SetBkMode 绘制的方式
2 字体的使用
2.1 创建字体
HFONT CreateFont(
int nHeight, //字体逻辑高
int nWidth, //字体逻辑宽度
int nEscapement, //切斜度
int nOrientation,//旋转
int fnWeight,//加粗
DWORD fdwItalic,//斜体
DWORD fdwUnderline,//下划线
DWORD fdwStrikeOut,//删除线
DWORD fdwCharSet,//字符集
DWORD fdwOutputPrecision, //输出
DWORD fdwClipPrecision, //剪切
DWORD fdwQuality, //输出质量
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace ); //字体名称
2.2 设置字体
SelectObject
2.3 绘图
2.4 取出字体
SelectObject
2.5 删除字体
DeleteObject
2.6 创建字体常使用TrueType字体.
上述绘图方法有很多简单重复的地方,所以我只写了几个有代表性的代码示例:
//获取客户区DC
CDC* pClientDC = GetDC();
/////////////////////////////////点/////////////////////////////////////////
//绘制点
pClientDC->SetPixel(10, 20, RGB(255, 0, 0));
//得到点的颜色
COLORREF clPixel = pClientDC->GetPixel(10, 20);
/////////////////////////////////线/////////////////////////////////////////
//绘制线
pClientDC->MoveTo(0, 0);
pClientDC->LineTo(100, 100);
/////////////////////////////////矩形/画刷的使用////////////////////////////////////////
//创建画刷
CBrush brs;
brs.CreateHatchBrush(HS_CROSS,RGB(0,255,0));//++类型,绿色画刷
//载入画刷
CBrush* pOldBrs = pClientDC->SelectObject(&brs);
//绘制矩形
pClientDC->Rectangle(50, 50, 100, 100);
//载出画刷
pClientDC->SelectObject(pOldBrs);
//删除画刷
brs.DeleteObject();
///////////////////////////////////位图的使用///////////////////////////////////////
//创建位图
CBitmap bmpCar;
bmpCar.LoadBitmapW(IDB_BMP_CAR);
//创建内存DC
CDC MemClientDC;
MemClientDC.CreateCompatibleDC(pClientDC);
//位图加载到内存DC上
MemClientDC.SelectObject(bmpCar);
//将内存DC绘制到客户区
pClientDC->BitBlt(0, 0, 400, 200, &MemClientDC, 0, 0, SRCCOPY);
//删除内存DC和位图
MemClientDC.DeleteDC();
bmpCar.DeleteObject();
//////////////////////////////////字体的绘制////////////////////////////////////////
//创建字体
CFont font;
font.CreatePointFont(200, _T("宋体"));
//载入字体
CFont* pOldFont;
pOldFont = pClientDC->SelectObject(&font);
//绘制字
pClientDC->TextOutW(450, 50, _T("你好"));
//载出字体
pClientDC->SelectObject(pOldFont);
//删除字体
font.DeleteObject();
ReleaseDC(pClientDC);