|
1.按键功能的回调 函数是在 touch release 处理的,不是 pen down,pen down 只是刷新按钮的状态, 在发送消息时如果 release 的坐标值不在控件上,按钮无效,不会响应
2.自带的电阻屏驱动是阻塞的,应用时要注意,可以改造为不阻塞的。
3.自己改造电阻屏校准程序时,可以采用裸机思维,只要定义一个 draw_rect 函数,背景采用这个函数填充背景,再用这个函数画一个图标
4.底层的绘图驱动是画水平线,垂直线,画点,如果芯片带有 dma-2d 可以自己定义这个函数,在初始化时替换为自己的定义的函数指针,
这样在画布上绘图速度会加快。
5.所有控件都有焦点功能,可以在做界面时不勾选,
6.自定义事件在发送时要指定目标 widget ,否则事件处理不了,会返回到根窗口。
7.除了根窗口,其它窗口在创建时后两个参数可以为空
gx_studio_named_widget_create("home", GX_NULL, GX_NULL);
gx_studio_named_widget_create("main_form", GX_NULL, GX_NULL);
gx_studio_named_widget_create("setup", GX_NULL, GX_NULL);
gx_studio_named_widget_create("sys_setup", GX_NULL, GX_NULL);
gx_studio_named_widget_create("touch_calib", GX_NULL, GX_NULL);
gx_studio_named_widget_create("sys_init", (GX_WIDGET *)root, (GX_WIDGET **)&screen_sys_init);
8. 为了避免触发干扰,电阻屏校准程序可以在每个点读取后加延时,完成程序如下:
UINT touch_drv_calibrate(_touch_drv_def *touch)
{
GX_EVENT calibration_event = {0};
GX_POINT raw_point[4];
GX_POINT dis_point[4];
int icon_size;
GX_RECTANGLE newsize;
uint8_t (*pen_down)(VOID);
if(touch->dis_dev == 0)
{return GX_FAILURE;}
_tft_str_dis_def *dis_dev = touch->dis_dev;
pen_down = touch -> pen_down_detect;
//设置4个显示图标坐标点
dis_point[0].gx_point_x = dis_dev->dis_width / 10;
dis_point[0].gx_point_y = dis_dev->dis_height / 10;
dis_point[1].gx_point_x = dis_dev->dis_width * 9 / 10;
dis_point[1].gx_point_y = dis_dev->dis_height / 10;
dis_point[2].gx_point_x = dis_dev->dis_width / 10;
dis_point[2].gx_point_y = dis_dev->dis_height *9 / 10;
dis_point[3].gx_point_x = dis_dev->dis_width * 9 / 10;
dis_point[3].gx_point_y = dis_dev->dis_height *9 / 10;
//等待触摸松开
//清屏为蓝色
draw_rect(touch->dis_dev, 0 ,0 ,dis_dev->dis_width , dis_dev->dis_height , 200>>3 );
//显示一个10*10 红色标志
draw_rect(touch->dis_dev, dis_point[0].gx_point_x - 5 , dis_point[0].gx_point_y -5 , dis_point[0].gx_point_x + 5 , dis_point[0].gx_point_y + 5 , (200>>3)<<11 );
dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.1 point");
touch_wait_for_no_touch(touch);
//
GX_TOUCH_TASK_SLEEP(200);
/* wait for a touch: */
while(1)
{
touch_wait_for_touch(touch);
if (touch_sample_read(touch, &raw_point[0]))
{
//清除10*10 红色标志
draw_rect(touch->dis_dev, dis_point[0].gx_point_x - 5 , dis_point[0].gx_point_y -5 , dis_point[0].gx_point_x + 5 , dis_point[0].gx_point_y + 5, (200>>3) );
break;
}
GX_TOUCH_TASK_SLEEP(1);
}
//读取点后,要等待 300 mS ,否则容易误触发
GX_TOUCH_TASK_SLEEP(300);
//显示一个10*10 红色标志
dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.2 point");
draw_rect(touch->dis_dev, dis_point[1].gx_point_x - 5 , dis_point[1].gx_point_y -5 , dis_point[1].gx_point_x + 5 , dis_point[1].gx_point_y + 5, (200>>3)<<11 );
/* wait for a touch: */
while(1)
{
touch_wait_for_touch(touch);
if (touch_sample_read(touch, &raw_point[1]))
{
draw_rect(touch->dis_dev, dis_point[1].gx_point_x - 5 , dis_point[1].gx_point_y -5 , dis_point[1].gx_point_x + 5 , dis_point[1].gx_point_y + 5, (200>>3));
break;
}
GX_TOUCH_TASK_SLEEP(1);
}
touch_wait_for_no_touch(touch);
GX_TOUCH_TASK_SLEEP(300);
dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.3 point");
draw_rect(touch->dis_dev, dis_point[2].gx_point_x - 5 , dis_point[2].gx_point_y -5 , dis_point[2].gx_point_x + 5 , dis_point[2].gx_point_y + 5, (200>>3)<<11 );
/* wait for a touch: */
while(1)
{
touch_wait_for_touch(touch);
if (touch_sample_read(touch, &raw_point[2]))
{
draw_rect(touch->dis_dev, dis_point[2].gx_point_x - 5 , dis_point[2].gx_point_y -5 , dis_point[2].gx_point_x + 5 , dis_point[2].gx_point_y + 5, (200>>3));
break;
}
GX_TOUCH_TASK_SLEEP(1);
}
touch_wait_for_no_touch(touch);
GX_TOUCH_TASK_SLEEP(300);
dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.4 point");
draw_rect(touch->dis_dev, dis_point[3].gx_point_x - 5 , dis_point[3].gx_point_y -5 , dis_point[3].gx_point_x + 5 , dis_point[3].gx_point_y + 5, (200>>3)<<11 );
/* wait for a touch: */
while(1)
{
touch_wait_for_touch(touch);
if (touch_sample_read(touch, &raw_point[3]))
{
draw_rect(touch->dis_dev, dis_point[3].gx_point_x - 5 , dis_point[3].gx_point_y -5 , dis_point[3].gx_point_x + 5 , dis_point[3].gx_point_y + 5, (200>>3));
break;
}
GX_TOUCH_TASK_SLEEP(1);
}
touch_wait_for_no_touch(touch);
/* Initialize touch screen calibration factor matrix with new values */
if(GX_SUCCESS == touch_calibration_calculate(touch,
(GX_POINT *) &dis_point[0], /* Display coordinates */
(GX_POINT *) &raw_point[0])) /* Touch coordinates */
{
touch -> calibrated = GX_TRUE;
//产生校正结束事件
calibration_event.gx_event_type = GX_EVENT_TOUCH_CALIBRATION_COMPLETE;
calibration_event.gx_event_target = 0;
calibration_event.gx_event_sender = 0;
calibration_event.gx_event_display_handle = 0;
_gx_system_event_send(&calibration_event);
return GX_SUCCESS;
}
else
{
return GX_FAILURE;
}
}
|
|