GDI GDI+从入门到精通-第二讲_第1页
GDI GDI+从入门到精通-第二讲_第2页
GDI GDI+从入门到精通-第二讲_第3页
GDI GDI+从入门到精通-第二讲_第4页
GDI GDI+从入门到精通-第二讲_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、第二讲:统计报表的背景、文字与图形的绘制主讲人:阙海忠 UIPower CEO2LoadBitmap图片的加载HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);函数的作用是从应用程序工程资源中读取位图数据。第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄第二个参数BitmapName是位图在资源中的ID名称。3LoadImage图片的加载LoadImage这个函数可以加载位图、图标、光标多种图像数据。从资源加载hbmpBack = (HBITMAP) :LoadImage (hInst,MAK

2、EINTRESOURCE (IDB_BACK),IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);4LoadImage图片的加载从文件路径加载hbmpBack = (HBITMAP) :LoadImage (NULL,_T(.1.bmp),IMAGE_BITMAP,0, 0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);5位图的销毁位图的销毁是调用DeleteObject函数。:DeleteObject(hbmpBack);6BitBlt绘制位图BOOL WINA

3、PI BitBlt (HDC hdc, /目标DC的句柄 int x, int y, int cx, int cy, /目标区域HDC hdcSrc, /源DC的句柄int x1,int y1, /源区域的左上角 DWORD rop /操作标志,一般是SRCCOPY,是拷贝的意思。); 7总结一下绘制位图的步骤获得目标DC句柄创建与目标DC兼容的临时内存DC将位图句柄选入到临时内存DC中使用BitBlt函数将临时内存DC中的位图拷贝到目标DC上来将位图句柄选出临时内存DC销毁临时的内存DC8获得客户区的大小BOOL WINAPI GetClientRect(HWND hWnd,LPRECT l

4、pRect);第一个参数传入窗口的句柄。第二个参数传入接收返回值Rect的指针。9StretchBlt拉伸函数BOOL WINAPI StretchBlt(HDC hdcDest, /目标DC的句柄int xDest, int yDest, int wDest, int hDest, /目标DC的区域HDC hdcSrc, /源DC的句柄int xSrc, int ySrc, int wSrc, _in int hSrc,/源DC的区域DWORD rop /操作标志,一般为SRCCOPY,意思为拷贝); 10DrawText绘制文字int WINAPI DrawText(HDC hdc,/DC

5、的句柄LPCWSTR lpchText,/要绘制的文本int cchText,/要绘制的文本的长度LPRECT lprc,/绘制的目标区域UINT format/绘制标志, DT_SINGLELINE等);11CreateFontIndirect创建字体HFONT WINAPI CreateFontIndirectA( _in CONST LOGFONTA *lplf);HFONT WINAPI CreateFontIndirectW( _in CONST LOGFONTW *lplf);根据字体结构体创建字体。12CreateFontIndirect创建字体#ifdef UNICODE#de

6、fine CreateFontIndirect CreateFontIndirectW#else#define CreateFontIndirect CreateFontIndirectA#endif / !UNICODE13CreateFontIndirect创建字体#ifdef UNICODEtypedef LOGFONTW LOGFONT;#elsetypedef LOGFONTA LOGFONT;#endif / UNICODEHFONT WINAPI CreateFontIndirect( _in CONST LOGFONT *lplf);14LOGFONTA字体结构体typedef

7、 struct tagLOGFONTA LONG lfHeight; /指定需要的字体的高度 LONG lfWidth;/指定需要的字体的宽度 LONG lfEscapement; /指定需要的字体中,每个字符串的底线相对于水平线的角度 LONG lfOrientation; /指定每个字符的基线相对于页底部的角度 LONG lfWeight; /在01000(如400为正常字体,700为黑体)的范围内,指定字体所需的深浅程度。0为默认值 15LOGFONTA字体结构体 BYTE lfItalic; /如果要求的字体是倾斜的,则此参数为TRUE BYTE lfUnderline; /如果要求的

8、字体要加下划线,则此参数为TRUE BYTE lfStrikeOut;/如果字体要加中划线,则此参数TRUE BYTE lfCharSet;/指定字体所要求的字符集 BYTE lfOutPrecision; /指定所要求的输出精度。输出精度定义了输出字体必须如何紧密匹配所要求的字体的高度、宽度、字符转角、倾斜度和间距 16LOGFONTA字体结构体 BYTE lfClipPrecision; /指定所需要的剪贴精度。剪贴精度定义了如何对落在剪贴区域外部的字符进行剪贴 BYTE lfQuality;/指定字体所要求的输出质量 BYTE lfPitchAndFamily;/指定字体的间距和字体系列

9、 CHAR lfFaceNameLF_FACESIZE; /指向一个NULL为终止符的字符串。该串指定字体的名字 LOGFONTA, *PLOGFONTA;17文字颜色GDI的文字颜色相关的函数有2个:一个是GetTextColor用来获得当前DC的文本颜色;另外一个是SetTextColor用来设置当前DC的文本颜色。COLORREF WINAPI SetTextColor(HDC hdc, COLORREF color);18背景模式通过SetBKMode设置DC的背景模式,相对应的GetBKMode是用来获取背景模式的。int SetBkMode(HDC hdc, int mode);参

