这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 合作大赛 » 急,急,非常非常奇怪的问题,关于输入框输出问题!!!

共6条 1/1 1 跳转至

急,急,非常非常奇怪的问题,关于输入框输出问题!!!

菜鸟
2010-10-08 22:50:36     打赏

我想用快速层显示刚刚输入的字符,vre 3.0 实例代码input如下:

void handle_sysevt(VMINT message, VMINT param)

 switch(message)
 {
 case VM_MSG_CREATE:
  screen_width = vm_graphic_get_screen_width();  
  screen_height = vm_graphic_get_screen_height();
  character_height = vm_graphic_get_character_height();
  layer_hdl[0] = vm_graphic_create_layer(0, 0, screen_width, screen_height, -1);
  
  break;
 case VM_MSG_PAINT:
  draw_screen();
  break;
 /* this message will be triggered when call input function */
 case VM_MSG_INACTIVE:      
  vm_graphic_delete_layer(layer_hdl[0]);
  break;
 /* this message will be triggered when come back from input window */
 case VM_MSG_ACTIVE:       
  layer_hdl[0] = vm_graphic_create_layer(0, 0, screen_width, screen_height, -1);
 /* layer_buf[0] = vm_graphic_get_layer_buffer(layer_hdl[0]);*/
  break;
 case VM_MSG_QUIT:
  vm_graphic_delete_layer(layer_hdl[0]);
  vm_exit_app();
  break;
 }
}

input函数和回调就不用说了。

void draw_screen(void)
{
 VMWCHAR w_softkey_text[8];
 VMINT string_width;
 layer_buf[0] = vm_graphic_get_layer_buffer(layer_hdl[0]);
 vm_graphic_fill_rect(layer_buf[0], 0, 0, screen_width, screen_height, VM_COLOR_BLACK, VM_COLOR_BLACK);
 vm_graphic_fill_rect(layer_buf[0], 0, 0, screen_width, screen_height / 2, VM_COLOR_RED, VM_COLOR_WHITE); 
 /*draw input text*/
 draw_text_in_rect(layer_buf[0], w_text, 2, 2, screen_width, screen_height / 2, VM_COLOR_BLACK);
 /*draw soft key*/
 vm_gb2312_to_ucs2(w_softkey_text, 8, softkey_text[0]);
 vm_graphic_textout(layer_buf[0], 2, screen_height - character_height - 2, w_softkey_text, wstrlen(w_softkey_text), VM_COLOR_WHITE);
 vm_gb2312_to_ucs2(w_softkey_text, 8, softkey_text[1]);
 string_width = vm_graphic_get_string_width(w_softkey_text);
 vm_graphic_textout(layer_buf[0], screen_width - string_width - 2, screen_height - character_height - 2, w_softkey_text, wstrlen(w_softkey_text), VM_COLOR_WHITE);
 vm_graphic_flush_layer(layer_hdl, 1);
}

以上是正常的!!!!

但是,问题来了:
我想在快速层上显示该输入的字符串;将handle_sysevt()修改如下:

void handle_sysevt(VMINT message, VMINT param)

 switch(message)
 {
 case VM_MSG_CREATE:
  screen_width = vm_graphic_get_screen_width();  
  screen_height = vm_graphic_get_screen_height();
  character_height = vm_graphic_get_character_height();
  layer_hdl[0] = vm_graphic_create_layer(0, 0, screen_width, screen_height, -1);
  layer_hdl[1] = vm_graphic_create_layer(0, 0, screen_width, screen_height, 0xFFFD);
  break;
 case VM_MSG_PAINT:
  draw_screen();
  break;
 /* this message will be triggered when call input function */
 case VM_MSG_INACTIVE: 
  vm_graphic_delete_layer(layer_hdl[1]);
  vm_graphic_delete_layer(layer_hdl[0]);
  break;
 /* this message will be triggered when come back from input window */
 case VM_MSG_ACTIVE:       
  layer_hdl[0] = vm_graphic_create_layer(0, 0, screen_width, screen_height, -1);
  layer_hdl[1] = vm_graphic_create_layer(0, 0, screen_width, screen_height, 0xFFFD);
  break;
 case VM_MSG_QUIT:
  vm_graphic_delete_layer(layer_hdl[1]);
  vm_graphic_delete_layer(layer_hdl[0]);

  vm_exit_app();
  break;
 }
}


