硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2717|回复: 4
收起左侧

[emWin教程入门篇] 【emWin实战教程V2.0】第11章  2D图形库之基本绘图

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2017-1-4 16:38:50 | 显示全部楼层 |阅读模式
完整65章+12章附件教程下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834


第11章      2D图形库之基本绘图



    本章节为大家讲解2D图形库的基本绘图方法,2D图形库主要包括画点,画线,绘制位图,绘制矩形,圆形,扇形,多边形等平面效果的图形。
    学习本章节,务必保证已经学习了第6章和第8章。本章节提供的模拟器演示代码都是可以在模拟器上面运行的,使用方法是将GUIDEMO_Start.c文件里面的所有内容删掉并将本章节提供的代码复制到GUIDEMO_Start.c文件即可运行。
11.1  初学者重要提示
11.2  基本的画点画线函数及其画笔大小设置
11.3 基本2D绘图
11.4 Alpha混合
11.5       总结




11.1  初学者重要提示

1、2D绘图的所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数的位置

11.1.png


    下图是是英文版手册里面API函数的位置:
11.2.png

2、2D绘图涉及到的函数较多,初学者不需要将这些函数都掌握,会使用几个常用的函数即可。以后项目中需要用到其它函数功能了,再查阅emWin手册并了解其用法后实际测试即可
3、2D绘图涉及到一些算法的实现,比如直线绘制,需要用到插补算法。由于emWin只有库,底层源码是无法看到的,所以用户使用的时候还是调用下API函数即可,调用API函数没什么技术含量,多试试就会用了,对于这一点,初学者要明白。
4、如果时间充裕,可以自行在模拟器上面测试几个教程中没有用到的函数练练手。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-1-4 16:41:07 | 显示全部楼层
11.2  基本的画点画线函数及其画笔大小设置

        emWin带的2D函数功能还是比较全面的,这里我们先讲解最基本的画点画线函数及其画笔大小的设置。
画笔大小就是线的粗细,通过下面这两个函数实现设置和获取:
1、 U8 GUI_GetPenSize(void)   返回当前的画笔大小(像素)。
2、 U8 GUI_SetPenSize(U8 PenSize)    设置画笔大小(像素)。
设置画笔大小仅对以下几个2D函数有效,其余函数是无效的,这点要注意。
(1)GUI_DrawPoint()
(2)GUI_DrawLine()
(3)GUI_DrawLineRel()
(4)GUI_DrawLineTo()
(5)GUI_DrawPolyLine()
(6)GUI_DrawPolygon()
(7)GUI_DrawEllipse()
(8)GUI_DrawArc()
下面我们通过画点函数GUI_DrawLine()和画线函数GUI_DrawLine来演示实际效果,将如下代码直接复制到emWin模拟器下面就可以运行的,主要是绘制三条不同粗细的直线。
  1. #include "GUI.h"
  2. void MainTask(void) {
  3.      /* 初始化emWin */
  4.     GUI_Init();
  5.    
  6.     GUI_SetBkColor(GUI_BLACK);  /* 设置背景颜色 */
  7.     GUI_Clear();                /* 只有清屏了,上面设置背景颜色才能起到作用 */
  8.    
  9.     GUI_SetColor(GUI_RED);      /* 设置画笔颜色   */   
  10.      /* 设置画笔大小为4,绘制点和直线 */
  11.     GUI_SetPenSize(4);
  12. GUI_DrawPoint(250, 10);
  13.     GUI_DrawLine(0,             /* X起始位置      */                        
  14.                  10,            /* Y起始位置      */
  15.                  200,           /* X结束位置      */                 
  16.                  10);           /* Y结束位置      */
  17.      /* 设置画笔大小为8,绘制点和直线 */
  18.     GUI_SetPenSize(8);
  19. GUI_DrawPoint(250, 100);
  20.     GUI_DrawLine(0, 100, 200, 100);
  21.      /* 设置画笔大小为12,绘制点和直线 */
  22.     GUI_SetPenSize(12);  
  23. GUI_DrawPoint(250, 200);
  24.     GUI_DrawLine(0, 200, 200, 200);
  25.     while(1)   
  26.     {
  27.         GUI_Delay(10);   
  28.     }
  29. }
复制代码


