硬汉嵌入式论坛

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

[emWin教程入门篇] 【STemWin教程】第8章  2-D图形库之基本绘图

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-10 15:00:49 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第8章      2-D图形库之基本绘图

    本期主要讲解2-D图形库的基本绘图方法。这些图形库是基于快速高效的算法。当前,只有GUI_DrawArc()函数需要浮点计算,这些函数用PC端的emWin模拟器练习就行,不需要在开发板上面做,太麻烦。
    基本绘制例程可以在显示器中的任意位置绘制单个点、水平线和垂直线以及图形。所有可用的绘制模式均能使用。由于大多数应用程序会频繁调用这些例程,因此对它们的速度尽可能进行了优化。例如,水平线和垂直线函数不需要使用单点例程。
    8. 1  画笔大小
    8. 2  基本绘制
    8. 3  Alpha混合
    8. 5  实验总结

8.1  画笔大小
    GUI_GetPenSize()  返回当前的画笔大小 (像素)。
    GUI_SetPenSize()    设置画笔大小 (像素)。
    画笔大小决定以下矢量绘制操作的厚度:
l  GUI_DrawPoint()
l  GUI_DrawLine()
l  GUI_DrawLineRel()
l  GUI_DrawLineTo()
l  GUI_DrawPolyLine()
l  GUI_DrawPolygon()
l  GUI_DrawEllipse()
l  GUI_DrawArc()
    这里要切记画笔大小只支持上面的几个2D绘图函数,有些是不支持的,下面以GUI_DrawLine()举一个例子,这个例子直接复制到STemWin模拟器下面就可以跑的,主要是画三条不同粗细的直线。
  1. #include "GUI.h"
  2. void MainTask(void) {
  3.     GUI_Init();   
  4.     GUI_SetBkColor(GUI_BLACK);  /* 设置背景颜色 */
  5.     GUI_Clear();                /* 这里只要清屏了,上面设置背景颜色才能起到作用 */   
  6.     GUI_CURSOR_Show();          /* 显示游标       */
  7.     GUI_SetColor(GUI_RED);      /* 设置画笔颜色   */   
  8.     GUI_SetPenSize(1);          /* 设置画笔大小   */
  9.     GUI_DrawLine(0,             /* X起始位置      */                        
  10.                  10,            /* Y起始位置      */
  11.                  200,           /* X结束位置      */               
  12.                  10);           /* Y结束位置      */
  13.     GUI_SetPenSize(4);   
  14.     GUI_DrawLine(0, 100, 200, 100);
  15.     GUI_SetPenSize(8);   
  16.     GUI_DrawLine(0, 200, 200, 200);
  17.     while(1)   
  18.     {
  19.         GUI_Delay(100);   
  20.     }
  21. }
复制代码
实际显示效果如下:
8.1.png


8.2  基本绘制
    STemWin支持的2D基本绘图函数有如下的几个,我这里就不跟大家一一举例了,举几个典型的函数用法:
    8.2.png

    下面这个例程主要用到以下几个函数
GUI_DrawGradientRoundedH()      绘制用水平颜色梯度填充的圆角矩形。
GUI_DrawRectEx()                          在当前窗口中的指定位置绘制矩形。
GUI_DrawRoundedFrame()            在当前窗口中的指定位置绘制指定宽度的圆角框。
GUI_FillRoundedRect()                   在当前窗口中的指定位置绘制填充的圆角矩形。
在模拟器上演示例子如下:
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.     GUI_RECT Rect = { 120, /* Upper left X-position. */
  5.                       0,   /* Upper left Y-position. */
  6.                       219, /* Lower right X-position. */
  7.                       99}; /* Lower right Y-position. */
  8.     GUI_Init();
  9.     GUI_SetBkColor(GUI_BLACK);  /* 设置背景颜色 */
  10.     GUI_Clear();                /* 这里只要清屏了,上面设置背景颜色才能起到作用 */
  11.     GUI_CURSOR_Show();          /* 显示游标 */
  12.     GUI_SetColor(GUI_RED);
  13.     GUI_DrawGradientRoundedH(0, 0, 99, 99, 25, 0x0000FF, 0x00FFFF);
  14.     GUI_DrawRectEx(&Rect);
  15.     GUI_DrawRoundedFrame(0, 110, 99, 210, 20, 10);
  16.     GUI_FillRoundedRect( 120, 110, 219, 210, 20);
  17.     while(1)
  18.     {
  19.         GUI_Delay(100);
  20.     }
  21. }
复制代码
实际显示效果如下:
8.3.png