10、数mode可以有TRANSPARENT值(透明)与OPAQUE值(不透明,默认值)。返回值是hdc在设置之前的背景模式。19背景模式int GetBkMode(HDC hdc);返回值是hdc目前的背景模式。2021库存字体库存字体,可以通过GetStockObject函数获取。GetStockObject(SYSTEM_FONT)获取默认的系统字体的句柄。在缺省情况下,系统使用该字体绘制菜单,文本。除SYSTEM_FONT外还可以设置如下参数。OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)的字体。ANSI_FIXED_FONT:在Windows中为固定间距(等宽)

11、的系统字体。22库存字体ANSI_VAR_FONT:在Windows中为变间距的系统字体。DEVICE_DEFAULT_FONT:在WindowsNT中为设备相关字体。SYSTEM_FIXED_FONT:固定间距(等宽)的系统字体,该字体仅提供给兼容16位的Windows版本。23TextOut绘制文字TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString)参数hdc就是要绘制文字的DC。参数nXStart就是文字要绘制的起点位置的X坐标。参数nYStart就是文字要绘制的起点位置的Y坐标。参数lpSt

12、ring就是要绘制的文字的字符串指针。参数cbString就是要绘制的文字的字符个数。24DrawText函数与TextOut函数的区别相比两种绘制方式,发现DrawText是采用绘制区域跟绘制格式来控制绘制的位置,而TextOut是直接采用起始位置来控制绘制的位置,所以在自定义位置绘制时TextOut更灵活一些,而以布局式绘制时,DrawText更适合一些。此外DrawText还可以计算所绘制字符串的面积大小,还可以以省略号代替超出区域的文本。25DrawText函数与TextOut函数的区别DrawText(HDC hDC, LPCTSTR lpString, int nCount, LP

13、RECT lpRect, UINT uFormat);lpString:要绘制的字符串。nCount:要绘制的字符个数,-1代表绘制以NULL结尾的字符串。lpRect:要绘制的区域。uFormat:要绘制的格式。可以是下列值的组合。 DT_BOTTOM,文本底对齐。DT_CENTER,文本水平居中显示。26DrawText函数与TextOut函数的区别DT_LEFT,文本左对齐。DT_VEENTER,文本垂直居中显示。DT_RIGHT,文本右对齐。DT_SINGLELINE,只指定单个行。回车和换行,均不打断原有行。DT_TOP,文本顶对齐。DT_WORDBREAK,指定单词间的中断。如果字