实际显示效果如下:
11.3.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-1-4 16:42:27 | 显示全部楼层
11.3   基本2D绘图


    emWin支持的2D基本绘图函数很多,我们用以下四个2D函数为例,在模拟器上进行测试:
GUI_DrawGradientRoundedH()     绘制用水平梯度色填充的圆角矩形。
GUI_DrawRectEx()                          在当前窗口中的指定位置绘制矩形。
GUI_DrawRoundedFrame()            在当前窗口中的指定位置绘制指定宽度的圆角框。
GUI_FillRoundedRect()                   在当前窗口中的指定位置绘制填充的圆角矩形。
在模拟器上运行的代码如下:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.     GUI_RECT Rect = { 120,  /* 矩形区左上角X坐标位置 */
  5.                       0,    /* 矩形区左上角Y坐标位置 */
  6.                       219,  /* 矩形区右下角X坐标位置 */
  7.                       99};  /* 矩形区右下角Y坐标位置 */
  8.      /* 初始化emWin */
  9.     GUI_Init();
  10.    
  11.     GUI_SetBkColor(GUI_BLACK);  /* 设置背景颜色 */
  12.     GUI_Clear();                /* 只有清屏了,上面设置背景颜色才能起到作用 */
  13.      GUI_SetColor(GUI_RED);      /* 设置前景色,即设置下面2D图形的颜色 */
  14.      /* 绘制梯度色效果的圆角矩形 */
  15.     GUI_DrawGradientRoundedH(0, 0, 99, 99, 25, 0x0000FF, 0x00FFFF);
  16.      /* 绘制矩形边框 */
  17.     GUI_DrawRectEx(&Rect);
  18.      /* 绘制圆角矩形框 */
  19.     GUI_DrawRoundedFrame(0, 110, 99, 210, 20, 10);
  20.      /* 绘制填充的圆角矩形 */
  21.     GUI_FillRoundedRect( 120, 110, 219, 210, 20);
  22.     while(1)
  23.     {
  24.         GUI_Delay(100);
  25.     }
  26. }
复制代码
实际显示效果如下:
11.4.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-1-4 16:45:01 | 显示全部楼层


11.4 Alpha混合

    Alpha混合比较有用,Alpha混合是一种合并前景图像与背景图像来创建半透明效果的方法。
颜色信息
STemWin的32位颜色信息:
0-7位:红色
8-15位:绿色
16-23位:蓝色
24-31位:Alpha信息
Alpha值为0表示不透明,值为255表示完全透明。
工作原理
    Alpha混合完全自动执行。用户唯一需要做的就是使用函数GUI_EnableAlpha()启用Alpha混合。其中,32位颜色值的最高8位用作Alpha值设置。下面举一个例子:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.     GUI_Init();                   /* 初始化emWin */
  5.      GUI_EnableAlpha(1);          /* 使能Alpha混合 */
  6.     GUI_SetBkColor(GUI_WHITE);   /* 设置背景颜色 */  
  7.     GUI_Clear();                 /* 只有清屏了,上面设置背景颜色才能起到作用 */
  8.     GUI_SetColor(GUI_BLACK);     /* 设置前景色,即设置文本的显示颜色 */   
  9.     GUI_DispStringHCenterAt("Alphablending", 45, 41);
  10.      /* 显示带alpha效果的填充矩形 */
  11.     GUI_SetColor((0x40uL << 24) | GUI_RED);   
  12.     GUI_FillRect(0, 0, 49, 49);
  13.     GUI_SetColor((0x80uL << 24) | GUI_GREEN);
  14.     GUI_FillRect(20, 20, 69, 69);   
  15.     GUI_SetColor((0xC0uL << 24) | GUI_BLUE);   
  16.     GUI_FillRect(40, 40, 89, 89);
  17.     while(1)   
  18.     {
  19.         GUI_Delay(10);  
  20.     }
  21. }
复制代码
实际显示效果如下:
11.5.png


