📄 gui_basic.lst
字号:
242 */
243 void GUI_DisplayStr( INT8U xs, INT8U ys, FONT* pFont, char* Str )
244 {
245 1 while( *Str )
246 1 {
247 2 GUI_DisplayFont( xs, ys, pFont, *Str );
248 2 Str ++;
249 2 xs += pFont->Width;
250 2 }
251 1 }
252 /*
253 ================================================================================
254 Name: GUI_DrawCircle( )
255 Function: Display a cycle at a special area
256 Input: -pCycle, A pinter point to a cycle structure
257 Output: None
258 Author: LiYong
259 Date : 2008.08.09
260 ================================================================================
261 */
262 void GUI_DrawCircle( CIRCLE* pCircle )
263 {
264 1 INT8S draw_x0, draw_y0; // 刽图点坐标变量
265 1 INT8S draw_x1, draw_y1;
266 1 INT8S draw_x2, draw_y2;
267 1 INT8S draw_x3, draw_y3;
268 1 INT8S draw_x4, draw_y4;
269 1 INT8S draw_x5, draw_y5;
270 1 INT8S draw_x6, draw_y6;
271 1 INT8S draw_x7, draw_y7;
272 1 INT8S xx, yy; // 画圆控制变量
273 1
274 1 INT8S di; // 决策变量
275 1 POINT point;
276 1
277 1 point.Color = pCircle->Color;
278 1
279 1 /* 参数过滤 */
280 1 if(0 == pCircle->r ) return;
281 1
282 1 /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
283 1 point.x = draw_x0 = draw_x1 = pCircle->x;
284 1 point.y = draw_y0 = draw_y1 = pCircle->y + pCircle->r;
285 1
286 1 if( draw_y0 < GUI_LCM_YMAX ) LCDDrawPoint( &point ); // 90度
287 1
288 1 point.x = draw_x2 = draw_x3 = pCircle->x;
289 1 point.y = draw_y2 = draw_y3 = pCircle->y - pCircle->r;
290 1 if( draw_y2 >= 0 ) LCDDrawPoint( &point ); // 270度
291 1
292 1
293 1 point.x = draw_x4 = draw_x6 = pCircle->x + pCircle->r;
294 1 point.y = draw_y4 = draw_y6 = pCircle->y;
295 1 if(draw_x4<GUI_LCM_XMAX) LCDDrawPoint( &point ); // 0度
296 1
297 1 point.x = draw_x5 = draw_x7 = pCircle->x - pCircle->r;
298 1 point.y = draw_y5 = draw_y7 = pCircle->y;
299 1 if(draw_x5>=0) LCDDrawPoint( &point ); // 180度
300 1 if(1==pCircle->r) return; // 若半径为1,则已圆画完
301 1
302 1
C51 COMPILER V7.50 GUI_BASIC 03/30/2011 19:43:24 PAGE 6
303 1 /* 使用Bresenham法进行画圆 */
304 1 di = 3 - 2*pCircle->r; // 初始化决策变量
305 1
306 1 xx = 0;
307 1 yy = pCircle->r;
308 1 while(xx<yy)
309 1 { if(di<0)
310 2 { di += 4*xx + 6;
311 3 }
312 2 else
313 2 { di += 4*(xx - yy) + 10;
314 3
315 3 yy--;
316 3 draw_y0--;
317 3 draw_y1--;
318 3 draw_y2++;
319 3 draw_y3++;
320 3 draw_x4--;
321 3 draw_x5++;
322 3 draw_x6--;
323 3 draw_x7++;
324 3 }
325 2
326 2 xx++;
327 2 draw_x0++;
328 2 draw_x1--;
329 2 draw_x2++;
330 2 draw_x3--;
331 2 draw_y4++;
332 2 draw_y5++;
333 2 draw_y6--;
334 2 draw_y7--;
335 2
336 2
337 2 /* 要判断当前点是否在有效范围内 */
338 2 if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )
339 2 {
340 3 point.x = draw_x0;
341 3 point.y = draw_y0;
342 3 LCDDrawPoint( &point );
343 3 }
344 2 if( (draw_x1>=0)&&(draw_y1>=0) )
345 2 {
346 3 point.x = draw_x1;
347 3 point.y = draw_y1;
348 3 LCDDrawPoint( &point );
349 3 }
350 2 if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )
351 2 {
352 3 point.x = draw_x2;
353 3 point.y = draw_y2;
354 3 LCDDrawPoint( &point );
355 3 }
356 2 if( (draw_x3>=0)&&(draw_y3<=GUI_LCM_YMAX) )
357 2 {
358 3 point.x = draw_x3;
359 3 point.y = draw_y3;
360 3 LCDDrawPoint( &point );
361 3 }
362 2 if( (draw_x4<=GUI_LCM_XMAX)&&(draw_y4>=0) )
363 2 {
364 3 point.x = draw_x4;
C51 COMPILER V7.50 GUI_BASIC 03/30/2011 19:43:24 PAGE 7
365 3 point.y = draw_y4;
366 3 LCDDrawPoint( &point );
367 3 }
368 2 if( (draw_x5>=0)&&(draw_y5>=0) )
369 2 {
370 3 point.x = draw_x5;
371 3 point.y = draw_y5;
372 3 LCDDrawPoint( &point );
373 3 }
374 2 if( (draw_x6<=GUI_LCM_XMAX)&&(draw_y6<=GUI_LCM_YMAX) )
375 2 {
376 3 point.x = draw_x6;
377 3 point.y = draw_y6;
378 3 LCDDrawPoint( &point );
379 3 }
380 2 if( (draw_x7>=0)&&(draw_y7<=GUI_LCM_YMAX) )
381 2 {
382 3 point.x = draw_x7;
383 3 point.y = draw_y7;
384 3 LCDDrawPoint( &point );
385 3 }
386 2 }
387 1 }
388 /*
389 ================================================================================
390 Name: GUI_DrawCircleFill( )
391 Function: Display a cycle at a special area and fill its area
392 Input: -pCycle, A pinter point to a cycle structure
393 Output: None
394 Author: LiYong
395 Date : 2008.08.09
396 ================================================================================
397 */
398 void GUI_DrawCircleFill( CIRCLE* pCircle )
399 {
400 1 INT8S draw_x0, draw_y0; // 刽图点坐标变量
401 1 INT8S draw_x1, draw_y1;
402 1 INT8S draw_x2, draw_y2;
403 1 INT8S draw_x3, draw_y3;
404 1 INT8S draw_x4, draw_y4;
405 1 INT8S draw_x5, draw_y5;
406 1 INT8S draw_x6, draw_y6;
407 1 INT8S draw_x7, draw_y7;
408 1 INT8S fill_x0, fill_y0; // 填充所需的变量,使用垂直线填充
409 1 INT8S fill_x1;
410 1 INT8S xx, yy; // 画圆控制变量
411 1
412 1 INT8S di; // 决策变量
413 1 POINT point;
414 1 LINE line;
415 1
416 1 point.Color = pCircle->Color;
417 1 line.Color = pCircle->Color;
418 1
419 1
420 1
421 1 /* 参数过滤 */
422 1 if(0==pCircle->r) return;
423 1
424 1 /* 计算出4个特殊点(0、90、180、270度),进行显示 */
425 1 point.x = draw_x0 = draw_x1 = pCircle->x;
426 1 point.y = draw_y0 = draw_y1 = pCircle->y + pCircle->r;
C51 COMPILER V7.50 GUI_BASIC 03/30/2011 19:43:24 PAGE 8
427 1 if(draw_y0<GUI_LCM_YMAX)
428 1 {
429 2 LCDDrawPoint( &point );
430 2 }
431 1
432 1 point.x = draw_x2 = draw_x3 = pCircle->x;
433 1 point.y = draw_y2 = draw_y3 = pCircle->y - pCircle->r;
434 1 if(draw_y2>=0)
435 1 {
436 2 LCDDrawPoint( &point );
437 2 }
438 1
439 1 point.x = draw_x4 = draw_x6 = pCircle->x + pCircle->r;
440 1 point.y = draw_y4 = draw_y6 = pCircle->y;
441 1 if(draw_x4<GUI_LCM_XMAX)
442 1 {
443 2 LCDDrawPoint( &point ); // 0度
444 2 fill_x1 = draw_x4;
445 2 }
446 1 else
447 1 {
448 2 fill_x1 = GUI_LCM_XMAX;
449 2 }
450 1 fill_y0 = pCircle->y; // 设置填充线条起始点fill_x0
451 1 fill_x0 = pCircle->x - pCircle->r; // 设置填充线条结束点fill_y1
452 1 if(fill_x0<0) fill_x0 = 0;
453 1 line.xs = fill_x0;
454 1 line.ys = fill_y0;
455 1 line.ye = fill_y0;
456 1 line.xe = fill_x1;
457 1 LCDDrawHRLine( &line );
458 1
459 1 point.x = draw_x5 = draw_x7 = pCircle->x - pCircle->r;
460 1 point.y = draw_y5 = draw_y7 = pCircle->y;
461 1 if(draw_x5>=0)
462 1 {
463 2 LCDDrawPoint( &point ); // 180度
464 2 }
465 1 if(1==pCircle->r) return;
466 1
467 1
468 1 /* 使用Bresenham法进行画圆 */
469 1 di = 3 - 2*pCircle->r; // 初始化决策变量
470 1
471 1 xx = 0;
472 1 yy = pCircle->r;
473 1 while(xx<yy)
474 1 { if(di<0)
475 2 { di += 4*xx + 6;
476 3 }
477 2 else
478 2 { di += 4*(xx - yy) + 10;
479 3
480 3 yy--;
481 3 draw_y0--;
482 3 draw_y1--;
483 3 draw_y2++;
484 3 draw_y3++;
485 3 draw_x4--;
486 3 draw_x5++;
487 3 draw_x6--;
488 3 draw_x7++;
C51 COMPILER V7.50 GUI_BASIC 03/30/2011 19:43:24 PAGE 9
489 3 }
490 2
491 2 xx++;
492 2 draw_x0++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -