static void app_lcd(void *parameter) { /* create application */ struct rtgui_app *app; struct rtgui_rect rect1 = {0, 0, 240, 320}; struct rtgui_button* btn; struct rtgui_label *lb; app = rtgui_app_create("lcd_app"); if (!app) { rt_kprintf("Create application \"lcd_app\" failed!\n"); return; } /* create main window */ win_main = rtgui_win_create(RT_NULL, "main", &rect1, RTGUI_WIN_STYLE_NO_BORDER | RTGUI_WIN_STYLE_NO_TITLE); if (win_main == RT_NULL) { rt_kprintf("Create window \"main\" failed!\n"); rtgui_app_destroy(app); return; } RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(win_main)) = green; rect1.x1 = rect1.y1 = 50; rect1.x2 -= 50; rect1.y2 -= 50; lb = rtgui_label_create("I am a transparent label!!!!!!!!!"); rtgui_widget_set_rect(RTGUI_WIDGET(lb), &rect1); RTGUI_WIDGET_FLAG(RTGUI_WIDGET(lb)) |= RTGUI_WIDGET_FLAG_TRANSPARENT; rect1.x1 += 20; rect1.y1 += 20; notebook = rtgui_notebook_create(&rect1, 0); /* create lable in main container */ btn = rtgui_button_create("Here I am."); rtgui_notebook_add(notebook, "btn A", RTGUI_WIDGET(btn)); rtgui_button_set_onbutton(btn, remove_myself); btn = rtgui_button_create("There I am."); rtgui_notebook_add(notebook, "btn B", RTGUI_WIDGET(btn)); rtgui_container_add_child(RTGUI_CONTAINER(win_main), RTGUI_WIDGET(lb)); rtgui_container_add_child(RTGUI_CONTAINER(win_main), RTGUI_WIDGET(notebook)); rtgui_win_show(win_main, RT_FALSE); rtgui_app_run(app); rtgui_app_destroy(app); }
static void rtgui_list_view_calc(struct rtgui_list_view* view) { rtgui_rect_t rect; rt_uint32_t image_width, image_height; rt_ubase_t text_width, text_height; rt_ubase_t item_width, item_height; if (view->items_count == 0) return; /* get image width and height */ if (view->items[0].image != RT_NULL) { image_width = view->items[0].image->w; image_height = view->items[0].image->h; } else { image_width = 0; image_height = 0; } rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(view)), "HHHHHH", &rect); text_height = rtgui_rect_height(rect); text_width = rtgui_rect_width(rect); rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); item_width = (image_width + LIST_MARGIN); if (item_width < (text_width + LIST_MARGIN)) item_width = text_width + LIST_MARGIN; item_height = image_height + 8 + text_height + LIST_MARGIN; if (item_width > item_height) item_height = item_width; else item_width = item_height; view->row_items = (rtgui_rect_height(rect) - 2 * LIST_MARGIN) / item_height; view->col_items = (rtgui_rect_width(rect) - 2 * LIST_MARGIN) / item_width; view->page_items = view->row_items * view->col_items; }
void rtgui_notebook_add_image(struct rtgui_notebook* notebook, const char* label, struct rtgui_widget* child, struct rtgui_image *pressed_image, struct rtgui_image *unpressed_image) { rtgui_rect_t rect; RT_ASSERT(notebook != RT_NULL); notebook->count += 1; notebook->childs = (struct rtgui_notebook_tab*) rtgui_realloc(notebook->childs, sizeof(struct rtgui_notebook_tab) * notebook->count); notebook->childs[notebook->count - 1].title = rt_strdup(label); notebook->childs[notebook->count - 1].widget = child; notebook->childs[notebook->count - 1].pressed_image = pressed_image; notebook->childs[notebook->count - 1].unpressed_image = unpressed_image; /* set parent */ rtgui_widget_set_parent(child, RTGUI_WIDGET(notebook)); _rtgui_notebook_get_page_rect(notebook, &rect); rtgui_widget_rect_to_device(RTGUI_WIDGET(notebook), &rect); rtgui_widget_set_rect(child, &rect); if (notebook->count - 1 != notebook->current) rtgui_widget_hide(child); if (RTGUI_WIDGET(notebook)->toplevel != RT_NULL && RTGUI_IS_WIN(RTGUI_WIDGET(notebook)->toplevel)) { struct rtgui_event_update_toplvl eup; RTGUI_EVENT_UPDATE_TOPLVL_INIT(&eup); eup.toplvl = RTGUI_WIDGET(notebook)->toplevel; if (RTGUI_OBJECT(child)->event_handler) RTGUI_OBJECT(child)->event_handler(RTGUI_OBJECT(child), (struct rtgui_event*)&eup); } return; }
/* 创建用于演示label控件的视图 */ rtgui_container_t *demo_view_listctrl(void) { rtgui_rect_t rect; rtgui_container_t *container; rtgui_label_t *label; rtgui_listctrl_t *box; /* 先创建一个演示用的视图 */ container = demo_view("List Control Demo"); if (item_icon == RT_NULL) item_icon = rtgui_image_create_from_mem("xpm", (const rt_uint8_t *)image_xpm, sizeof(image_xpm), RT_TRUE); items[1].image = item_icon; /* 获得视图的位置信息 */ demo_view_get_rect(container, &rect); rect.x1 += 5; rect.x2 -= 5; rect.y1 += 5; rect.y2 = rect.y1 + 20; /* 创建一个label控件 */ label = rtgui_label_create("List Control: "); /* 设置label的位置 */ rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect); /* container是一个container控件,调用add_child方法添加这个label控件 */ rtgui_container_add_child(container, RTGUI_WIDGET(label)); rect.y1 = rect.y2 + 3; rect.y2 = 250; box = rtgui_listctrl_create(items, sizeof(items) / sizeof(items[0]), &rect, _rtgui_listctrl_item_draw); rtgui_listctrl_set_onitem(box, on_items); /* container是一个container控件,调用add_child方法添加这个listctrl控件 */ rtgui_container_add_child(container, RTGUI_WIDGET(box)); return container; }
static void rtgui_textbox_onmouse(struct rtgui_textbox* box, struct rtgui_event_mouse* event) { rt_size_t length; RT_ASSERT(box != RT_NULL); RT_ASSERT(event != RT_NULL); length = rt_strlen((const char*)box->text); if (event->button & RTGUI_MOUSE_BUTTON_LEFT && event->button & RTGUI_MOUSE_BUTTON_DOWN) { rt_int32_t x; /* set caret position */ x = event->x - RTGUI_WIDGET(box)->extent.x1; if (x < 0) { box->position = 0; } else if (x > length * box->font_width) { box->position = length; } else { box->position = x / box->font_width; } /* set caret to show */ box->flag |= RTGUI_TEXTBOX_CARET_SHOW; /* set widget focus */ rtgui_widget_focus(RTGUI_WIDGET(box)); /* re-draw text box */ rtgui_theme_draw_textbox(box); } }
static void create_normal_win(void) { rtgui_rect_t rect = {30, 40, 150, 80}; normal_window = rtgui_win_create(RT_NULL, "普通窗口", &rect, RTGUI_WIN_STYLE_DEFAULT); rect.x1 += 20; rect.x2 -= 5; rect.y1 += 5; rect.y2 = rect.y1 + 20; /* 添加一个文本标签 */ rt_sprintf(normal_window_label_text, "第 %d 次显示", normal_window_show_count); normal_window_label = rtgui_label_create(normal_window_label_text); rtgui_widget_set_rect(RTGUI_WIDGET(normal_window_label), &rect); rtgui_container_add_child(RTGUI_CONTAINER(normal_window), RTGUI_WIDGET(normal_window_label)); rtgui_win_set_onclose(normal_window, normal_window_onclose); }
void main(void) { struct rtgui_app* application; struct rtgui_win* win; application = rtgui_app_create(rt_thread_self(), "filelist"); if (application != RT_NULL) { struct rtgui_rect rect; rtgui_filelist_view_t *view; win = rtgui_mainwin_create(RT_NULL, "filelist", RTGUI_WIN_STYLE_MAINWIN | RTGUI_WIN_STYLE_DESTROY_ON_CLOSE); rtgui_widget_get_extent(RTGUI_WIDGET(win), &rect); view = rtgui_filelist_view_create("/", "*.*", &rect); rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(view)); rtgui_win_show(win, RT_TRUE); rtgui_app_destroy(application); } }
static void _rtgui_progressbar_constructor(rtgui_progressbar_t *bar) { rtgui_rect_t rect = {0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT}; rtgui_object_set_event_handler(RTGUI_OBJECT(bar), rtgui_progressbar_event_handler); rtgui_widget_set_rect(RTGUI_WIDGET(bar), &rect); bar->orient = RTGUI_HORIZONTAL; bar->range = RTGUI_PROGRESSBAR_DEFAULT_RANGE; bar->position = 0; /* set gc */ RTGUI_WIDGET_TEXTALIGN(bar) = RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL; }
rt_bool_t rtgui_combobox_pdwin_onitem(struct rtgui_object* object, struct rtgui_event* event) { struct rtgui_widget *widget; rtgui_win_t* pd_win; rtgui_combobox_t* combo; rtgui_listbox_t* list; RT_ASSERT(object != RT_NULL); widget = RTGUI_WIDGET(object); list = RTGUI_LISTBOX(widget); pd_win = RTGUI_WIN(rtgui_widget_get_toplevel(widget)); combo = RTGUI_COMBOBOX(pd_win->user_data); combo->current_item = list->current_item; if (combo->on_selected != RT_NULL) combo->on_selected(RTGUI_OBJECT(combo), RT_NULL); rtgui_win_hiden(pd_win); rtgui_widget_update(RTGUI_WIDGET(combo)); return RT_FALSE; }
static void rtgui_list_view_onlistdraw(struct rtgui_list_view* view, struct rtgui_dc *dc) { rt_ubase_t index, page_index; rtgui_rect_t rect, item_rect, image_rect; const struct rtgui_list_item* item; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); /* get item base rect */ item_rect = rect; item_rect.y1 += 2; item_rect.y2 = item_rect.y1 + (2 + rtgui_theme_get_selected_height()); /* get current page */ page_index = (view->current_item / view->page_items) * view->page_items; for (index = 0; index < view->page_items; index ++) { if (page_index + index >= view->items_count) break; item = &(view->items[page_index + index]); if (page_index + index == view->current_item) { rtgui_theme_draw_selected(dc, &item_rect); } item_rect.x1 += LIST_MARGIN; if (item->image != RT_NULL) { /* blit on center */ image_rect.x1 = 0; image_rect.y1 = 0; image_rect.x2 = item->image->w; image_rect.y2 = item->image->h; rtgui_rect_moveto_align(&item_rect, &image_rect, RTGUI_ALIGN_CENTER_VERTICAL); rtgui_image_blit(item->image, dc, &image_rect); item_rect.x1 += item->image->w + 2; } /* draw text */ rtgui_dc_draw_text(dc, item->name, &item_rect); if (item->image != RT_NULL) item_rect.x1 -= (item->image->w + 2); item_rect.x1 -= LIST_MARGIN; /* move to next item position */ item_rect.y1 += (rtgui_theme_get_selected_height() + 2); item_rect.y2 += (rtgui_theme_get_selected_height() + 2); } }
void rtgui_list_view_ondraw(struct rtgui_list_view* view) { struct rtgui_rect rect; struct rtgui_dc* dc; dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view)); if (dc == RT_NULL) return; rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect); rtgui_dc_fill_rect(dc, &rect); switch (view->flag) { case RTGUI_LIST_VIEW_LIST: rtgui_list_view_onlistdraw(view, dc); break; case RTGUI_LIST_VIEW_ICON: rtgui_list_view_onicondraw(view, dc); break; } rtgui_dc_end_drawing(dc); }
rt_uint32_t _rtgui_scrollbar_get_length(rtgui_scrollbar_t *bar) { rtgui_rect_t rect; rt_uint32_t result; rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect); if(bar->orient & RTGUI_VERTICAL) result = rtgui_rect_height(rect) - 2*rtgui_rect_width(rect) - bar->thumb_len; else result = rtgui_rect_width(rect) - 2*rtgui_rect_height(rect) - bar->thumb_len; return result; }
void rtgui_scrollbar_hide(rtgui_scrollbar_t* bar) { rtgui_rect_t rect; struct rtgui_dc* dc; RT_ASSERT(bar != RT_NULL); /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(bar)); if(dc == RT_NULL)return; RTGUI_WIDGET_HIDE(bar); /* begin drawing */ rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect); if((RTGUI_WIDGET(bar))->parent != RT_NULL) RTGUI_DC_BC(dc) = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(bar)->parent); else RTGUI_DC_BC(dc) = RTGUI_RGB(225, 228, 220); rtgui_dc_fill_rect(dc,&rect); rtgui_dc_end_drawing(dc); }
static void rtgui_edit_get_caret_rect(struct rtgui_edit *edit, rtgui_rect_t *rect, rtgui_point_t visual) { RT_ASSERT(edit != RT_NULL); rtgui_widget_get_rect(RTGUI_WIDGET(edit), rect); rect->x1 += visual.x * edit->font_width + RTGUI_WIDGET_BORDER_SIZE(edit) + edit->margin; rect->x2 = rect->x1+2; /* caret width: 1 */ rect->y1 += visual.y * edit->item_height + RTGUI_WIDGET_BORDER_SIZE(edit) + edit->margin; if((rect->y1 + edit->font_height) < (rect->y2 - RTGUI_WIDGET_BORDER_SIZE(edit) - edit->margin)) rect->y2 = rect->y1 + edit->font_height; else rect->y2 = rect->y2 - RTGUI_WIDGET_BORDER_SIZE(edit) - edit->margin; }
struct rtgui_panel* program_create(struct rtgui_panel* panel) { int i = 0; struct rtgui_rect rect; RT_ASSERT(panel != RT_NULL); rtgui_widget_get_extent(RTGUI_WIDGET(panel), &rect); items = (struct rtgui_list_item *) rtgui_malloc((ITEM_MAX) * sizeof(struct rtgui_list_item)); for(i=0; i< ITEM_MAX; i++) items[i].action = exec_app; /* create application list */ rtgui_rect_inflate(&rect, -15); scan_app_dir(APP_PATH); if(pos >= 0) { _view = rtgui_list_view_create(items, pos + 1, &rect, RTGUI_LIST_VIEW_ICON); rtgui_container_add_child(RTGUI_CONTAINER(panel), RTGUI_WIDGET(_view)); } return RTGUI_PANEL(panel); }
static void picture_show_next() { DIR* dir; struct dirent* entry; rt_bool_t found, has_image; found = RT_FALSE; has_image = RT_FALSE; __restart: dir = opendir(PICTURE_DIR); if (dir == RT_NULL) { rt_kprintf("open directory failed\n"); return; } do { entry = readdir(dir); if (entry != RT_NULL) { if (strstr(entry->d_name, ".hdc") != RT_NULL || strstr(entry->d_name, ".HDC") != RT_NULL) { /* this directory includes image */ has_image = RT_TRUE; if (found == RT_TRUE || current_fn[0] == '\0') { strcpy(current_fn, entry->d_name); rtgui_widget_update(RTGUI_WIDGET(picture_view)); closedir(dir); return; } /* it's a HDC image */ if (strcmp(entry->d_name, current_fn) == 0) found = RT_TRUE; } } } while(entry != RT_NULL); /* close directory */ closedir(dir); if (has_image != RT_TRUE) return; current_fn[0] = '\0'; goto __restart; }
/* select a station from list */ struct station_item* station_list_select(struct station_list* list, struct rtgui_workbench* workbench) { rt_size_t index; rtgui_rect_t rect; rtgui_list_view_t *view; struct rtgui_list_item* items; struct station_item* station; char exit_str[] = "их╗п.."; RT_ASSERT(list != RT_NULL); RT_ASSERT(workbench != RT_NULL); station = RT_NULL; items = (struct rtgui_list_item*) rt_malloc (sizeof(struct rtgui_list_item) * (list->count + 1)); if (items == RT_NULL) return RT_NULL; /* no memory */ /* create view */ rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); view = rtgui_list_view_create(items, list->count + 1, &rect, RTGUI_LIST_VIEW_LIST); items[0].image = RT_NULL; items[0].action = station_list_selected; items[0].name = exit_str; items[0].parameter = view; for (index = 1; index < list->count + 1; index ++) { items[index].image = RT_NULL; items[index].action = station_list_selected; items[index].name = list->items[index - 1].title; items[index].parameter = view; } /* add view to workbench */ rtgui_workbench_add_view(workbench, RTGUI_VIEW(view)); /* show view as modal */ if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK) { station = &list->items[view->current_item - 1]; } /* destroy view */ rtgui_list_view_destroy(view); /* release items */ rt_free(items); return station; }
void rtgui_workbench_destroy(rtgui_workbench_t* workbench) { RT_ASSERT(workbench != RT_NULL); if (workbench->flag & RTGUI_WORKBENCH_FLAG_CLOSED) { rtgui_widget_destroy(RTGUI_WIDGET(workbench)); } else { /* just close workbench */ rtgui_workbench_close(workbench); } }
void rtgui_theme_draw_staticline(struct rtgui_staticline* staticline) { struct rtgui_dc* dc; struct rtgui_rect rect; /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(staticline)); if (dc == RT_NULL) return ; rtgui_widget_get_rect(RTGUI_WIDGET(staticline), &rect); rtgui_dc_fill_rect(dc, &rect); if (staticline->orient == RTGUI_HORIZONTAL) { rtgui_dc_draw_horizontal_line(dc, rect.x1, rect.x2, rect.y1); } else { rtgui_dc_draw_vertical_line(dc, rect.x1, rect.y1, rect.y2); } rtgui_dc_end_drawing(dc); }
rtgui_scrollbar_t* rtgui_scrollbar_create(rtgui_container_t *container,int left,int top,int w,int len,int orient) { rtgui_scrollbar_t* bar; RT_ASSERT(container != RT_NULL); bar = (rtgui_scrollbar_t *)rtgui_widget_create(RTGUI_SCROLLBAR_TYPE); if(bar != RT_NULL) { rtgui_rect_t rect; rtgui_widget_get_rect(RTGUI_WIDGET(container), &rect); rtgui_widget_rect_to_device(RTGUI_WIDGET(container),&rect); rect.x1 += left; rect.y1 += top; bar->thumb_w = w; if(orient == RTGUI_VERTICAL) { rect.x2 = rect.x1+w; rect.y2 = rect.y1+len; } else { rect.x2 = rect.x1+len; rect.y2 = rect.y1+w; } rtgui_widget_set_rect(RTGUI_WIDGET(bar), &rect); bar->orient = orient; rtgui_container_add_child(container, RTGUI_WIDGET(bar)); } return bar; }
static rt_bool_t rtgui_combobox_onmouse_button(struct rtgui_combobox* box, struct rtgui_event_mouse* event) { struct rtgui_rect rect; /* get widget rect */ rect = RTGUI_WIDGET(box)->extent; /* move to the pull down button */ rect.x1 = rect.x2 - RTGUI_COMBOBOX_BUTTON_WIDTH; if (rtgui_rect_contains_point(&rect, event->x, event->y) == RT_EOK) { /* handle mouse button on pull down button */ if (event->button & RTGUI_MOUSE_BUTTON_LEFT && event->button & RTGUI_MOUSE_BUTTON_DOWN) { box->pd_pressed = RT_TRUE; rtgui_widget_update(RTGUI_WIDGET(box)); } else if (event->button & RTGUI_MOUSE_BUTTON_LEFT && event->button & RTGUI_MOUSE_BUTTON_UP) { box->pd_pressed = RT_FALSE; rtgui_widget_update(RTGUI_WIDGET(box)); /* pop pull down window */ if (box->pd_win == RT_NULL) { rtgui_listbox_t *list; /* create pull down window */ rect = RTGUI_WIDGET(box)->extent; rect.y1 = rect.y2; rect.y2 = rect.y1 + 5 * (2 + rtgui_theme_get_selected_height()); box->pd_win = rtgui_win_create(RT_NULL, "combo", &rect, RTGUI_WIN_STYLE_NO_TITLE); rtgui_win_set_ondeactivate(RTGUI_WIN(box->pd_win), rtgui_combobox_pulldown_hide); /* set user data to parent combobox */ box->pd_win->user_data = (rt_uint32_t)box; /* create list box */ rtgui_rect_inflate(&rect, -1); list = rtgui_listbox_create(box->items, box->items_count, &rect); rtgui_container_add_child(RTGUI_CONTAINER(box->pd_win), RTGUI_WIDGET(list)); rtgui_widget_focus(RTGUI_WIDGET(list)); rtgui_listbox_set_onitem(list, rtgui_combobox_pdwin_onitem); rtgui_win_set_ondeactivate(box->pd_win, rtgui_combobox_pdwin_ondeactive); } /* show combo box pull down window */ rtgui_win_show(RTGUI_WIN(box->pd_win), RT_FALSE); } return RT_TRUE; } return RT_FALSE; }
static rt_bool_t picture_view_event_handler(rtgui_object_t *object, rtgui_event_t *event) { if (event->type == RTGUI_EVENT_PAINT) { struct rtgui_dc* dc; struct rtgui_rect rect; struct rtgui_image* image = RT_NULL; char fn[32]; dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(object)); if (dc == RT_NULL) return RT_FALSE; rtgui_widget_get_rect(RTGUI_WIDGET(object), &rect); /* open image */ rt_snprintf(fn, sizeof(fn), "%s/%s", PICTURE_DIR, current_fn); rt_kprintf("pic fn: %s\n", fn); image = rtgui_image_create(fn, RT_FALSE); if (image != RT_NULL) { /* blit image */ rtgui_image_blit(image, dc, &rect); /* destroy image */ rtgui_image_destroy(image); } else { rtgui_dc_fill_rect(dc, &rect); rtgui_dc_draw_text(dc, "没有文件被打开", &rect); } rtgui_dc_end_drawing(dc); return RT_FALSE; } return rtgui_win_event_handler(object, event); }
static rt_bool_t rtgui_form_event_handler(struct rtgui_widget *widget, struct rtgui_event *event) { struct rtgui_form* form; //struct rtgui_event_command* ecmd; form = RTGUI_FORM(widget); switch (event->type) { case RTGUI_EVENT_PAINT: rtgui_form_ondraw(form); break; #if 0 case RTGUI_EVENT_COMMAND: ecmd = (struct rtgui_event_command*)event; switch (ecmd->command_id) { case SE_FORM_UPDATE: if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(se_form))) rtgui_widget_update(RTGUI_WIDGET(se_form)); break; case RE_FORM_UPDATE: rtgui_widget_update(RTGUI_WIDGET(re_form)); break; case SYS_FORM_UPDATE: rtgui_widget_update(RTGUI_WIDGET(sys_form)); break; } break; #endif default: /* use form event handler */ return rtgui_widget_event_handler(widget, event); } return RT_FALSE; }
/* 关闭对话框时的回调函数 */ void diag_close(struct rtgui_timer *timer, void *parameter) { cnt --; rt_sprintf(label_text, "closed then %d second!", cnt); /* 设置标签文本并更新控件 */ rtgui_label_set_text(label, label_text); rtgui_widget_update(RTGUI_WIDGET(label)); if (cnt == 0) { /* 超时,关闭对话框 */ rtgui_win_destroy(autowin); } }
static rt_bool_t rtgui_menu_on_deactivate(rtgui_widget_t* widget, rtgui_event_t* event) { rtgui_menu_t* menu = (rtgui_menu_t*) widget; if (menu->parent_menu != RT_NULL) { /* whether click on parent menu */ if (rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_TRUE && menu->parent_menu->items[menu->parent_menu->items_list->current_item].submenu == (struct rtgui_menu_item_t *)menu->items) return RT_TRUE; } /* submenu is activate */ if (menu->items[menu->items_list->current_item].type == RTGUI_ITEM_SUBMENU) { /* if sub menu activated, not hide menu */ if (menu->sub_menu != RT_NULL && rtgui_win_is_activated(RTGUI_WIN(menu->sub_menu)) == RT_TRUE) return RT_TRUE; } rtgui_win_hiden(RTGUI_WIN(menu)); if (menu->on_menuhide != RT_NULL) { menu->on_menuhide(RTGUI_WIDGET(menu), RT_NULL); } /* if it's a submenu, try to hide parent menu */ if (menu->parent_menu != RT_NULL && rtgui_win_is_activated(RTGUI_WIN(menu->parent_menu)) == RT_FALSE) { rtgui_menu_on_deactivate(RTGUI_WIDGET(menu->parent_menu), event); } return RT_TRUE; }
void setting_ui(rtgui_workbench_t* workbench) { rtgui_rect_t rect; father_workbench = workbench; /* add function view */ rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); function_view = rtgui_list_view_create(function_list, sizeof(function_list) / sizeof(struct rtgui_list_item), &rect, RTGUI_LIST_VIEW_LIST); rtgui_workbench_add_view(workbench, RTGUI_VIEW(function_view)); rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE); }
static rt_bool_t rtgui_win_ondraw(struct rtgui_win* win) { struct rtgui_dc* dc; struct rtgui_rect rect; struct rtgui_event_paint event; /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(win)); if (dc == RT_NULL) return RT_FALSE; /* get window rect */ rtgui_widget_get_rect(RTGUI_WIDGET(win), &rect); /* fill area */ rtgui_dc_fill_rect(dc, &rect); /* paint each widget */ RTGUI_EVENT_PAINT_INIT(&event); event.wid = RT_NULL; rtgui_container_dispatch_event(RTGUI_CONTAINER(win), (rtgui_event_t*)&event); rtgui_dc_end_drawing(dc); return RT_FALSE; }
void rtgui_win_hiden(struct rtgui_win* win) { RT_ASSERT(win != RT_NULL); if (!RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(win)) && RTGUI_TOPLEVEL(win)->server != RT_NULL) { /* send hidden message to server */ struct rtgui_event_win_hide ehide; RTGUI_EVENT_WIN_HIDE_INIT(&ehide); ehide.wid = win; if (rtgui_thread_send_sync(RTGUI_TOPLEVEL(win)->server, RTGUI_EVENT(&ehide), sizeof(struct rtgui_event_win_hide)) != RT_EOK) { rt_kprintf("hide win: %s failed\n", win->title); return; } /* set window hide and deactivated */ RTGUI_WIDGET_HIDE(RTGUI_WIDGET(win)); win->style &= ~RTGUI_WIN_STYLE_ACTIVATE; } }
/* 控件绘图函数 */ static void rtgui_mywidget_ondraw(struct rtgui_mywidget* me) { struct rtgui_dc* dc; struct rtgui_rect rect; rt_uint16_t x, y; /* 获得目标DC,开始绘�?*/ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(me)); if (dc == RT_NULL) return; /* 获得窗口的尺�?*/ rtgui_widget_get_rect(RTGUI_WIDGET(me), &rect); /* 绘制背景�?*/ RTGUI_DC_BC(dc) = white; rtgui_dc_fill_rect(dc, &rect); /* 计算中心原点 */ x = (rect.x2 + rect.x1)/2; y = (rect.y2 + rect.y1)/2; /* 绘制十字�?*/ RTGUI_DC_FC(dc) = black; rtgui_dc_draw_hline(dc, rect.x1, rect.x2, y); rtgui_dc_draw_vline(dc, x, rect.y1, rect.y2); /* 根据状态绘制圆�?*/ if (me->status == MYWIDGET_STATUS_ON) RTGUI_DC_FC(dc) = green; else RTGUI_DC_FC(dc) = red; rtgui_dc_fill_circle(dc, x, y, 5); /* 结束绘图 */ rtgui_dc_end_drawing(dc); return; }
rt_bool_t rtgui_plot_onmvmodel(struct rtgui_plot *plot, struct rtgui_event *event) { struct rtgui_event_mv_model *emodel = (struct rtgui_event_mv_model *)event; RT_ASSERT(plot); RT_ASSERT(event); switch (plot->ptype) { case RTGUI_PLOT_TYPE_SCAN: _rtgui_plot_update_scale(plot); rtgui_plot_ondraw(plot, event); case RTGUI_PLOT_TYPE_INCREMENTAL: { rt_uint16_t old_sc_x = plot->scale_x; rt_uint16_t old_sc_y = plot->scale_y; _rtgui_plot_update_scale(plot); if (old_sc_x != plot->scale_x || old_sc_y != plot->scale_y) { /* we need to repaint the whole widget as the scale changed. */ rtgui_plot_ondraw(plot, event); } else { /* get dc for _rtgui_plot_curve_onpaint */ struct rtgui_dc *dc; dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(plot)); if (dc == RT_NULL) return RT_FALSE; /* only draw the newly recieved data */ _rtgui_plot_curve_onpaint(dc, plot, RTGUI_PLOT_CURVE(emodel->model), emodel->first_data_changed_idx, emodel->last_data_changed_idx + 1); rtgui_dc_end_drawing(dc); } } return RT_TRUE; default: RT_ASSERT(0); } return RT_TRUE; }