请问有没有谁填充过矩形区域(圆角)的LCD屏?

2020-01-03 19:08发布

我现在使用的是320*240(横屏),方形的按键有点难看,于是就想到用圆角的按键,带圆角的框是画出来了,但按下的时候,不知道如何填充带圆角的矩形区域。有过这样应用的朋友说说思路咯。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
worksnfkpynn99
1楼-- · 2020-01-05 09:24
  1. /***********************************************************************************************************************
  2. *        函数名: LCD_DrawCircleRectangle
  3. *        参  数: x0      :X坐标
  4. *                y0      :Y坐标
  5. *                Length  :长度
  6. *                wide    :方向(Horizontal,Vertical)
  7. *               r       :圆角半径
  8. *        返  回: 无
  9. *        功  能: 在LCD上画圆角矩形
  10. *************************************************************************************************************************/
  11. void LCD_DrawCircleRectangle(unsigned short x0,unsigned char y0,unsigned short Length,unsigned char wide,unsigned char r)
  12. {
  13.     int a,b;
  14.     int di;
  15.     unsigned char QUA_Second_y0,QUA_Third_y0;
  16.     unsigned short QUA_Third_x0,QUA_Four_x0;
  17.    
  18.     x0 = x0+r;
  19.     y0 = y0+r;
  20.     Length = Length-2*r;
  21.     wide = wide-2*r;
  22.     a=0;
  23.     b=r;
  24.     di=3-2*r;
  25.     while(a<=b)
  26.     {
  27.         //第一象限
  28.         LCD_DrawPoint(x0-a,y0-b);             //2
  29.         LCD_DrawPoint(x0-b,y0-a);             //3
  30.         
  31.         //第二象限        
  32.         QUA_Second_y0 = y0+wide;
  33.         LCD_DrawPoint(x0-a,QUA_Second_y0+b);             //1
  34.         LCD_DrawPoint(x0-b,QUA_Second_y0+a);             //7
  35.         
  36.         //第三象限        
  37.         QUA_Third_y0 = y0+wide;
  38.         QUA_Third_x0 = x0+Length;
  39.         LCD_DrawPoint(QUA_Third_x0+a,QUA_Third_y0+b);             //6
  40.         LCD_DrawPoint(QUA_Third_x0+b,QUA_Third_y0+a);             //4
  41.         
  42.         //第四象限
  43.         QUA_Four_x0 = x0+Length;
  44.         LCD_DrawPoint(QUA_Four_x0+a,y0-b);             //5        
  45.         LCD_DrawPoint(QUA_Four_x0+b,y0-a);             //0
  46.         
  47.         a++;
  48.         if(di<0) di +=4*a+6;
  49.         else
  50.         {
  51.             di+=10+4*(a-b);
  52.             b--;
  53.         }
  54.         //LCD_DrawPoint(x0+a,y0+b);
  55.     }
  56.     LCD_DrawLine(x0-r,y0,wide,Vertical);//(6,10,77,Vertical);
  57.     LCD_DrawLine(x0+r+Length,y0,wide,Vertical);//(192,10,77,Vertical);
  58.     LCD_DrawLine(x0,y0-r,Length,Horizontal);//(6,10,186,Horizontal);
  59.     LCD_DrawLine(x0,y0+wide+r,Length,Horizontal);//(6,87,186,Horizontal);
  60.    
  61. }

  62. /***********************************************************************************************************************
  63. *        函数名: LCD_FillCircle
  64. *        参  数: x0      :X坐标
  65. *                y0      :Y坐标
  66. *                Length  :长度
  67. *                wide    :方向(Horizontal,Vertical)
  68. *               r       :圆角半径
  69. *               color   :填充 {MOD}
  70. *        返  回: 无
  71. *        功  能: 用指定 {MOD}填充圆角矩形区域
  72. *************************************************************************************************************************/
  73. void LCD_FillCircle(unsigned short x0,unsigned char y0,unsigned short Length,unsigned char wide,unsigned char r,unsigned short color)
  74. {
  75.     int a,b;
  76.     int di;
  77.     unsigned char QUA_Second_y0,QUA_Third_y0;
  78.     unsigned short QUA_Third_x0,QUA_Four_x0;
  79.    
  80.     x0 = x0+r;
  81.     y0 = y0+r;
  82.     Length = Length-2*r;
  83.     wide = wide-2*r;
  84.     a=0;
  85.     b=r;
  86.     di=3-2*r;
  87.     FontSet(3,color,1);
  88.     while(a<=b)
  89.     {
  90.         //第一象限
  91.         LCD_DrawPoint(x0-a,y0-b);             //2
  92.         LCD_DrawPoint(x0-b,y0-a);             //3
  93.         
  94.         //第二象限        
  95.         QUA_Second_y0 = y0+wide;
  96.         LCD_DrawPoint(x0-a,QUA_Second_y0+b);             //1
  97.         LCD_DrawPoint(x0-b,QUA_Second_y0+a);             //7
  98.         
  99.         //第三象限        
  100.         QUA_Third_y0 = y0+wide;
  101.         QUA_Third_x0 = x0+Length;
  102.         LCD_DrawPoint(QUA_Third_x0+a,QUA_Third_y0+b);             //6
  103.         LCD_DrawPoint(QUA_Third_x0+b,QUA_Third_y0+a);             //4
  104.         
  105.         //第四象限
  106.         QUA_Four_x0 = x0+Length;
  107.         LCD_DrawPoint(QUA_Four_x0+a,y0-b);             //5        
  108.         LCD_DrawPoint(QUA_Four_x0+b,y0-a);             //0
  109.         
  110.         LCD_DrawLine(x0-a,y0-b,(QUA_Four_x0+a)-(x0-a),Horizontal);
  111.         LCD_DrawLine(x0-b,y0-a,(QUA_Four_x0+b)-(x0-b),Horizontal);
  112.         
  113.         LCD_DrawLine(x0-a,QUA_Second_y0+b,(QUA_Third_x0+a)-(x0-a),Horizontal);
  114.         LCD_DrawLine(x0-b,QUA_Second_y0+a,(QUA_Four_x0+b)-(x0-b),Horizontal);

  115.         a++;
  116.         if(di<0) di +=4*a+6;
  117.         else
  118.         {
  119.             di+=10+4*(a-b);
  120.             b--;
  121.         }
  122.     }
  123.     LCD_DrawLine(x0-r,y0,wide,Vertical);//(6,10,77,Vertical);
  124.     LCD_DrawLine(x0+r+Length,y0,wide,Vertical);//(192,10,77,Vertical);
  125.     LCD_DrawLine(x0,y0-r,Length,Horizontal);//(6,10,186,Horizontal);
  126.     LCD_DrawLine(x0,y0+wide+r,Length,Horizontal);//(6,87,186,Horizontal);
  127.    
  128.     LCD_Fill(x0-r+1,y0,Length+2*r-1,wide,color);
  129. }
复制代码
worksnfkpynn99
2楼-- · 2020-01-05 11:48
worksnfkpynn99 发表于 2012-7-17 09:32

11.jpg (32.4 KB, 下载次数: 0)

下载附件

2012-7-17 09:32 上传



我使用的是320*240(横屏)
1、把圆分四个象限分别画1/4的圆再用直接连接(成圆角框)
2、(第四象限减第一象限)得到填充直线的长度
3、(第三象限减第二象限)得到填充直线的长度
4、再把中间的区域用矩形填充
这样就得到一个完整的圆角填充区域。
worksnfkpynn99
3楼-- · 2020-01-05 17:27
worksnfkpynn99 发表于 2012-7-17 09:37

22.jpg (94.21 KB, 下载次数: 0)

下载附件

2012-7-17 09:43 上传

freshen
4楼-- · 2020-01-05 22:11
 精彩回答 2  元偷偷看……
chenqinyao
5楼-- · 2020-01-06 04:01
不错,正需要,参考中,谢谢
advarx21ic
6楼-- · 2020-01-06 06:58
不错,谢谢,学习了

一周热门 更多>