win32第八天

一、绘制点
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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值