一、绘制点
1.设置像素点的颜色
COLORREF SetPixel (
HDC hDC, // 设备上下文句柄
int X, // 像素点的坐标
int Y,
COLORREF crColor // 颜色
);
成功返回像素点的实际颜色,失败返回-1。
2.获取像素点的颜色
COLORREF GetPixel (
HDC hDC, // 设备上下文句柄
int X, // 像素点的坐标
int Y
);
返回像素点的颜色。
void DrawPoint(HDC hDC,SIZE sizeClient){
int x0=(sizeClient.cx-256)/2;
int y0=(sizeClient.cy-256)/2;
for(int x=0;x<256;x++)
for(int y=0;y<256;y++)
SetPixel(hDC,x+x0,y+y0,Rgb(x,y,0));
}
二、绘制直线
1.从当前点移动到目标点,并使目标点成为新的当前点
BOOL MoveToEx (
HDC hDC, // 设备上下文句柄
int X, // 目标点坐标
int Y,
LPPOINT lpPoint // 移动前的当前点(输出),可以为NULL
);
成功返回TRUE,失败返回FALSE。
2.从当前点到目标点画直线,并使目标点成为新的当前点
BOOL LineTo (
HDC hDC, // 设备上下文句柄
int X, // 目标点坐标
int Y
);
成功返回TRUE,失败返回FALSE。
三、绘制(椭)圆弧
1.(椭)圆弧
BOOL Arc (
HDC hDC, // 设备上下文句柄
int nLeftRect, // 外切矩形
int nTopRect,
int nRightRect,
int nBottomRect,
int nXStartArc, // 起点坐标
int nYStartArc,
int nXEndArc,
int nYEndArc // 终点坐标
);
注意起点坐标和终点坐标可以在矩形外。
成功返回TRUE,失败返回FALSE。
2.设置截弧方向
int SetArcDirection (
HDC hDC, // 设备上下文句柄
int ArcDirection // 截弧方向:AD_CLOCKWISE/AD_COUNTERCLOCKWISE - 顺时针/逆时针
);
成功返回原截弧方向,失败返回0。
四、绘制封闭图形
1.封闭图形
可以被画刷填充的图形,由直线弧线围起来图形不是封闭图形。
2.矩形
BOOL Rectangle (
HDC hDC, // 设备上下文句柄
int nLeftRect,// 左上角坐标
int nTopRect,
int nRightRect, // 右下角坐标
int nBottomRect
);
成功返回TRUE,失败返回FALSE。
3.椭圆
BOOL Ellipse (
HDC hDC, // 设备上下文句柄
int nLeftRect,// 外切矩形
int nTopRect,
int nRightRect,
int nBottomRect
);
成功返回TRUE,失败返回FALSE。
4.圆角矩形
BOOL RoundRect (
HDC hDC, // 设备上下文句柄
int nLeftRect,// 左上角坐标
int nTopRect,
int nRightRect, // 右下角坐标
int nBottomRect
int nWidth, // 圆角椭圆的两个轴
int nHeight
);
成功返回TRUE,失败返回FALSE。
五、画笔
1.作用
画笔用于线的绘制,线型,线宽,颜色。
HPEN - 画笔句柄
2.创建画笔
HPEN CreatePen (
int fnPenStyle, // 线型
int nWidth, // 线宽
COLORREF crColor // 颜色
);
成功返回画笔句柄,失败返回NULL。
fnPenStyle取值:
PS_SOLID - 实线
PS_DASH - 虚线
PS_DOT - 点线
PS_DASHDOT - 点划线
PS_DASHDOTDOT - 双点划线
PS_NULL - 不可见的线
nWidth线宽仅对PS_SOLID实线笔起作用,若nWidth>1则无论fnPenStyle取什么值画出来的都是实线。
3.将画笔选入设备上下文,同时得到设备上文中的原画笔
HGDIOBJ hpenOld = SelectObject (hDC, hpenNew);
HGDIOBJ SelectObject (
HDC hdc, // 设备上下文句柄
HGDIOBJ hgdiobj // GDI对象句柄
);
成功返回设备上下文中原GDI对象的句柄,失败返回NULL。
4.恢复原画笔
SelectObject (hDC, hpenOld);
5.删除画笔
BOOL DeleteObject (
HGDIOBJ hgdiobj // GDI对象句柄
);
成功返回TRUE,失败返回FALSE。
建->入->画->出->删
HGDIOBJ hpenOld = SelectObject (hDC, CreatePen (...));
...
DeleteObject (SelectObject (hDC, hpenOld));
注意:永远不要删除设备上下文正在持有的GDI对象。
六、画刷
1.单色画刷
HBRUSH CreateSolidBrush (
COLORREF crColor // 填充颜色
);
成功返回画刷句柄,失败返回NULL。
2.阴影线画刷
HBRUSH CreateHatchBrush (
INT fnStyle, // 阴影线风格
COLORREF crColor // 阴影线颜色
);
成功返回画刷句柄,失败返回NULL。
fnStyle取值:
HS_HORIZONTAL - 水平线阴影(-)
HS_VERTICAL - 垂直线阴影(|)
HS_CROSS - 正交线阴影(+)
HS_BDIAGONAL - 正斜线阴影(/)
HS_FDIAGONAL - 反斜线阴影(\)
HS_DIAGCROSS - 斜交线阴影(X)
3.纹理画刷
HBRUSH CreatePatternBrush (
HBITMAP hbmp // 位图句柄
);
成功返回画刷句柄,失败返回NULL。
七、位图
1.基础知识
计算机图像分为:
光栅图像:记录图像中每一个像素点的颜色和透明度信息。
矢量图像:记录图像的渲染算法、绘图指令、几何坐标。
Windows中的位图是一种光栅图像。
2.位图的使用
1)在资源中添加位图
如果有一个现成的图片.bmp,也可以加载到当前程序当中来,选择导入。
2)从资源中加载位图
HBITMAP LoadBitmap (
HINSTANCE hInstance, // 应用程序实例句柄
LPCTSTR lpBitmapName // 位图资源名
);
成功返回位图句柄,失败返回NULL。
3)创建与窗口设备上下文匹配的内存设备上下文
HDC CreateCompatibleDC (
HDC hdc // 匹配源设备上下文句柄
);
成功返回内存设备上下文句柄,失败返回NULL。
4)将位图选入内存设备上下文
HGDIOBJ hbmpOld = SelectObject (hdcMem, hbmpNew);
5)将内存设备上下文中的位图成像到目标设备上下文中
A.原样成像
BOOL BitBlt (
HDC hdc, // 目标设备上下文句柄
int nXDest, // 目标图像左上角坐标
int nYDest,
int nWidth, // 图像的宽度和高度
int nHeight,
HDC hdcSrc, // 源(内存)设备上下文句柄
int nXSrc, // 源图像左上角坐标
int nYsrc,
DWORD dwRop // 光栅操作码(ROP),源像素与目标像素的位运算
);
成功返回TRUE,失败返回FALSE。
B.缩放成像
BOOL StretchBlt (
HDC hdc, // 目标设备上下文句柄
int nXDest, // 目标图像左上角坐标
int nYDest,
int nWidthDest, // 目标图像的宽度和高度
int nHeightDest,
HDC hdcSrc, // 源设备上下文句柄
int nXSrc, // 源图像左上角坐标
int nYSrc,
int nWidthSrc, // 源图像的宽度和高度
int nHeightSrc,
DWORD dwRop // 光栅操作码(ROP),源像素与目标像素的位运算
);
6)恢复内存设备上下文的原位图
SelectObject (hdcMem, hbmpOld);
7)删除新位图如果是加载的就不需要删除了,如果是动态创建的就需要删除新位图。
DeleteObject (hbmpNew);
8)释放内存设备上下文
DeleteDC (hdcMem);
关键是内存有一个成像的过程。
hbmpimage=LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_IMAGE));
case IDM_DRAW_BITMAP:
DrawBitmap(hDC,sizeClient,hbmpImage);
{
HDC hdcMem=CreateCompatibleDC(hDC);
HGDIOBJ hbmpOld=SelectObject(hdcMem,hbmpImage);
BITMAP bmpImage;
//获取位图信息
GetObject(hbmpImage,sizeof(bmpimage),&bmpImage);
int x=(sizeClient.cx-bmpImage.bmWidth*7/2-8)/2;
int y=(sizeClient.cy-bmpImage.bmHeight*2)/2;
StretchBlt(hDC,x,y,bmpImage.bmWidth/2,bmpImage.bmHeight/2,hdcMem,0,0,bmpImage.bmWidth,bmpImage.bmHeight,SRCCOPY);
}
selectObject(hdcMem,hbmpOld);
DeleteDC(hdcMem);
1.设置像素点的颜色
COLORREF SetPixel (
HDC hDC, // 设备上下文句柄
int X, // 像素点的坐标
int Y,
COLORREF crColor // 颜色
);
成功返回像素点的实际颜色,失败返回-1。
2.获取像素点的颜色
COLORREF GetPixel (
HDC hDC, // 设备上下文句柄
int X, // 像素点的坐标
int Y
);
返回像素点的颜色。
void DrawPoint(HDC hDC,SIZE sizeClient){
int x0=(sizeClient.cx-256)/2;
int y0=(sizeClient.cy-256)/2;
for(int x=0;x<256;x++)
for(int y=0;y<256;y++)
SetPixel(hDC,x+x0,y+y0,Rgb(x,y,0));
}
二、绘制直线
1.从当前点移动到目标点,并使目标点成为新的当前点
BOOL MoveToEx (
HDC hDC, // 设备上下文句柄
int X, // 目标点坐标
int Y,
LPPOINT lpPoint // 移动前的当前点(输出),可以为NULL
);
成功返回TRUE,失败返回FALSE。
2.从当前点到目标点画直线,并使目标点成为新的当前点
BOOL LineTo (
HDC hDC, // 设备上下文句柄
int X, // 目标点坐标
int Y
);
成功返回TRUE,失败返回FALSE。
三、绘制(椭)圆弧
1.(椭)圆弧
BOOL Arc (
HDC hDC, // 设备上下文句柄
int nLeftRect, // 外切矩形
int nTopRect,
int nRightRect,
int nBottomRect,
int nXStartArc, // 起点坐标
int nYStartArc,
int nXEndArc,
int nYEndArc // 终点坐标
);
注意起点坐标和终点坐标可以在矩形外。
成功返回TRUE,失败返回FALSE。
2.设置截弧方向
int SetArcDirection (
HDC hDC, // 设备上下文句柄
int ArcDirection // 截弧方向:AD_CLOCKWISE/AD_COUNTERCLOCKWISE - 顺时针/逆时针
);
成功返回原截弧方向,失败返回0。
四、绘制封闭图形
1.封闭图形
可以被画刷填充的图形,由直线弧线围起来图形不是封闭图形。
2.矩形
BOOL Rectangle (
HDC hDC, // 设备上下文句柄
int nLeftRect,// 左上角坐标
int nTopRect,
int nRightRect, // 右下角坐标
int nBottomRect
);
成功返回TRUE,失败返回FALSE。
3.椭圆
BOOL Ellipse (
HDC hDC, // 设备上下文句柄
int nLeftRect,// 外切矩形
int nTopRect,
int nRightRect,
int nBottomRect
);
成功返回TRUE,失败返回FALSE。
4.圆角矩形
BOOL RoundRect (
HDC hDC, // 设备上下文句柄
int nLeftRect,// 左上角坐标
int nTopRect,
int nRightRect, // 右下角坐标
int nBottomRect
int nWidth, // 圆角椭圆的两个轴
int nHeight
);
成功返回TRUE,失败返回FALSE。
五、画笔
1.作用
画笔用于线的绘制,线型,线宽,颜色。
HPEN - 画笔句柄
2.创建画笔
HPEN CreatePen (
int fnPenStyle, // 线型
int nWidth, // 线宽
COLORREF crColor // 颜色
);
成功返回画笔句柄,失败返回NULL。
fnPenStyle取值:
PS_SOLID - 实线
PS_DASH - 虚线
PS_DOT - 点线
PS_DASHDOT - 点划线
PS_DASHDOTDOT - 双点划线
PS_NULL - 不可见的线
nWidth线宽仅对PS_SOLID实线笔起作用,若nWidth>1则无论fnPenStyle取什么值画出来的都是实线。
3.将画笔选入设备上下文,同时得到设备上文中的原画笔
HGDIOBJ hpenOld = SelectObject (hDC, hpenNew);
HGDIOBJ SelectObject (
HDC hdc, // 设备上下文句柄
HGDIOBJ hgdiobj // GDI对象句柄
);
成功返回设备上下文中原GDI对象的句柄,失败返回NULL。
4.恢复原画笔
SelectObject (hDC, hpenOld);
5.删除画笔
BOOL DeleteObject (
HGDIOBJ hgdiobj // GDI对象句柄
);
成功返回TRUE,失败返回FALSE。
建->入->画->出->删
HGDIOBJ hpenOld = SelectObject (hDC, CreatePen (...));
...
DeleteObject (SelectObject (hDC, hpenOld));
注意:永远不要删除设备上下文正在持有的GDI对象。
六、画刷
1.单色画刷
HBRUSH CreateSolidBrush (
COLORREF crColor // 填充颜色
);
成功返回画刷句柄,失败返回NULL。
2.阴影线画刷
HBRUSH CreateHatchBrush (
INT fnStyle, // 阴影线风格
COLORREF crColor // 阴影线颜色
);
成功返回画刷句柄,失败返回NULL。
fnStyle取值:
HS_HORIZONTAL - 水平线阴影(-)
HS_VERTICAL - 垂直线阴影(|)
HS_CROSS - 正交线阴影(+)
HS_BDIAGONAL - 正斜线阴影(/)
HS_FDIAGONAL - 反斜线阴影(\)
HS_DIAGCROSS - 斜交线阴影(X)
3.纹理画刷
HBRUSH CreatePatternBrush (
HBITMAP hbmp // 位图句柄
);
成功返回画刷句柄,失败返回NULL。
七、位图
1.基础知识
计算机图像分为:
光栅图像:记录图像中每一个像素点的颜色和透明度信息。
矢量图像:记录图像的渲染算法、绘图指令、几何坐标。
Windows中的位图是一种光栅图像。
2.位图的使用
1)在资源中添加位图
如果有一个现成的图片.bmp,也可以加载到当前程序当中来,选择导入。
2)从资源中加载位图
HBITMAP LoadBitmap (
HINSTANCE hInstance, // 应用程序实例句柄
LPCTSTR lpBitmapName // 位图资源名
);
成功返回位图句柄,失败返回NULL。
3)创建与窗口设备上下文匹配的内存设备上下文
HDC CreateCompatibleDC (
HDC hdc // 匹配源设备上下文句柄
);
成功返回内存设备上下文句柄,失败返回NULL。
4)将位图选入内存设备上下文
HGDIOBJ hbmpOld = SelectObject (hdcMem, hbmpNew);
5)将内存设备上下文中的位图成像到目标设备上下文中
A.原样成像
BOOL BitBlt (
HDC hdc, // 目标设备上下文句柄
int nXDest, // 目标图像左上角坐标
int nYDest,
int nWidth, // 图像的宽度和高度
int nHeight,
HDC hdcSrc, // 源(内存)设备上下文句柄
int nXSrc, // 源图像左上角坐标
int nYsrc,
DWORD dwRop // 光栅操作码(ROP),源像素与目标像素的位运算
);
成功返回TRUE,失败返回FALSE。
B.缩放成像
BOOL StretchBlt (
HDC hdc, // 目标设备上下文句柄
int nXDest, // 目标图像左上角坐标
int nYDest,
int nWidthDest, // 目标图像的宽度和高度
int nHeightDest,
HDC hdcSrc, // 源设备上下文句柄
int nXSrc, // 源图像左上角坐标
int nYSrc,
int nWidthSrc, // 源图像的宽度和高度
int nHeightSrc,
DWORD dwRop // 光栅操作码(ROP),源像素与目标像素的位运算
);
6)恢复内存设备上下文的原位图
SelectObject (hdcMem, hbmpOld);
7)删除新位图如果是加载的就不需要删除了,如果是动态创建的就需要删除新位图。
DeleteObject (hbmpNew);
8)释放内存设备上下文
DeleteDC (hdcMem);
关键是内存有一个成像的过程。
hbmpimage=LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_IMAGE));
case IDM_DRAW_BITMAP:
DrawBitmap(hDC,sizeClient,hbmpImage);
{
HDC hdcMem=CreateCompatibleDC(hDC);
HGDIOBJ hbmpOld=SelectObject(hdcMem,hbmpImage);
BITMAP bmpImage;
//获取位图信息
GetObject(hbmpImage,sizeof(bmpimage),&bmpImage);
int x=(sizeClient.cx-bmpImage.bmWidth*7/2-8)/2;
int y=(sizeClient.cy-bmpImage.bmHeight*2)/2;
StretchBlt(hDC,x,y,bmpImage.bmWidth/2,bmpImage.bmHeight/2,hdcMem,0,0,bmpImage.bmWidth,bmpImage.bmHeight,SRCCOPY);
}
selectObject(hdcMem,hbmpOld);
DeleteDC(hdcMem);