列表视图调用另一个视图不成功
我用一个列表视图调用另一个视图就是没有变化,搞两个星期了。本人很菜,有高人指点下:我先这样写:
#include <rtthread.h>
#include <rtgui.h>
#include <list_view.h>
#include <rtgui_server.h>
#include <rtgui_system.h>
#include <workbench.h>
static struct rtgui_view* view;
static struct rtgui_view* drawpad_view;
static struct rtgui_list_view* function_view;
static struct rtgui_workbench* workbench;
static void workbench_info_ui(void* parameter)
{
rt_mq_t mq;
/* 创建GUI应用需要的消息队列 */
mq = rt_mq_create("wmq1", 256, 4, RT_IPC_FLAG_FIFO);
/* 注_册当前线程为GUI线程 */
rtgui_thread_register(rt_thread_self(), mq);
/* 创建一个工作台 */
workbench = rtgui_workbench_create("info", "workbench #1");
if(workbench == RT_NULL) return;
/* 创建一个视图 */
view = rtgui_view_create("view1");
if(view == RT_NULL) return;
/* 指定视图的背景色 */
RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = light_grey;
/* 在工作台上添加一个视图 */
rtgui_workbench_add_view(workbench, view);
/* 非模式方式显示视图 */
rtgui_view_show(view, RT_FALSE);
/* 执行工作台事件循环 */
rtgui_workbench_event_loop(workbench);
/* 去注_册GUI线程 */
rtgui_thread_deregister(rt_thread_self());
/* delete message queue */
rt_mq_delete(mq);
}
void function_sketchpad(struct rtgui_widget* widget, void* paramter)
{
rtgui_workbench_remove_view(workbench, RTGUI_VIEW(function_view));
rtgui_view_destroy(RTGUI_VIEW(function_view));
function_view = RT_NULL;
drawpad_view = rtgui_view_create("sketchpad_view");
/* 指定视图的背景色 */
RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(drawpad_view)) = black;
RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(drawpad_view)) = white ;
/* this view can be focused */
RTGUI_WIDGET(drawpad_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* 添加到父workbench中 */
rtgui_workbench_add_view(workbench, drawpad_view);
/* 非模式方式显示视图 */
rtgui_view_show(drawpad_view, RT_FALSE);
}
void function_action(void* parameter)
{
return;
}
static const struct rtgui_list_item function_list[] =
{
{"列表1", RT_NULL, function_action, RT_NULL},
{"列表2", RT_NULL, function_sketchpad, RT_NULL},
{"列表3", RT_NULL, function_action, RT_NULL},
{"列表4", RT_NULL, function_action, RT_NULL},
{"列表5", RT_NULL, function_action, RT_NULL},
{"列表6", RT_NULL, function_action, RT_NULL},
};
static void workbench_main_ui(void* parameter)
{
rt_mq_t mq;
rtgui_rect_t rect;
/* 创建GUI应用需要的消息队列 */
mq = rt_mq_create("wmq2", 256, 4, RT_IPC_FLAG_FIFO);
/* 注_册当前线程为GUI线程 */
rtgui_thread_register(rt_thread_self(), mq);
/* 创建一个工作台 */
workbench = rtgui_workbench_create("main", "workbench #2");
if(workbench == RT_NULL) return;
/* add function view */
rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect);
/* 创建一个例表视图 */
function_view = rtgui_list_view_create(function_list, 6, &rect, RTGUI_LIST_VIEW_LIST);
/* 指定视图的背景色 */
RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(function_view)) = white;
/* 在工作台上添加一个视图 */
rtgui_workbench_add_view(workbench, RTGUI_VIEW(function_view));
/* 非模式方式显示视图 */
rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE);
/* 执行工作台事件循环 */
rtgui_workbench_event_loop(workbench);
/* 去注_册GUI线程 */
rtgui_thread_deregister(rt_thread_self());
/* delete message queue */
rt_mq_delete(mq);
}
/* 初始化两个workbench,分别位于info,panel2和panel3 */
void workbench_init()
{
rt_thread_t info_tid, main_tid;
info_tid = rt_thread_create("wb1", workbench_info_ui, RT_NULL, 1024, 20, 5);
if(info_tid != RT_NULL) rt_thread_startup(info_tid);
main_tid = rt_thread_create("wb2", workbench_main_ui, RT_NULL, 1024, 20, 5);
if(main_tid != RT_NULL) rt_thread_startup(main_tid);
}
extern void rt_hw_lcd_init(void);
void rtgui_init(void *p)
{
rtgui_rect_t rect;
/* 初始化RT-Thread/GUI server */
rtgui_system_server_init();
/* 注_册面板1 */
rect.x1 = 0;
rect.y1 = 0;
rect.x2 = 240;
rect.y2 = 24;
/* 注_册区域, 名字,以及位置 */
rtgui_panel_register("info", &rect);
/* 注_册面板2 */
rect.x1 = 0;
rect.y1 = 24;
rect.x2 = 240;
rect.y2 = 320;
/* 注_册区域, 名字,以及位置 */
rtgui_panel_register("main", &rect);
rtgui_panel_set_default_focused("main");
/* 初始化LCD驱动 */
rt_hw_lcd_init();
/* 初始化workbench应用 */
workbench_init();
}
/*@}*/
这是key:
#include "stm32f10x.h"
#include <rtthread.h>
#include <event.h>
#include <rtgui_server.h>
#define key_down_GETVALUE() GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define key_up_GETVALUE() GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define key_enter_GETVALUE() GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
static void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
static void key_thread_entry(void *parameter)
{
rt_time_t next_delay;
struct rtgui_event_kbd kbd_event;
GPIO_Configuration();
/* init keyboard event */
RTGUI_EVENT_KBD_INIT(&kbd_event);
kbd_event.mod= RTGUI_KMOD_NONE;
kbd_event.unicode = 0;
while (1)
{
next_delay = RT_TICK_PER_SECOND/10;
kbd_event.key = RTGUIK_UNKNOWN;
kbd_event.type = RTGUI_KEYDOWN;
if(key_down_GETVALUE() == 0)
{
kbd_event.key= RTGUIK_DOWN;
}
if ( key_up_GETVALUE() == 0 )
{
kbd_event.key = RTGUIK_UP;
}
if(key_enter_GETVALUE() == 0)
{
kbd_event.key = RTGUIK_KP_ENTER;
}
if (kbd_event.key != RTGUIK_UNKNOWN)
{
/* post down event */
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
//next_delay = RT_TICK_PER_SECOND/10;
/* delay to post up event */
rt_thread_delay(next_delay);
/* post up event */
kbd_event.type = RTGUI_KEYUP;
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
}
/* wait next key press */
rt_thread_delay(next_delay);
}
}
static rt_thread_t key_tid;
void rt_hw_key_init(void)
{
key_tid = rt_thread_create("key", key_thread_entry, RT_NULL, 384, 30, 5);
if(key_tid != RT_NULL) rt_thread_startup(key_tid);
}
/*@}*/
第一个页面出来了,且按上下按键能够上下移动。但按回车键,页面不变。
改成(列表内容与之对应)
void function_sketchpad1(struct rtgui_widget* widget, void* paramter)
{
rt_kprintf("列表1\n");
}
void function_sketchpad2(struct rtgui_widget* widget, void* paramter)
{
rt_kprintf("列表2\n");
}
、、、、、、
按下回车键串口无输出!有高人指点下呗,多谢 void function_action(void* parameter)
{
return;
}
这个函数的入口参数是错的;
我这边能够更改,可以显示出(为了显示清晰,我加了个label):
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_670586UI0BFS.jpg
(原文件名:change_view.jpg) mark
页:
[1]