awtk/docs/faq.md
2019-03-04 12:01:32 +08:00

3.7 KiB
Raw Blame History

FAQ

1.return_value_if_fail作为AWTK中使用率排第一的宏它的功能、优点和注意事项都有哪些

功能

  • 主要用于对函数的参数或函数的返回值进行检查(这是防御性编程的手段之一)。

return_value_if_fail这个宏并非是AWTK原创而是从GTK+(或者说glib)里拿来的。

优点

  • 以简洁的方式对函数的参数或函数的返回值进行检查。

  • Release模式和Debug模式可以做不同的处理。

在参数出现错误时悄无声息的返回一个错误码其实是对调用者的纵容很容易把错误隐藏起来。所以在Debug模式我们可以打出一条警告信息甚至直接assert掉这对于定位BUG非常有效。

注意事项

  • 内部函数(static)一般不需要对参数进行检查。
  • 只对异常的情况进行判断,对于正常的失败或无效参数,请不要使用本宏。
  • 如果在返回之前有资源需要释放请不要用本宏。可以用goto_error_if_fail跳到error出释放资源后再返回。

2.每次在绘制图片前都要调用image_manager_load去加载图片这样做会不会很慢有什么优点

  • 不会慢。因为image_manager中有缓存不会每次都去解码。

优点

  • 缓存有助于多个控件共享同一张图片。

  • 外面不保存对bitmap的引用缓存管理更加灵活。比如可以清除最近没有被渲染的图片(即使某个隐藏的窗口还在使用该图片)。


3.使用矢量字体,速度会慢吗?

  • 几乎没有影响。因为有缓存,所以只需要渲染一次,之后和位图字体的并无不同。

4.在16位LCD上显示PNG图片效果很差有什么办法吗

  • 如果是不透明的图片可以将PNG转换成JPG文件转换过程中启用dithering算法做平滑处理。

可以用imagemagic转换

convert bg.png  -ordered-dither o8x8,32,64,32 bg.jpg

参考:http://www.imagemagick.org/Usage/quantize/

5.在Windows平台SVG显示不正常如何解决

原因是Windows下OpenGL不支持非凸多边形所以要解决这个问题需要使用不同的NANOVG_BACKEND。这可以在SConstruct文件中修改。如

#NANOVG_BACKEND='GL3'
#NANOVG_BACKEND='GLES2'
#NANOVG_BACKEND='GLES3'
#NANOVG_BACKEND='AGG'
#NANOVG_BACKEND='AGGE'
NANOVG_BACKEND='BGFX'

在PC上BGFX是推荐的NANOVG_BACKEND但是需要进入3rd/bgfx目录手工下载bgfx相关源码

cd 3rd/bgfx
git clone https://github.com/bkaradzic/bx.git 
git clone https://github.com/bkaradzic/bimg.git 
git clone https://github.com/bkaradzic/bgfx.git

如果您不需要使用SVG仍然可以使用GL3作为NANOVG_BACKEND。

6.有个实体按键,按一下,无论在那个界面都回到主界面,这个功能怎样实现?

基本原理:注册窗口管理器的按键事件,在该事件处理函数中,如果检查到指定的键按下,则请求窗口管理器关闭顶层窗口。具体做法如下:

1.编写事件处理函数。

static ret_t wm_on_key_down(void* ctx, event_t* e) {
  key_event_t* evt = (key_event_t*)e;
  if (evt->key == TK_KEY_ESCAPE) {
    window_manager_request_close_top_window(WIDGET(ctx));
  }

  return RET_OK;
}

2.注册窗口的按键事件处理函数:

widget_on(window_manager(), EVT_KEY_DOWN, wm_on_key_down, window_manager());

3.把主窗口设置为不可关闭:

widget_set_prop_str(win, WIDGET_PROP_CLOSABLE, "no");

请参考完整示例: multi_windows.c

如果在关闭窗口前,需要用户确认,请参考:system_bar.md