问题描述:GUI3.0下 单击按钮,按钮会恢复到原来的样子.4.0 下确边框突出了.奇怪
#include "demo_view.h"
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/label.h>
#include <rtgui/widgets/checkbox.h>
#include <rtgui/widgets/window.h>
#include <rtgui/widgets/button.h>
#include <rtgui/widgets/textbox.h>
#define KEYBOARD_BUTTON_HEIGTH 15 //虚拟键盘高
#define KEYBOARD_BUTTON_WIDTH 17 //虚拟键盘宽
#define KEYBOARD_BOARDER 7 //虚拟键盘缩进宽
#define TITLE_HEIGTH 20 //上下标题高
#define SCREEN_WIDTH 240 //屏幕宽
#define SCREEN_HEIGTH 240 //屏幕高
#define STATIC_LINE 2 //static line的宽度
static rtgui_view_t *view1;
static rtgui_checkbox_t* checkbox1;
static rtgui_win_t *keyboard_win;
static rtgui_rect_t rect;
static rtgui_win_t *win1;
/* 虚拟按键事件 */
void btn_input_event1(rtgui_widget_t* widget, rtgui_event_t *event)
{
}
/* 触发无标题窗口显示 */
void create_new_window(rtgui_widget_t* widget, rtgui_event_t *event)
{
int i,j;
char *arrName ="1234567890*ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char btnName;
rtgui_button_t *btnInput[37];
rtgui_toplevel_t *parent;
rtgui_rect_t rect = {0, 0, SCREEN_WIDTH, KEYBOARD_BUTTON_HEIGTH*3};
char key[2];
parent = RTGUI_TOPLEVEL(rtgui_widget_get_toplevel(widget));
rtgui_rect_moveto(&rect, 0, (SCREEN_HEIGTH-TITLE_HEIGTH-STATIC_LINE-KEYBOARD_BUTTON_HEIGTH*3));
/* 创建一个窗口,风格为无标题及无边框 */
keyboard_win = rtgui_win_create(parent,
"keyboard", &rect, RTGUI_WIN_STYLE_NO_TITLE | RTGUI_WIN_STYLE_NO_BORDER);
for ( i = 0; i < 37; i++ )
{
switch (i)
{
case 0:
rect.x1 = KEYBOARD_BOARDER;
rect.y2 = SCREEN_HEIGTH-TITLE_HEIGTH-STATIC_LINE-KEYBOARD_BUTTON_HEIGTH*2;
rect.x2 = KEYBOARD_BOARDER+KEYBOARD_BUTTON_WIDTH;
rect.y1 = rect.y2 - KEYBOARD_BUTTON_HEIGTH;
j=1;
break;
case 11:
rect.x1 = KEYBOARD_BOARDER;
rect.y2 = SCREEN_HEIGTH-TITLE_HEIGTH-STATIC_LINE-KEYBOARD_BUTTON_HEIGTH; //第2行y的bottom坐标
rect.x2 = KEYBOARD_BOARDER+KEYBOARD_BUTTON_WIDTH;
rect.y1 = rect.y2 - KEYBOARD_BUTTON_HEIGTH;
j=2;
break;
case 24:
rect.x1 = KEYBOARD_BOARDER;
rect.y2 = SCREEN_HEIGTH-TITLE_HEIGTH-STATIC_LINE; //第3行y的bottom坐标
rect.x2 = KEYBOARD_BOARDER+KEYBOARD_BUTTON_WIDTH;
rect.y1 = rect.y2 - KEYBOARD_BUTTON_HEIGTH;
j=3;
break;
default:
switch (j)
{
case 1:
if (arrName*=='*')
{
rect.x1 = rect.x2;
rect.x2 += KEYBOARD_BUTTON_WIDTH*3;
}
else
{
rect.x1 = rect.x2;
rect.x2 += KEYBOARD_BUTTON_WIDTH;
}
break;
case 2:
rect.x1 = rect.x2;
rect.x2 += KEYBOARD_BUTTON_WIDTH;
break;
case 3:
rect.x1 = rect.x2;
rect.x2 += KEYBOARD_BUTTON_WIDTH;
break;
default:
break;
}
}
/* 创建按钮*/
if (arrName*=='*')
{
btnInput* = rtgui_button_create("删 除");
}
else
{
btnName = arrName*;
key[0] = btnName;
key[1] = '�';
btnInput* = rtgui_button_create(&key[0]);
}
/* 设置onbutton事件为btn_input_event函数 */
rtgui_button_set_onbutton(btnInput*, btn_input_event1);
/* 设置button的位置*/
rtgui_widget_set_rect(RTGUI_WIDGET(btnInput*), &rect);
/* 调用add_child方法添加这个button控件 */
rtgui_container_add_child(RTGUI_CONTAINER(keyboard_win), RTGUI_WIDGET(btnInput*));
}
/* 非模态显示窗口 */
rtgui_win_show(keyboard_win, RT_FALSE);
}
rtgui_view_t *test_wind(rtgui_workbench_t* workbench)
{
rtgui_button_t *button;
rtgui_textbox_t* text;
rtgui_rect_t widget_rect;
view1 = demo_view(workbench, "test");
demo_view_get_rect(view1, &widget_rect);
widget_rect.x1 += 5;
widget_rect.x2 = widget_rect.x1 + 100;
widget_rect.y1 += 5;
widget_rect.y2 = widget_rect.y1 + 20;
button = rtgui_button_create("窗口");
rtgui_widget_set_rect(RTGUI_WIDGET(button), &widget_rect);
rtgui_container_add_child(RTGUI_CONTAINER(view1), RTGUI_WIDGET(button));
rtgui_button_set_onbutton(button, create_new_window);
return view1;
}
临时性的解决方法:
把rtgui_dc_begin_drawing函数修改成如下,即先拿掉Hardware DC的支持:
struct rtgui_dc* rtgui_dc_begin_drawing(rtgui_widget_t* owner)
{
RT_ASSERT(owner != RT_NULL);
#if 0
if ((rtgui_region_is_flat(&owner->clip) == RT_EOK) &&
rtgui_rect_is_equal(&(owner->extent), &(owner->clip.extents)) == RT_EOK)
{
/* use hardware DC */
return rtgui_dc_hw_create(owner);
}
#endif
return rtgui_dc_client_create(owner);
}