#include "include.h" #include "app_variable.h" #include "m_sportInfo.h" #define TRACE_EN 0 #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define COMPO_TEXT_AUTOROLL_NORMAL 0 //单方向滚动后循环滚动 #define COMPO_TEXT_AUTOROLL_LR 1 //左右回弹 #define COMPO_TEXT_AUTOROLL_DIRECTION COMPO_TEXT_AUTOROLL_NORMAL//文本滚动方向 #define COMPO_TEXT_AUTOROLL_START_TICK 1000 //文本滚动开始延时 #define COMPO_TEXT_AUTOROLL_STOP_TICK 1500 //文本滚动结束延时 #define COMPO_TEXT_AUTOROLL_TICK 18 //文本滚动 #define OFFSET(x) ((x)<127?(x):(x-256) ) /** * @brief 根据ID获取组件对象 * @param[in] id : 组件的ID * @return 返回组件的指针 **/ void *compo_getobj_byid(u16 id) { if (id == 0) { return NULL; } component_t *compo = compo_get_head(); while (compo != NULL) { if (compo->id == id) { return compo; } compo = compo_get_next(compo); //遍历组件 } return NULL; } /** * @brief 更新组件时间到TE时间 **/ ALIGNED(256) void compo_update(void) { u32 rtc_cnt, rtc_cnt2, rtc_pr2; bool rtc_update; GLOBAL_INT_DISABLE(); rtc_update = compo_cb.rtc_update; rtc_cnt = compo_cb.rtc_cnt; rtc_cnt2 = compo_cb.rtc_cnt2 >> 17 << 2; rtc_pr2 = (compo_cb.rtc_cnt2 & 0x1FFFF) + 1; compo_cb.rtc_update = false; GLOBAL_INT_RESTORE(); if (!rtc_update) { return; } compo_cb.tm = time_to_tm(rtc_cnt); compo_cb.mtime = rtc_cnt2 * 1000 / rtc_pr2; compo_set_update(compo_cb.tm, compo_cb.mtime); } /** * @brief 设置绑定数据 * @param[in] compo : 组件 * @param[in] tm : 时间tm结构体 * @param[in] x : 数据的坐标 **/ void compo_set_bonddata_ff(component_t *compo, tm_t tm ,s16 x) { bool flag_update = true; int value = 0; u32 value1 = 0; tm_t time = rtc_clock_get(); static u8 time_num = 0; char value_str[TEXTBOX_TEXT_BUF_LEN] = {0}; memset(value_str, '\0', 16); if (x <= 120) { if (time.hour >= 7) { value = time.hour - 7; } else { value = time.hour + 24 - 7; } time_num = 1; } else { if (time.hour >= 13) { value = time.hour - 13; } else { value = time.hour + 24 - 13; } } if (flag_update) { // printf("bond_data:%d, type:%d, value:%d\n", compo->bond_data, compo->type, value); if (compo->type == COMPO_TYPE_NUMBER) { compo_number_t *num = (compo_number_t *)compo; if (num->num_part) { if (num->num_part > 1) { value /= soft_pow(10, num->num_part - 1); } value %= 10; } compo_number_set(num, value); compo_number_set_margin(num, 0); // compo_number_set_visible(num, true); } else if (compo->type == COMPO_TYPE_TEXTBOX) { compo_textbox_t *txt = (compo_textbox_t *)compo; compo_textbox_set(txt, value_str); // compo_textbox_set_visible(txt, true); } else if (compo->type == COMPO_TYPE_PICTUREBOX) { compo_picturebox_t *pic = (compo_picturebox_t *)compo; compo_picturebox_cut(pic, value, pic->radix); // compo_picturebox_set_visible(pic, true); } } } /** * @brief 设置绑定数据 * @param[in] compo : 组件 * @param[in] tm : 时间tm结构体 **/ void compo_set_bonddata(component_t * compo, tm_t tm) { bool flag_update = true; int value = 0; u32 value1 = 0; s16 temperature = 0; tm_t time = rtc_clock_get(); static u8 time_num = 0; char value_str[TEXTBOX_TEXT_BUF_LEN] = {0}; memset(value_str, '\0', 16); switch (compo->bond_data) { case COMPO_BOND_YEAD: value = tm.year; sprintf(value_str, "%d", value); break; case COMPO_BOND_MONTH: if (compo->type == COMPO_TYPE_PICTUREBOX|| compo->type == COMPO_TYPE_NUMBER) { compo_picturebox_t *pic = (compo_picturebox_t *)compo; // printf("pic->radix = %d\n", pic->radix); //如果图片数量超过了11张,说明是12张图片或者24张图片 if (pic->radix > 11) { value = tm.mon - 1;//图片序列一般从0开始 if(pic->radix == 24) { #if defined(__LANGUAGE_SM_CHINESE__) if(tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese) { value = value; } else #endif { value += 12; } } sprintf(value_str, "%d", value); } //如果没超过11张,一般是数字 else{ value = tm.mon; sprintf(value_str, "%02d", value); } } break; case COMPO_BOND_DAY: value = tm.day; sprintf(value_str, "%02d", value); break; case COMPO_BOND_DAY_H: value = tm.day / 10; sprintf(value_str, "%d", value); break; case COMPO_BOND_DAY_L: value = tm.day % 10; sprintf(value_str, "%d", value); break; case COMPO_BOND_WEEKDAY: { if(tm.weekday == 0) value = 6; else value = tm.weekday - 1; } strcpy(value_str, i18n[STR_SUNDAY + value]); if (compo->type == COMPO_TYPE_PICTUREBOX|| compo->type == COMPO_TYPE_NUMBER) { compo_picturebox_t *pic = (compo_picturebox_t *)compo; if(pic->radix > 7) { #if defined(__LANGUAGE_SM_CHINESE__) if(tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese) { value = value; } else #endif { value += 7; } } } sprintf(value_str, "%d", value); break; case COMPO_BOND_HOUR: value = get_autoformat_hour(tm.hour); sprintf(value_str, "%02d", value); break; case COMPO_BOND_MINUTE: value = tm.min; sprintf(value_str, "%02d", value); break; case COMPO_BOND_HOUR_H: value = get_autoformat_hour(tm.hour) / 10; sprintf(value_str, "%d", value); break; case COMPO_BOND_HOUR_L: value = get_autoformat_hour(tm.hour) % 10; sprintf(value_str, "%d", value); break; case COMPO_BOND_MINUTE_H: value = tm.min / 10; sprintf(value_str, "%02d", value); break; case COMPO_BOND_MINUTE_L: value = tm.min % 10; sprintf(value_str, "%02d", value); break; case COMPO_BOND_SECOND: value = tm.sec; sprintf(value_str, "%02d", value); break; case COMPO_BOND_DATE: value = tm.mon * 100 + tm.day; sprintf(value_str, "%02d-%02d", tm.mon, tm.day); break; case COMPO_BOND_TIME: value = tm.hour * 100 + tm.min; sprintf(value_str, "%02d:%02d", get_autoformat_hour(tm.hour), tm.min); break; case COMPO_BOND_IMAGE_WEATHER: value = SysVariable.weather.type; // printf("weather type ==== value = %d\n"); sprintf(value_str, "%d", value); break; case COMPO_BOND_BLE_STA: value = ble_is_connected(); sprintf(value_str, "%d", value); break; case COMPO_BOND_BT_STA: value = !bt_is_connected(); sprintf(value_str, "%d", value); break; case COMPO_BOND_BTBLE_STA: //0-3:BTBLE,BT,BLE,NULL value = ((!bt_is_connected()) << 1) | (!ble_is_connect()); sprintf(value_str, "%d", value); break; // case COMPO_BOND_DISTANCE_PROGRESS: // value = 0; // if (compo->type == COMPO_TYPE_PICTUREBOX && sys_cb.distance_goal) { // value = ((compo_picturebox_t*)compo)->radix * sys_cb.distance_cur / sys_cb.distance_goal; // value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value)); // } // sprintf(value_str, "%d", value); // break; // case COMPO_BOND_KCAL_PROGRESS: // value = 0; // if (compo->type == COMPO_TYPE_PICTUREBOX && sys_cb.kcal_goal) { // value = ((compo_picturebox_t*)compo)->radix * sys_cb.kcal_cur / sys_cb.kcal_goal; // value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value)); // } // sprintf(value_str, "%d", value); // break; // case COMPO_BOND_STEPS_PROGRESS: // value = 0; // if (compo->type == COMPO_TYPE_PICTUREBOX && sys_cb.step_goal) { // value = ((compo_picturebox_t*)compo)->radix * sys_cb.step_cur / sys_cb.step_goal; // value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value)); // } // sprintf(value_str, "%d", value); // break; case COMPO_BOND_VBAT_PROGRESS: value = 0; if (compo->type == COMPO_TYPE_PICTUREBOX) { // value = ((compo_picturebox_t*)compo)->radix * bsp_vbat_percent_get() / 100; // value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value)); value = tjd_charging_show_bat_ui_level(); } sprintf(value_str, "%d", value); break; case COMPO_BOND_KCAL: value = getCalorie(SysVariable.curSportRecord.pedo)/1000; sprintf(value_str, "%04d", value); break; case COMPO_BOND_STEP: value = SysVariable.curSportRecord.pedo; sprintf(value_str, "%05d", value); break; case COMPO_BOND_HEARTRATE: value = SysVariable.heartRateModule.lastHeart; sprintf(value_str, "%03d", value); break; case COMPO_BOND_BLOOD_OXYGEN: value = SysVariable.heartRateModule.lastSpo2; sprintf(value_str, "%03d", value); break; // case COMPO_BOND_BLOOD_SUGER: // value = 0; // sprintf(value_str, "%d", value); // break; case COMPO_BOND_WEATHER: // value = sys_cb.weather_idx; value = SysVariable.weather.temperature; value = weather_temperature_transform(OFFSET(value))/100; sprintf(value_str, "%d", value); // printf("weather - value = %d\n",value); // sprintf(value_str, "%s", i18n[STR_CLOUDY + value]); break;// case COMPO_BOND_WEATHER: // value = sys_cb.weather_idx; // sprintf(value_str, "%s", i18n[STR_CLOUDY + value]); // break; // case COMPO_BOND_ATMOMS: // value = 0; // sprintf(value_str, "%d", value); // break; case COMPO_BOND_TEMPERATURE: temperature = weather_temperature_transform(OFFSET(SysVariable.weather.temperature)) / 100; //温度 sprintf(value_str, "%d~%d℃", SysVariable.weather.temperature, SysVariable.weather.temperature); //温度范围 break; // case COMPO_BOND_ALTITUDE: // value = 0; // sprintf(value_str, "%d", value); // break; case COMPO_BOND_BATTERY: // value = sys_cb.vbat_percent; value = tjd_charging_show_bat_ui_level()*10; if(value== 0xff){ sprintf(value_str, "--%%"); } else{ sprintf(value_str, "%d%%", value); } break; case COMPO_BOND_DISTANCE: value = getDistance(SysVariable.curSportRecord.pedo); value1 = getDistance(SysVariable.curSportRecord.pedo)-(value*1000)/100; if (SysVariable.deviceInfo.distanceUnit == 1) { value = value * 621371 / 1000000; // 转英制数据 } value = value /1000; // sprintf(value_str, "%02d.%01d", value / 1000, value % 1000 / 100); // printf("value / 1000 = %d\n",value,value / 1000); sprintf(value_str, "%02d.%d", value,value1); break; case COMPO_BOND_TEMPERATURE_UNIT: if (SysVariable.deviceInfo.distanceUnit == UNIT_TYPE_INCH) { value = 1; // 转英制数据 } else value = 0; break; // case COMPO_BOND_DISTANCE_UNIT: // value = 0; //0:km 1:mile // //strcpy(value_str, i18n[STR_KM + value]); // break; case COMPO_BOND_CUSTOM_NEW_YORK: if(tm.hour<13) { value = get_autoformat_hour(tm.hour+24-13); } else { value = get_autoformat_hour(tm.hour-13); } sprintf(value_str, "%02d", value); break; case COMPO_BOND_CUSTOM_PARIS: if(tm.hour<7) { value = get_autoformat_hour(tm.hour+24-7); } else{ value = get_autoformat_hour(tm.hour-7); } sprintf(value_str, "%02d", value); break; case COMPO_BOND_CUSTOM_WEATHER_MIN: temperature = weather_temperature_transform(OFFSET(SysVariable.weather.minTemp)) / 100; //最低温度 sprintf(value_str, "%d~%d℃", SysVariable.weather.minTemp, SysVariable.weather.maxTemp); //温度范围 break; case COMPO_BOND_CUSTOM_WEATHER_MAX: temperature = weather_temperature_transform(OFFSET(SysVariable.weather.n2day_maxTemp)) / 100; //最高温度 sprintf(value_str, "%d~%d℃", SysVariable.weather.minTemp, SysVariable.weather.maxTemp); //温度范围 break; case COMPO_BOND_CUSTOM0: value = getDistance(SysVariable.curSportRecord.pedo); if (SysVariable.deviceInfo.distanceUnit == 1) { value = value * 621371 / 1000000; // 转英制数据 } value = value%1000/100; break; default: flag_update = false; break; } if (flag_update) { // printf("bond_data:%d, type:%d, value:%d\n", compo->bond_data, compo->type, value); if(compo->bond_data==COMPO_BOND_CUSTOM_WEATHER_MIN ||compo->bond_data==COMPO_BOND_CUSTOM_WEATHER_MAX || compo->bond_data== COMPO_BOND_TEMPERATURE) { compo_number_t *num = (compo_number_t *)compo; compo_number_set(num, temperature); compo_number_set_margin(num,0); } else if (compo->type == COMPO_TYPE_NUMBER) { compo_number_t *num = (compo_number_t *)compo; if (num->num_part) { if (num->num_part > 1) { value /= soft_pow(10, num->num_part - 1); } value %= 10; } compo_number_set(num, value); compo_number_set_margin(num,0); // compo_number_set_visible(num, true); } else if (compo->type == COMPO_TYPE_TEXTBOX) { compo_textbox_t *txt = (compo_textbox_t *)compo; compo_textbox_set(txt, value_str); // compo_textbox_set_visible(txt, true); } else if (compo->type == COMPO_TYPE_PICTUREBOX) { compo_picturebox_t *pic = (compo_picturebox_t *)compo; compo_picturebox_cut(pic, value, pic->radix); // compo_picturebox_set_visible(pic, true); } } } /** * @brief 设置滚动 * @param[in] rcb : 滚动控制结构体 * @param[in] txt : 滚动Widget Text * @param[in] multiline : 是否为多行竖向滚动 **/ static void compo_set_roll(compo_roll_cb_t *rcb, widget_text_t *txt, bool multiline) { if (!rcb->mode && !rcb->is_drag) { return; } static bool flag_drag = false; static s32 ddy = 0; s32 dx=0,dy=0; bool align_center = widget_get_align_center(txt); area_t rel_textbox_area = widget_text_get_box_area_rel(txt); area_t rel_text_area = widget_text_get_area(txt); u16 circ_pixel = widget_text_get_autoroll_circ_pixel(txt); // int end_hei = rel_textbox_area.hei * 2 / 3; int end_hei = widget_text_get_height(); bool txt_directoion = widget_text_get_right_align(txt); flag_drag = ctp_get_dxy(&dx, &dy); if (flag_drag) { //按下 } else { //抬起 ddy = rcb->offset; } switch (rcb->sta) { case COMPO_ROLL_STA_IDLE: if (flag_drag && rcb->is_drag && multiline) { //多行显示可拖拽 rcb->tick = tick_get(); rcb->sta = COMPO_ROLL_STA_ROLL; } else if (tick_check_expire(rcb->tick, COMPO_TEXT_AUTOROLL_START_TICK)) { rcb->tick = tick_get(); rcb->sta = COMPO_ROLL_STA_ROLL; } break; case COMPO_ROLL_STA_ROLL: if (flag_drag && rcb->is_drag && multiline) { //多行显示可拖拽 rcb->tick = tick_get(); rcb->offset = ddy + dy; if (rcb->offset > 0) { rcb->offset = 0; } else if (rcb->offset < end_hei - rel_text_area.hei) { rcb->offset = end_hei - rel_text_area.hei; } widget_text_set_client(txt, 0, rcb->offset); } else if (tick_check_expire(rcb->tick, COMPO_TEXT_AUTOROLL_TICK)) { rcb->tick = tick_get(); if (rcb->mode) { rcb->offset += rcb->direction; } if (multiline) { if (rel_text_area.hei + rcb->offset <= end_hei) { rcb->sta = COMPO_ROLL_STA_STOP; } widget_text_set_client(txt, 0, rcb->offset); } else { int end_wid = 0; rel_text_area.wid = align_center ? rel_text_area.wid / 2 : rel_text_area.wid; //文本居中时,宽度需要/2,防止滚完导致C208蓝屏 if (txt_directoion) { #if COMPO_TEXT_AUTOROLL_DIRECTION end_wid = rel_textbox_area.wid * 1 / 3; if ((rcb->offset <= -(rel_text_area.wid * 1 / 3 + end_wid)) || (rcb->offset >= end_wid)) { rcb->direction = -rcb->direction; } #else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) { end_wid = 0; } else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL) { end_wid = rel_text_area.wid; if (rel_textbox_area.wid < rel_text_area.wid / 3) { end_wid += (rel_text_area.wid / 3 - rel_textbox_area.wid); } } if (rcb->offset > end_wid) { if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) { rcb->offset = -(rel_text_area.wid * (1 + align_center) + circ_pixel); } else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL) { rcb->sta = COMPO_ROLL_STA_STOP; } } #endif } else { #if COMPO_TEXT_AUTOROLL_DIRECTION end_wid = rel_textbox_area.wid * 1 / 3; if ((rcb->offset <= -(rel_text_area.wid * 1 / 3 + end_wid)) || (rcb->offset >= end_wid)) { rcb->direction = -rcb->direction; } #else s16 circ_end_wid = align_center ? (rel_text_area.wid * 2 + circ_pixel) : (rel_text_area.wid + circ_pixel); if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) { end_wid = circ_end_wid; } else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL) { end_wid = rel_text_area.wid * 2 / 3; } if (rel_textbox_area.wid < rel_text_area.wid / 3) { end_wid += (rel_text_area.wid / 3 - rel_textbox_area.wid); } if (rcb->offset < -end_wid) { if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) { rcb->offset = 0; } else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL){ rcb->sta = COMPO_ROLL_STA_STOP; } } #endif } widget_text_set_client(txt, rcb->offset, 0); } } break; case COMPO_ROLL_STA_STOP: if (flag_drag && rcb->is_drag && multiline) { //多行显示可拖拽 rcb->tick = tick_get(); rcb->sta = COMPO_ROLL_STA_ROLL; } else if (tick_check_expire(rcb->tick, COMPO_TEXT_AUTOROLL_STOP_TICK)) { rcb->tick = tick_get(); rcb->sta = COMPO_ROLL_STA_IDLE; if (multiline) { rcb->offset = 0; widget_text_set_client(txt, 0, rcb->offset); } else { rcb->offset = (txt_directoion && rcb->mode) ? -rel_text_area.wid : 0; if (txt_directoion && (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC)) { rcb->offset = -rel_text_area.wid; } else { rcb->offset = 0; } //居中对齐且存在滚动时从最左边开始滚动 if (rcb->direction && widget_get_align_center(txt)) { rcb->offset = (rel_text_area.wid - rel_textbox_area.wid) / 2; } widget_text_set_client(txt, rcb->offset, 0); } } break; default: halt(HALT_GUI_COMPO_ROLL); break; } } /** * @brief 设置组件更新 * @param[in] tm : 时间tm结构体 * @param[in] mtime : 毫秒 **/ void compo_set_update(tm_t tm, u16 mtime) { component_t *compo = compo_get_head(); s16 angle_h, angle_m, angle_s; char time_str[16]; angle_h = tm.hour * 300 + tm.min * 5 + tm.sec / 12; angle_m = tm.min * 60 + tm.sec; //angle_s = tm.sec * 60 + mtime / 100 * 6 - 900; //按100ms对齐 angle_s = tm.sec * 60 + mtime * 3 / 100 * 2; //按33ms(0.2度)对齐 //angle_s = tm.sec * 60 + mtime * 6 / 100 - 900; //按实际ms //printf("%d %d %d\n", angle_h, angle_m, angle_s); while (compo != NULL) { switch (compo->type) { case COMPO_TYPE_DATETIME: { s16 angle = 0; switch (compo->bond_data) { case COMPO_BOND_HOUR: angle = angle_h; break; case COMPO_BOND_MINUTE: angle = angle_m; break; case COMPO_BOND_SECOND: angle = angle_s; break; default: break; } if (angle) { compo_datetime_t *dtime = (compo_datetime_t *)compo; angle -= dtime->start_angle; angle = dtime->anticlockwise ? (3600 - angle) : angle; widget_image_set_rotation(dtime->img, angle); } } break; case COMPO_TYPE_ICONLIST: { s16 angle = 0; compo_iconlist_t *iconlist = (compo_iconlist_t *)compo; if (iconlist->hour != NULL) { angle = angle_h - iconlist->start_angle; widget_image_set_rotation(iconlist->hour, angle); } if (iconlist->min != NULL) { angle = angle_m - iconlist->start_angle; widget_image_set_rotation(iconlist->min, angle); } if (iconlist->sec != NULL) { angle = angle_s - iconlist->start_angle; widget_image_set_rotation(iconlist->sec, angle); } if (iconlist->page_time != NULL) { //同步时钟图标Alpha值 widget_set_alpha(iconlist->page_time , widget_get_alpha(iconlist->time_bg)); } } break; case COMPO_TYPE_LISTBOX: { compo_listbox_t *listbox = (compo_listbox_t *)compo; int i; for (i=0; iroll_cb[i], listbox->item_text[i], false); //滚动 } } break; case COMPO_TYPE_DISKLIST: { compo_disklist_t *disklist = (compo_disklist_t *)compo; int i; for (i=0; iroll_cb[i], disklist->item_text[i], false); //滚动 } } break; case COMPO_TYPE_CARDBOX: { compo_cardbox_t *cardbox = (compo_cardbox_t *)compo; if (cardbox->text[0]) { compo_set_roll(&cardbox->roll_cb, cardbox->text[0], false); //滚动 } } break; case COMPO_TYPE_FORM: { compo_form_t *frm = (compo_form_t *)compo; if (widget_get_visble(frm->time)) { if (SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR) sprintf(time_str, "%02d:%02d%s", get_autoformat_hour(tm.hour), tm.min, tm.hour >= 12 ? "PM" : "AM"); else sprintf(time_str, "%02d:%02d", tm.hour, tm.min); widget_text_set(frm->time, time_str); } } break; case COMPO_TYPE_NUMBER: case COMPO_TYPE_PICTUREBOX: compo_set_bonddata(compo, tm); break; case COMPO_TYPE_TEXTBOX: compo_set_bonddata(compo, tm); //设置绑定数据 compo_textbox_t *textbox = (compo_textbox_t *)compo; compo_set_roll(&textbox->roll_cb, textbox->txt, textbox->multiline); //滚动 break; case COMPO_TYPE_ANIMATION: compo_animation_process((compo_animation_t *)compo); break; default: break; } compo = compo_get_next(compo); //遍历组件 } } /** * @brief 获取按键ID **/ int compo_get_button_id(void) { point_t pt = ctp_get_sxy(); component_t *compo = (component_t *)compo_pool_get_top(); while (compo != NULL) { if (compo->type == COMPO_TYPE_BUTTON) { compo_button_t *btn = (compo_button_t *)compo; rect_t rect = widget_get_absolute(btn->widget); if (abs_s(pt.x - rect.x) * 2 <= rect.wid && abs_s(pt.y - rect.y) * 2 <= rect.hei) { return btn->id; } } compo = compo_get_next(compo); //遍历组件 } return ID_NULL; } /**author :gzj * @brief 获取不居中 按键id **/ int compo_get_align_center_false_button_id(void) { point_t pt = ctp_get_sxy(); component_t *compo = (component_t *)compo_pool_get_top(); while (compo != NULL) { if (compo->type == COMPO_TYPE_BUTTON) { compo_button_t *btn = (compo_button_t *)compo; rect_t rect = widget_get_absolute(btn->widget); if (abs_s(pt.x - rect.x) <= rect.wid && abs_s(pt.y - rect.y) <= rect.hei) { return btn->id; } } compo = compo_get_next(compo); //遍历组件 } return ID_NULL; }