8.3  Alpha混合
    Alpha混合是个非常好的功能,有了这个绘制出来的界面才能更加的华丽,下面详细的介绍一下。Alpha混合是一种合并前景图像与背景来创建半透明效果的方法。Alpha值决定可见的像素数以及背景透露的像素数。
颜色信息
    STemWin内部适用于32位的颜色信息:
  l  0-7位:红色
  l  8-15位:绿色
  l  16-23位:蓝色
  l  24-31位:Alpha信息
    Alpha值为0表示不透明,值为255表示完全透明。
工作原理
    Alpha混合完全自动执行。唯一需要做的就是使用GUI_EnableAlpha()启用Alpha混合。在此,8位以上的颜色信息将作为Alpha值管理。下面举一个例子
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.     GUI_Init();   
  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(100);  
  20.      }
  21. }
复制代码
    实际显示效果如下:
8.4.png

    说一下这个函数GUI_SetAlpha(),这个函数基本处于弃用的状态,主要以上面说的那个函数为主。该函数设置用于所有后续绘制操作的Alpha值。参数Alpha值为0表示不透明(禁用Alpha混合),值为255表示完全透明 (不可见)。请注意,软件Alpha混合会增加CPU负荷。此外,强烈建议在绘制操作完成后,将Alpha值设回默认值。下面针对这个函数举一个例子。
  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.      GUI_Init();
  15. //   GUI_EnableAlpha(1);         /* 启用或禁用自动Alpha混合 */
  16.      /* 绘制蓝色填充的圆圈 */
  17.      GUI_SetColor(GUI_BLUE);
  18.      GUI_FillCircle(100, 50, 49);
  19.      GUI_SetColor(GUI_YELLOW);
  20.      for (i = 0; i < 100; i++)
  21.      {
  22.          U8 Alpha;
  23.          Alpha = (i * 255 / 100);
  24.          GUI_SetAlpha(Alpha);
  25.          GUI_DrawHLine(i, 100 - i, 100 + i);
  26.      }
  27.      GUI_SetAlpha(0x80);
  28.      GUI_DrawBitmap(&bmarmfly, 30, 30);
  29.      GUI_SetColor(GUI_MAGENTA);
  30.      GUI_SetFont(&GUI_Font24B_ASCII);
  31.      GUI_SetTextMode(GUI_TM_TRANS);
  32.      GUI_DispStringHCenterAt("Alphablending", 100, 3);
  33.      GUI_SetAlpha(0); /* Set back to default (opaque) */
  34.    
  35.      while(1)
  36.      {
  37.          GUI_Delay(100);
  38.      }
  39. }
复制代码
    实际显示效果如下:
8.5.png


    有这个例子涉及到大量的图片数据,完整的运行例子在本期教程配套的里面有。
    关于alpha函数还有如下两个函数
GUI_SetUserAlpha()            设置其他值以用于计算要使用的实际Alpha值。
GUI_RestoreUserAlpha()    恢复用户Alpha混合之前的状态。保存在所指向的结构中。
    看函数说明不好看懂,下面也举一个例子
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {      
  4.     GUI_ALPHA_STATE AlphaState;
  5.     GUI_Init();   
  6.     GUI_EnableAlpha(1);   
  7.     GUI_SetBkColor(GUI_WHITE);   
  8.     GUI_Clear();  
  9.     GUI_SetColor(GUI_BLACK);   
  10.     GUI_DispStringHCenterAt("Alphablending", 45, 41);   
  11.     GUI_SetUserAlpha(&AlphaState, 0xC0);  
  12.     GUI_SetColor(GUI_RED);   
  13.     GUI_FillRect(0, 0, 49, 49);  
  14.     GUI_SetColor(GUI_GREEN);   
  15.     GUI_FillRect(20, 20, 69, 69);   
  16.     GUI_SetColor(GUI_BLUE);  
  17.     GUI_FillRect(40, 40, 89, 89);   
  18.     GUI_RestoreUserAlpha(&AlphaState);      
  19.     while(1)   
  20.     {      
  21.         GUI_Delay(100);   
  22.     }
  23. }
复制代码
实际显示效果如下:
8.6.png
8.4  总结
    这些基本的2-D绘图函数很重要,特别是Alpha函数,绚丽的界面设计就靠这些函数了。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

0

主题

19

回帖

0

积分

新手上路

积分
0
QQ
发表于 2016-10-15 16:28:54 | 显示全部楼层
[s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]  [s:152]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 09:53 , Processed in 0.543876 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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