14、符串中的一个单词超出lpRect指向的矩形的右边界时,则函数将在单词之间自动切断正文行。27DrawText函数与TextOut函数的区别DT_CALCRECT,确定矩形的宽度和高度,如果有多个正文行,DrawText则将使用由lpRect参数指定的矩形宽度,并且延伸矩形底部,直到能框住正文行的最后一行。如果只有一行正文,DrawText将修正此矩形的右边,以便能框住此行正文的最后一个字符。带入此参数后,DrawText不绘制字符串。DT_END_ELLIPSIS,如果字符串的长度超过矩形的范围,它会被截断并以省略号标识。28SetPixel设置指定点的颜色COLORREF SetPixel(

15、HDC hDC, int X, int Y, COLORREF crColor);参数hDC就是所要绘制的点的DC。参数X就是所要绘制的点的坐标X。参数Y就是所要绘制的点的坐标Y。参数crColor就是所要设置的颜色。返回值就是设置颜色之前,点(X,Y)的颜色。比如设置点(100,200)的颜色为红色,代码如下:SetPixel(hdc, 100, 200, RGB(255,0,0);29GetPixel获取指定点的颜色COLORREF GetPixel(HDC hDC, int X, int Y);参数hDC就是所要获取的点的颜色的DC。参数X就是所要获取的点的坐标X。参数Y就是所要获取的点

16、的坐标Y。返回值就是点(X,Y)的颜色。30MoveToEx设置线的绘制起点MoveToEx(HDC hDC, int X, int Y, LPPOINT lpPoint);参数hDC就是所要设置起点位置的DC。参数X就是所要设置起点位置的X坐标。参数Y就是所要设置起点位置的Y坐标。参数lpPoint就是返回旧的起点坐标,参数为NULL时,表示不返回旧的起点坐标。31LineTo画线LineTo(HDC hDC, int X, int Y);参数hDC就是所要绘制的直线的DC。参数X就是所要绘制的直线的终点坐标X。参数Y就是所要绘制的直线的终点坐标Y。比如要绘制一条从(100,200)到(30

17、0,400)的直线,代码如下:MoveToEx(hdc, 100, 200, NULL);LineTo(hdc, 300, 400);32Rectangle绘制矩形Rectangle(HDC hdc, int left, int top, int right, int bottom);参数hdc为要绘制的矩形的DC。参数left为要绘制的矩形的左边界的位置。参数top为要绘制的矩形的上边界的位置。参数right为要绘制的矩形的右边界的位置。参数bottom为要绘制的矩形的底边界的位置。33Rectangle绘制矩形比如要绘制一个左上角坐标为(100,200),宽度高度分别为300,400的矩形

18、边框,代码如下:SelectObject(hdc, GetStockObject(NULL_BRUSH);Rectangle(hdc, 100, 200, 100+300, 200+400);34Ellipse绘制圆Ellipse(HDC hdc, int left,int top, int right, int bottom); 参数hdc为要绘制的圆的DC。参数left为圆的外切矩形的左边界的位置。参数top为圆的外切矩形的顶边界的位置。参数right为圆的外切矩形的右边界的位置。参数bottom为圆的外切矩形的底边界的位置。35Ellipse绘制圆比如要绘制一个外切矩形为RECT(100

19、,100,300,300)的圆的边框,代码如下:SelectObject(hdc, GetStockObject(NULL_BRUSH);Ellipse(hdc, 100, 100, 300, 300);36Pie绘制饼Pie(HDC hdc, int left, int top,int right, int bottom, int xr1, int yr1, int xr2,int yr2);参数hdc为要绘制的饼的DC。参数left为指定限定矩形左上角的X坐标。参数top为指定限定矩形左上角的Y坐标。参数right为指定限定矩形右下角的X坐标。参数bottom为指定限定矩形右下角的Y坐标。

20、37Pie绘制饼参数xr1为饼图起点的径线端点的X坐标。 参数yr1为饼图起点的径线端点的Y坐标。参数xr2为饼图终点的径线端点的X坐标。参数yr2为饼图终点的径线端点的Y坐标。38Pie绘制饼比如要绘制一个限定矩形为RECT(470,440,690,690),起点的径线端点为(692,550),终点的径线端点为(582,441)的饼的边框,代码如下:SelectObject(hdc, GetStockObject(NULL_BRUSH);Pie(hdc, 470, 440, 690, 690, 692, 550, 582, 441);39库存画笔的选用SelectObject(hdc, Ge

21、tStockObject(WHITE_PEN);获取并选进宽度为1,颜色为白色,样式为实线的画笔。SelectObject(hdc, GetStockObject(BLACK_PEN);获取并选进宽度为1,颜色为黑色,样式为实线的画笔。SelectObject(hdc, GetStockObject(NULL_PEN);获取并选进空的画笔。40CreatePen创建画笔HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);参数fnPenStyle为画笔的样式,它可以是下列任何值之一:PS_SOLID,实心笔。PS_DASH,短

22、线式笔,要求笔=1。PS_DOT,点式笔,要求笔=1。PS_DASHDOT,虚线笔,要求笔=1。PS_DASHDOTDOT,双虚线笔,要求笔=1。41CreatePen创建画笔PS_NULL,笔不可见。PS_INSIDEFRAME,实心笔,但笔宽是向里扩展。参数nWidth为画笔的宽度。参数crColor为画笔的颜色。42各种样式的画笔的绘画效果43各种样式的画笔的绘画效果44各种样式的画笔的绘画效果45各种样式的画笔的绘画效果46各种样式的画笔的绘画效果47各种样式的画笔的绘画效果48各种样式的画笔的绘画效果49PS_SOLID与PS_INSIDEFRAME的区别当宽度一样时,两者没有区别。

23、如下图三。PS_SOLID的宽度大于1时,就往线的两边扩张。如图一。PS_INSIDEFRAME的宽度大于1时,就往线的里边扩张,如图二。50创建、使用跟销毁自定义画笔/创建自定义画笔HPEN hPen = CreatePen(PS_SOLID, 1, RGB(42,187,203);/使用自定义画笔HPEN hPenOld = (HPEN)SelectObject(hdc, hPen);MoveToEx(hdc, 78, 315, NULL);LineTo(hdc, 150, 170);/销毁自定义画笔SelectObject(hdc, hPenOld);DeleteObject(hPen)

24、;51库存画刷SelectObject(hdc, GetStockObject(WHITE_BRUSH);获取并选进白色画刷SelectObject(hdc, GetStockObject(LTGRAY_BRUSH);获取并选进亮灰色画刷SelectObject(hdc, GetStockObject(GRAY_BRUSH);获取并选进灰色画刷SelectObject(hdc, GetStockObject(DKGRAY_BRUSH);获取并选进暗灰色画刷SelectObject(hdc, GetStockObject(BLACK_BRUSH);获取并选进黑色画刷SelectObject(hdc, GetStockObject(NULL_BRUSH);获取并选进空画刷52填充图形Rectangle函数用DC所选进的画刷来填充矩形的内部。Ellipse函数用DC所选进的画刷来填充圆的内部。Pie函数用DC所选进的画刷来填充饼的内部。53CreateSolidBrush创建画刷创建单色画刷HBRUSH C

温馨提示

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

评论

0/150

提交评论