void draw_screen(void)
{
 VMWCHAR w_softkey_text[8];
 VMINT string_width;
 layer_buf[1] = vm_graphic_get_layer_buffer(layer_hdl[1]);//快速层声明
 vm_graphic_fill_rect(layer_buf[1], 0, 0, screen_width, screen_height, VM_COLOR_BLACK, VM_COLOR_BLACK);
 vm_graphic_fill_rect(layer_buf[1], 0, 0, screen_width, screen_height / 2, VM_COLOR_RED, VM_COLOR_WHITE); 
 /*draw input text*/
 draw_text_in_rect(layer_buf[1], w_text, 2, 2, screen_width, screen_height / 2, VM_COLOR_BLACK);//输出到快速层上
 /*draw soft key*/
 vm_gb2312_to_ucs2(w_softkey_text, 8, softkey_text[0]);
 vm_graphic_textout(layer_buf[1], 2, screen_height - character_height - 2, w_softkey_text, wstrlen(w_softkey_text), VM_COLOR_WHITE);
 vm_gb2312_to_ucs2(w_softkey_text, 8, softkey_text[1]);
 string_width = vm_graphic_get_string_width(w_softkey_text);
 vm_graphic_textout(layer_buf[1], screen_width - string_width - 2, screen_height - character_height - 2, w_softkey_text, wstrlen(w_softkey_text), VM_COLOR_WHITE);
 vm_graphic_flush_layer(layer_hdl, 2);//将两层合并在一起刷屏,注意,如果刷一层的话,估计将只刷掉了基层;
}

结果:输进去了,单步运行可以看到输入的东西。但是显示不出来!!!!!!!!
到drawscreen()函数体内,w_text的内容还正常,却显示不出来...........


还有一个问题是:有时候,input输入框,并不能触发inactive这个系统事件。
什么原因?太诡异了............




关键词: 非常     怪的     问题     关于     输入     框输     出问题     scr    

菜鸟
2010-10-09 22:15:07     打赏
2楼
再补充一个问题:

示例代码input中,只输入一次成功。再输入就不行了,单步运行时,发现删除层成功,但是创建层句柄的时候,layer_hdl [0] 一直在变。。。。。导致以后的输入显示不了,,,,vre 本身的问题么?????

求官方解答。。。。

菜鸟
2010-10-11 09:25:42     打赏
3楼
好像在模拟器上是有问题耶~

助工
2010-10-11 19:27:51     打赏
4楼
    不好意思,问一下 draw_text_in_rect  这个API你是在哪里找到的?另外这个函数的功能应该可以用vm_graphic_set_layer_clip 和 vm_graphic_textout混合实现

菜鸟
2010-10-14 21:24:34     打赏
5楼

在例程里面有这个函数的,觉得挺好用,就拿来用了。
void draw_text_in_rect(VMUINT8* buf, VMWCHAR *msg, VMINT x, VMINT y, VMINT width,   VMINT height, VMUINT16 color)
{
 VMWCHAR *tmp = NULL, ch;
 VMINT base = 0, count = 0, row = 0, nrow = 0;
 VMINT ch_height = 0;
 VMINT nword = 0;
 VMINT total = wstrlen(msg);
 
 /* 获取字符高度 */
 ch_height = vm_graphic_get_character_height() + 2;
 nrow = height / ch_height;

 /* 申请临时缓冲区 */
 if ((tmp = (vm_malloc(total << 1))) == NULL)
  return;
 memset(tmp, 0, total * 2);
 
 while (nword <= total)
 {
  ch = msg[base + count];
  /* 字符串结束,跳出循环 */
  if (ch == 0)
   break;
  /* 如果当前字符是换行符,输出当前行 */
  if (ch == '\n' || (ch == '\r' && msg[base + count + 1] != '\n')) //?
  {
   wstrncpy(tmp, msg + base, count);
   vm_graphic_textout(buf, x, y + row * ch_height, tmp, wstrlen(tmp), color);
   tmp[0] = 0;
   base += count;
   count = 0;
   row++;
  }
  /* 如果当前行字符串宽度没有超过指定宽度,继续判断下一个字符,否则输出当前行 */
  if ((vm_graphic_get_string_width(tmp)) <= width - 5)
  {
   count++;
   nword++;
   wstrncpy(tmp, msg + base, count);
  }
  else
  {
   count--;
   nword--;
   wstrncpy(tmp, msg + base, count);
   vm_graphic_textout(buf, x, y + row * ch_height, tmp, wstrlen(tmp), color);
   tmp[0] = 0;
   base += count;
   count = 0;
   row++;
  }
 }

 /* 输出剩余字符 */
 if ((wstrlen(tmp) > 0) && (row < nrow))
 {
  wstrncpy(tmp, msg + base, count);
  vm_graphic_textout(buf, x, y + row * ch_height, tmp, wstrlen(tmp), color);
 }
 
 /* 释放临时缓冲区 */
 if (tmp != NULL)
  vm_free(tmp);
}


助工
2010-10-27 22:13:17     打赏
6楼

对于显示不出来这个问题,是因为你的fastlayer没有设透明度,设了以后自然就可以了~。
或者你可以这样试验

最后一行刷屏幕的改成如下
vm_graphic_flush_layer(&layer_hdl[1],1) //只刷快速层
应该就能看到你的输入了


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]