📄 gui_basic.lst
字号:
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 5
{ int32 dx; // 直线x轴差值变量
int32 dy; // 直线y轴差值变量
int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
int32 dx_x2; // dx*2值变量,用于加快运算速度
int32 dy_x2; // dy*2值变量,用于加快运算速度
int32 di; // 决策变量
int32 wx, wy; // 线宽变量
int32 draw_a, draw_b;
/* 参数过滤 */
if(with==0) return;
if(with>50) with = 50;
dx = x1-x0; // 求取两点之间的差值
dy = y1-y0;
wx = with/2;
wy = with-wx-1;
/* 判断增长方向,或是否为水平线、垂直线、点 */
if(dx>0) // 判断x轴方向
{ dx_sym = 1; // dx>0,设置dx_sym=1
}
else
{ if(dx<0)
{ dx_sym = -1; // dx<0,设置dx_sym=-1
}
else
{ /* dx==0,画垂直线,或一点 */
wx = x0-wx;
if(wx<0) wx = 0;
wy = x0+wy;
while(1)
{ x0 = wx;
GUI_RLine(x0, y0, y1, color);
if(wx>=wy) break;
wx++;
}
return;
}
}
if(dy>0) // 判断y轴方向
{ dy_sym = 1; // dy>0,设置dy_sym=1
}
else
{ if(dy<0)
{ dy_sym = -1; // dy<0,设置dy_sym=-1
}
else
{ /* dy==0,画水平线,或一点 */
wx = y0-wx;
if(wx<0) wx = 0;
wy = y0+wy;
while(1)
{ y0 = wx;
GUI_HLine(x0, y0, x1, color);
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 6
if(wx>=wy) break;
wx++;
}
return;
}
}
/* 将dx、dy取绝对值 */
dx = dx_sym * dx;
dy = dy_sym * dy;
/* 计算2倍的dx及dy值 */
dx_x2 = dx*2;
dy_x2 = dy*2;
/* 使用Bresenham法进行画直线 */
if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
{ di = dy_x2 - dx;
while(x0!=x1)
{ /* x轴向增长,则宽度在y方向,即画垂直线 */
draw_a = y0-wx;
if(draw_a<0) draw_a = 0;
draw_b = y0+wy;
GUI_RLine(x0, draw_a, draw_b, color);
x0 += dx_sym;
if(di<0)
{ di += dy_x2; // 计算出下一步的决策值
}
else
{ di += dy_x2 - dx_x2;
y0 += dy_sym;
}
}
draw_a = y0-wx;
if(draw_a<0) draw_a = 0;
draw_b = y0+wy;
GUI_RLine(x0, draw_a, draw_b, color);
}
else // 对于dx<dy,则使用y轴为基准
{ di = dx_x2 - dy;
while(y0!=y1)
{ /* y轴向增长,则宽度在x方向,即画水平线 */
draw_a = x0-wx;
if(draw_a<0) draw_a = 0;
draw_b = x0+wy;
GUI_HLine(draw_a, y0, draw_b, color);
y0 += dy_sym;
if(di<0)
{ di += dx_x2;
}
else
{ di += dx_x2 - dy_x2;
x0 += dx_sym;
}
}
draw_a = x0-wx;
if(draw_a<0) draw_a = 0;
draw_b = x0+wy;
GUI_HLine(draw_a, y0, draw_b, color);
}
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 7
}
#endif
368
369
370
371 #if GUI_CircleX_EN==1
372 /****************************************************************************
373 * 名称:GUI_Circle()
374 * 功能:指定圆心位置及半径,画圆。
375 * 入口参数: x0 圆心的x坐标值
376 * y0 圆心的y坐标值
377 * r 圆的半径
378 * color 显示颜色
379 * 出口参数:无
380 * 说明:操作失败原因是指定地址超出有效范围。
381 ****************************************************************************/
382 void GUI_Circle(uint32 x0, uint32 y0, uint32 r, TCOLOR color)
383 { int32 draw_x0, draw_y0; // 刽图点坐标变量
384 1 int32 draw_x1, draw_y1;
385 1 int32 draw_x2, draw_y2;
386 1 int32 draw_x3, draw_y3;
387 1 int32 draw_x4, draw_y4;
388 1 int32 draw_x5, draw_y5;
389 1 int32 draw_x6, draw_y6;
390 1 int32 draw_x7, draw_y7;
391 1 int32 xx, yy; // 画圆控制变量
392 1
393 1 int32 di; // 决策变量
394 1
395 1 /* 参数过滤 */
396 1 if(0==r) return;
397 1
398 1 /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
399 1 draw_x0 = draw_x1 = x0;
400 1 draw_y0 = draw_y1 = y0 + r;
401 1 if(draw_y0<GUI_LCM_YMAX) GUI_Point(draw_x0, draw_y0, color); // 90度
402 1
403 1 draw_x2 = draw_x3 = x0;
404 1 draw_y2 = draw_y3 = y0 - r;
405 1 if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color); // 270度
406 1
407 1
408 1 draw_x4 = draw_x6 = x0 + r;
409 1 draw_y4 = draw_y6 = y0;
410 1 if(draw_x4<GUI_LCM_XMAX) GUI_Point(draw_x4, draw_y4, color); // 0度
411 1
412 1 draw_x5 = draw_x7 = x0 - r;
413 1 draw_y5 = draw_y7 = y0;
414 1 if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color); // 180度
415 1 if(1==r) return; // 若半径为1,则已圆画完
416 1
417 1
418 1 /* 使用Bresenham法进行画圆 */
419 1 di = 3 - 2*r; // 初始化决策变量
420 1
421 1 xx = 0;
422 1 yy = r;
423 1 while(xx<yy)
424 1 { if(di<0)
425 2 { di += 4*xx + 6;
426 3 }
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 8
427 2 else
428 2 { di += 4*(xx - yy) + 10;
429 3
430 3 yy--;
431 3 draw_y0--;
432 3 draw_y1--;
433 3 draw_y2++;
434 3 draw_y3++;
435 3 draw_x4--;
436 3 draw_x5++;
437 3 draw_x6--;
438 3 draw_x7++;
439 3 }
440 2
441 2 xx++;
442 2 draw_x0++;
443 2 draw_x1--;
444 2 draw_x2++;
445 2 draw_x3--;
446 2 draw_y4++;
447 2 draw_y5++;
448 2 draw_y6--;
449 2 draw_y7--;
450 2
451 2
452 2 /* 要判断当前点是否在有效范围内 */
453 2 if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )
454 2 { GUI_Point(draw_x0, draw_y0, color);
455 3 }
456 2 if( (draw_x1>=0)&&(draw_y1>=0) )
457 2 { GUI_Point(draw_x1, draw_y1, color);
458 3 }
459 2 if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )
460 2 { GUI_Point(draw_x2, draw_y2, color);
461 3 }
462 2 if( (draw_x3>=0)&&(draw_y3<=GUI_LCM_YMAX) )
463 2 { GUI_Point(draw_x3, draw_y3, color);
464 3 }
465 2 if( (draw_x4<=GUI_LCM_XMAX)&&(draw_y4>=0) )
466 2 { GUI_Point(draw_x4, draw_y4, color);
467 3 }
468 2 if( (draw_x5>=0)&&(draw_y5>=0) )
469 2 { GUI_Point(draw_x5, draw_y5, color);
470 3 }
471 2 if( (draw_x6<=GUI_LCM_XMAX)&&(draw_y6<=GUI_LCM_YMAX) )
472 2 { GUI_Point(draw_x6, draw_y6, color);
473 3 }
474 2 if( (draw_x7>=0)&&(draw_y7<=GUI_LCM_YMAX) )
475 2 { GUI_Point(draw_x7, draw_y7, color);
476 3 }
477 2 }
478 1 }
479
480
481 /****************************************************************************
482 * 名称:GUI_CircleFill()
483 * 功能:指定圆心位置及半径,画圆并填充,填充色与边框色一样。
484 * 入口参数: x0 圆心的x坐标值
485 * y0 圆心的y坐标值
486 * r 圆的半径
487 * color 填充颜色
488 * 出口参数:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -