【Win32】绘图入门.doc_第1页
【Win32】绘图入门.doc_第2页
【Win32】绘图入门.doc_第3页
【Win32】绘图入门.doc_第4页
【Win32】绘图入门.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绘图1. 绘图基础a) 绘图设备DC(device context),即设备上下文b) HDC,DC句柄,表示绘图设备句柄c) GDI-Windows graphics device interface Windows绘图的API接口,封装在gdi32.dll动态链接库中2. 绘图颜色计算机使用红绿蓝RGB表示,通常为24位,每种颜色8位,另外:16位: 5, 5, 632位:8,8,8,8颜色加透明度(用于3D)颜色的使用:COLOREF DWORD 无符号长整型(32位)定义:COLOREF nColor;1.直接使用数值(不建议)2.使用宏RGB,RGBAnColor = RGB(0, 0, 0);nColor = RGBA(0, 0, 0, 0);获取RGB值,分别获得RGB的颜色值:GetRValue / GetRValue / GetRValue,例如:BYTE nRed = GetRValue(nColor); 获取红色的值3. 绘图步骤:绘图发生在WM_PAINT消息中:a) PAINTSTRUCT ps = 0;/存储应用程序相关信息,用于绘制应用程序窗口的客户区b) HDC hdc = BeginPaint(hWnd,&ps);c) 创建画笔、画刷等,并应用。d) 绘制图形SetPixel(hdc,100,100,RGB(255,0,0);/绘制点Ellipse(hdc, 100, 100, 500, 500);/绘制圆形Rectangle(hdc,100, 100, 500, 500);/绘制矩形e) 取回画笔画刷,恢复系统默认画笔画刷,并释放创建的画笔画刷。f) 结束绘图:EndPaint(hWnd,&ps);4. 点的绘制GetPixel 获取指定点的颜色COLORREF GetPixel(HDC hdc, int nXPos, int nYPos);SetPixel 设置指定点的颜色COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);返回值基本不用,一般情况下,返回的是设置的颜色值。5. 线的绘制(直线,弧线)a.绘制直线:MoveToEx 移动窗口的当前点到指定点,并将它指定的点作为窗口的当前点BOOL MoveToEx( HDC hdc, / DC句柄 int X, / 指定点的X坐标 int Y, /指定点的X坐标 LPPOINT lpPoint); / 原来的坐标,一般为NULL LineTo 从窗口的当前点到指定点绘制一条直线,并将它指定的点作为窗口的当前点BOOL LineTo( HDC hdc, / DC句柄 int nXEnd, / 指定点的X坐标 int nYEnd ); /指定点的X坐标b.绘制弧线:起点向终点 逆时针 方向,划分前两个坐标点确定的圆形。BOOL Arc( HDC hdc, / handle to device context int nLeftRect, / x-coord of rectangles upper-left corner int nTopRect, / y-coord of rectangles upper-left corner int nRightRect, / x-coord of rectangles lower-right corner int nBottomRect, / y-coord of rectangles lower-right corner int nXStartArc, / 起点X坐标 int nYStartArc, / y-coord of first radial ending point int nXEndArc, / 终点X坐标 int nYEndArc); / y-coord of second radial ending point注:SetArcDirection(hdc,AD_CLOCKWISE); 可将方向改为顺时针AD_COUNTERCLOCKWISE逆时针AD_CLOCKWISE顺时针6. 绘制封闭图形矩形 Rectangle圆角矩形 RoundRect圆形 Ellipse a.绘制直角矩形BOOL Rectangle( HDC hdc, / handle to DC int nLeftRect, / 左上角X坐标 int nTopRect, / y-coord of upper-left corner of rectangle int nRightRect, / x-coord of lower-right corner of rectangle int nBottomRect / y-coord of lower-right corner of rectangle);b.绘制圆角矩形BOOL RoundRect( HDC hdc, / handle to DC int nLeftRect, / x-coord of upper-left corner of rectangle int nTopRect, / y-coord of upper-left corner of rectangle int nRightRect, / x-coord of lower-right corner of rectangle int nBottomRect, / y-coord of lower-right corner of rectangle int nWidth, / 弧的宽度 width of ellipse int nHeight); / 弧的高c.绘制圆形BOOL Rectangle( HDC hdc, / handle to DC int nLeftRect, / 外切矩形左上角X坐标 int nTopRect, / y-coord of upper-left corner of rectangle int nRightRect, / x-coord of lower-right corner of rectangle int nBottomRect); / y-coord of lower-right corner of rectangle7. GDI绘图对象画笔画笔的作用:线的颜色,线型,线粗HPEN画笔句柄画笔使用步骤:a.创建画笔HPEN CreatePen(画笔样式,粗细,颜色);创建成功返回句柄画笔样式即线型,PS_SOLID实心线,可以支持多个像素宽度(粗细),其他线型只能是一个像素宽度,如果设置多个像素宽度,其他线型将采用实心线绘制图形。b.将画笔应用到DC中:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);/(DC句柄, GDI绘图对象句柄即画笔句柄)c.绘图d.取出DC中的画笔,,使用SelectObject函数将原来的画笔放入到设备DC中,就会将我们创建的画笔取出。e.释放画笔:BOOL DeleteObject(HGDIOBJ hgdiobj);只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中取出。8. GDI绘图对象画刷画刷的作用:封闭图形的填充的颜色,图案HBRUSH画刷句柄a.创建画笔HBRUSH CreateSolidBrush(COLORREF colorref)实心画刷HBRUSH CreateHatchBrush()阴影画刷HBRUSH CreatePatternBrush()位图画刷b.将画笔应用到DC中。HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);/(DC句柄,GDI绘图对象句柄即画刷句柄)c.绘图d.取出DC中的画刷将原来的画刷,使用SelectObject函数,放入到设备DC中,就会将我们创建的画笔取出。e.释放画刷:BOOL DeleteObject(HGDIOBJ hgdiobj);只能删除不被DC使用的画刷,所以在释放前,必须将画刷从DC中取出。注:可以使用GetStockObject函数获取系统维护的画刷,画笔,字体等,可通过MSDN查询该函数。HGDIOBJ GetStockObject( int fnObject / stock object type);如果不使用画刷填充,需要使用NULL_BRUSH参数,获取不填充的画刷,透明画刷。9. 位图相关1.相关知识。光栅图形 - 记录图像中每一点的颜色等信息。矢量图形 - 记录图像算法、绘图指令等。HBITMAP - 位图句柄2.位图的使用a. 在资源中添加位图资源b. 从资源中加载位图LoadBitmapHBITMAP LoadBitmap( HINSTANCE hInstance, / handle to application instance LPCTSTR lpBitmapName); / name of bitmap resourcec. 创建一个与当前DC相匹配的DC,用于内存中绘图 HDC CreateCompatibleDC(HDC hdc); /当前DC句柄,可以为NULL(使用屏幕DC)返回创建好的DC句柄d. 将位图放入匹配的DC中 SelectObjecte. 绘制位图 BOOL BitBlt(HDC hdcDest, /目的DCint nXDest, / 目的左上X坐标int nYDest, / 目的左上Y坐标int nWidth, / 目的宽度int nHeight, / 目的高度HDC hdcSrc, /源DCint nXSrc, / 源左上X坐标int nYSrc, / 源左上Y坐标DWORD dwRop); /绘制方法SRCCOPY原样成像NOSRCCOPY反色成像/缩放绘制BOOL StretchBlt(HDC hdcDest, / handle to destination DCint nXOriginDest, / x-coord of destination upper-left cornerint nYOriginDest, / y-coord of destination upper-left cornerint nWidthDest, / width of destination rectangleint nHeightDest, / height of destination rectangleHDC hdcSrc, / handle to source DCint nXOriginSrc, / x-coord of source upper-left cornerint nYOriginSrc, / y-coord of source upper-left cornerint nWidthSrc, / 源DC宽int nHeightSrc, / 源DC高DWORD dwRop); / raster operation code f 取出位图从内存句柄中取出。SelectObjectg 释放位图 DeleteObjecth 释放匹配的DC DeleteDC注:使用 GetObject 获取位图信息。10. 实例程序:a. File-New-WorkSpace创建工作空间,命名为WinPaintb. 在工作空间右击添加新工程,选择project - Win32 Application - 简单的Win32程序。c.在工作空间添加资源脚本,选择Files Resource Scription d.向资源脚本添加菜单和位图资源菜单ID为ID_PIT,ID_LINE等,caption自定。位图资源采用默认,自行绘图即可。#include stdafx.h#include resource.h/有资源文件,需要添加本头文件LPCSTR g_pszAppName = WinPaint;LPCSTR g_pszMainWndClass = MAIN;HINSTANCE g_hInstance = NULL;int g_kind = 0;/标识量,不同的标识绘制不同的图形void OnCommand(HWND hWnd, WPARAM wParam)g_kind = LOWORD(wParam);/设置绘制图形的样式switch(LOWORD(wParam)case ID_PIT:/菜单IDcase ID_LINE:case ID_REC:case ID_CLE:case ID_ARC:case ID_BMP:InvalidateRect(hWnd,NULL,TRUE);/不管哪个样式,都执行重绘,产生WM_PAINT消息break;void DrawPit(HDC hdc)/SetPixel(hdc,100,100,RGB(255,0,0);绘制单个点for (int i = 0;i 256;i+)/一片方形区域绘制点,使用渐变色for (int j = 0;j 256; j+)SetPixel(hdc,i,j,RGB(i,j,i);void DrawLine(HDC hdc)/绘制直线MoveToEx(hdc,100,100,NULL);LineTo(hdc,300,300);LineTo(hdc,0,300);void DrawRec(HDC hdc)/绘制矩形Rectangle(hdc,100, 100, 300, 300);RoundRect(hdc, 320, 100, 520, 300, 100, 100);/宽度和高度与四边边长相等是圆形void DrawCle(HDC hdc)/绘制圆形函数Ellipse(hdc,100,100,300,300);Ellipse(hdc,300,200,500,350);void DrawArc(HDC hdc)/绘制弧线Arc(hdc,100,100,300,300, 100,100,300,300);/逆时针SetArcDirection(hdc,AD_CLOCKWISE);/更改绘图方向,顺时针Arc(hdc,300,100,500,300, 300,100,500,300);void DrawBmp(HDC hdc)HBITMAP hBmp = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1);HDC hMemdc = CreateCompatibleDC(hdc);/创建一个内存DC,同时构建一个虚拟区域(窗口)HGDIOBJ nOldBmp = SelectObject(hMemdc,hBmp);/位图一旦送给内存DC,内存立即将图片在对应的虚拟区域中绘制出来BitBlt(hdc,0,0,48,48,hMemdc,0,0,SRCCOPY);/将虚拟区域中绘制的图像在窗口中成像(1:1)StretchBlt(hdc,150,100,24,24,hMemdc,0,0,48,48,SRCCOPY);/截取整个图形,缩放成像SelectObject(hMemdc,nOldBmp);DeleteObject(hBmp);DeleteDC(hMemdc);void OnPaint(HWND hWnd)PAINTSTRUCT ps = 0;HDC hdc = BeginPaint(hWnd,&ps);HPEN hPen = CreatePen(PS_DOT,1,RGB(255,0,0);/创建画笔,获取画笔句柄HGDIOBJ nOldPen = SelectObject(hdc,hPen);/画笔应用到DC,保存返回的旧画笔/HBRUSH hBrush = CreateHatchBrush(HS_BDIAGONAL,RGB(0, 255, 0);/创建填充画刷HBITMAP hBmp = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1);HBRUSH hBrush = CreatePatternBrush(hBmp);/HGDIOBJ hBrush = GetStockObject(NULL_BRUSH);/函数获取系统维护的画刷,不需要释放HGDIOBJ nOldBrush = SelectObject(hdc,hBrush); /应用画刷到DC,保存旧画刷(默认白色实心画刷)switch(g_kind)case ID_PIT:DrawPit(hdc);/绘制点break;case ID_LINE:DrawLine(hdc);/绘制直线break;case ID_REC:DrawRec(hdc);/绘制矩形break;case ID_CLE:DrawCle(hdc);/绘制圆形break;case ID_ARC:DrawArc(hdc);/绘制弧线break;case ID_BMP:DrawBmp(hdc);break;SelectObject(hdc,nOldBrush);/放入原画刷,取出创建的画刷DeleteObject(hBrush);/释放创建的画刷SelectObject(hdc,nOldPen);/放入原画笔,取出创建的画笔DeleteObject(hPen);/释放创建的画笔EndPaint(hWnd,&ps);/ 主窗口过程函数LRESULT CALLBACK MainWndProc (HWND hWnd, UINT uMsg,WPARAM wParam, LPARAM lParam) switch (uMsg) case WM_PAINT:OnPaint(hWnd);break;case WM_COMMAND:OnCommand(hWnd, wParam);break;case WM_DESTROY:PostQuitMessage (0);return 0;return DefWindowProc (hWnd, uMsg, wParam, lParam);/ 注册窗口类ATOM InitApplication (HINSTANCE hInstance) WNDCLASSEX wcex = 0;wcex.cbSize = sizeof (wcex);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = MainWndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon (NULL, IDI_APPLICATION);wcex.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wcex.hCursor = LoadCursor (NULL, IDC_ARROW);wcex.hbrBackground

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论