11.4.1  函数GUI_SetAlpha()实现Alpha值设置

    函数unsigned GUI_SetAlpha(U8 Value)也可以实现Alpha值的设置,将参数Value设置为0表示不透明(禁用Alpha混合),设置为255表示完全透明(不可见)。另外,软件方式实现的Alpha混合会增加CPU负荷,所以建议在绘制操作完成后,将Alpha值设回默认值。下面针对这个函数举一个例子(这里只是部分代码,可以在模拟器上面运行的完整例子是:V6-508_2D图形库之基本绘图(模拟器),在教程配套的例子中有)。
  1. GUI_CONST_STORAGE GUI_BITMAP bmarmfly = {
  2.   198, // xSize
  3.   80,  // ySize
  4.   792, // BytesPerLine
  5.   32,  // BitsPerPixel
  6.   (unsigned char *)_acarmfly,  // Pointer to picture data
  7.   NULL,  // Pointer to palette
  8.   GUI_DRAW_BMP8888
  9. };
  10. void MainTask(void)
  11. {
  12.      int i;
  13.    
  14.      /* 初始化emWin */
  15.      GUI_Init();
  16.      /* 绘制蓝色填充的圆圈 */
  17.      GUI_SetColor(GUI_BLUE);
  18.      GUI_FillCircle(100, 50, 49);
  19.      /* 绘制渐变的透明效果 */
  20.      GUI_SetColor(GUI_YELLOW);
  21.    
  22.      for (i = 0; i < 100; i++)
  23.      {
  24.          U8 Alpha;
  25.          Alpha = (i * 255 / 100);
  26.           /* 设置透明度 */
  27.          GUI_SetAlpha(Alpha);
  28.          /* 画水平的直线 */
  29.          GUI_DrawHLine(i, 100 - i, 100 + i);
  30.      }
  31.     /* 绘制透明效果的位图,透明度设置为128 */
  32.      GUI_SetAlpha(0x80);
  33.      /* 画位图 */
  34.      GUI_DrawBitmap(&bmarmfly, 30, 30);
  35.      /* 设置要显示文本的颜色,字体和显示模式 */
  36.      GUI_SetColor(GUI_MAGENTA);
  37.      GUI_SetFont(&GUI_Font24B_ASCII);
  38.      GUI_SetTextMode(GUI_TM_TRANS);
  39.      GUI_DispStringHCenterAt("Alphablending", 100, 3);
  40.    
  41.      /* 设置回默认的不透明状态 */
  42.      GUI_SetAlpha(0);
  43.    
  44.      while(1)
  45.      {
  46.          GUI_Delay(100);
  47.      }
  48. }
复制代码
实际显示效果如下:
11.6.png


11.4.2  函数GUI_SetUserAlpha()实现Alpha值设置

    如下两个Alpha值设置函数是配套使用的:
(1)GUI_SetUserAlpha()            设置Alpha值。
(2)GUI_RestoreUserAlpha()    恢复用户Alpha混合之前的状态。
仅看函数说明不容易看懂,下面也举一个例子:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {      
  4.     GUI_ALPHA_STATE AlphaState;
  5.      /* 初始化emWin */
  6.     GUI_Init();
  7.    
  8.      /* 使能alpha混合 */
  9.     GUI_EnableAlpha(1);
  10.    
  11.     GUI_SetBkColor(GUI_WHITE);  /* 设置背景颜色 */
  12.     GUI_Clear();                /* 只有清屏了,上面设置背景颜色才能起到作用 */
  13.      /* 设置前景色,即文本的颜色是黑色 */
  14.     GUI_SetColor(GUI_BLACK);   
  15.     GUI_DispStringHCenterAt("Alphablending", 45, 41);
  16.    
  17.      /* 设置alpha值 */
  18.     GUI_SetUserAlpha(&AlphaState, 0xC0);
  19.    
  20.      /* 绘制三个矩形框 */
  21.     GUI_SetColor(GUI_RED);   
  22.     GUI_FillRect(0, 0, 49, 49);  
  23.     GUI_SetColor(GUI_GREEN);   
  24.     GUI_FillRect(20, 20, 69, 69);   
  25.     GUI_SetColor(GUI_BLUE);  
  26.     GUI_FillRect(40, 40, 89, 89);
  27.    
  28.      /* 恢复之前的alpha值 */
  29.     GUI_RestoreUserAlpha(&AlphaState);   
  30.    
  31.     while(1)   
  32.     {      
  33.         GUI_Delay(10);   
  34.     }
  35. }
复制代码
实际显示效果如下:
11.7.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-1-4 16:46:16 | 显示全部楼层
11.5 总结


    关于2D图形库的基本绘图功能就为大家讲解这么多,要熟练的运用这些函数就得多做练习和测试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 16:15 , Processed in 0.268318 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表