QNX screen使用介绍 第三章

5 篇文章 14 订阅

六、screen 创建子窗口

如果一个窗口属于另外一个窗口的一个组件,那么可以将此窗口创建为子窗口,子窗口会继承父窗口的大部分属性,同时也可以单独设置其属性。父窗口隐藏或退出,子窗口也会跟随父窗口,这个可以保证应用的各个组件可以同步操作。

  • 以字符串形式检索窗口ID,以便子窗口可以使用它来加入此窗口的组。SCREEN_PROPERTY_ID属性能保证获取的窗口ID该系统中是唯一的 
char window_group_name[64];

screen_get_window_property_cv(screen_window, SCREEN_PROPERTY_ID, sizeof(window_group_name), window_group_name );
  •  创建一个子窗口
screen_window_t screen_child_window;

int wintype = SCREEN_CHILD_WINDOW; 

screen_create_window_type(&screen_child_window, screen_ctx, wintype );
  • 加入父窗口组 
 screen_join_window_group(screen_child_window,window_group_name);

 

七、创建内部缓冲区

  • 创建一个内部缓冲区, 需要指定创建buffers的数量 
int num_bufs = 1;

screen_create_window_buffers(screen_window, num_bufs);
  • 设置buffers数据格式 
int format = SCREEN_FORMAT_RGBA8888;

screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_FORMAT, &format);
  • 设置buffers大小 
int bsize = {1920,1080};

screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_BUFFER_SIZE,  bsize);
  • 设置stride 
 int stride = bsize[0] * bpp / 8;
 
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_STRIDE, &stride);
  • 设置offset, 如果是YUV planar格式,例如NV12,需要设置此属性 
 int offset[3]; offset[0] = 0; offset[1] = bsize[1] * stride; offect[2] = -1;
 
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_STRIDE, &stride);

八、创建外部缓冲区

使用外部缓冲区,context必须使用SCREEN_BUFFER_PROVIDER_CONTEXT标志

  • 设置需要创建的buffers的数量,用于缓存
#define MAX_BUFS_CNT 6
int buf_idx = 0;
int bufs_cnt = MAX_BUFS_CNT;

for(buf_idx =0; buf_idx < bufs_cnt; buf_idx++)
{
     … …
}
  • 创建一个缓冲区句柄,可以将其附加到窗口或像素图上
screen_buffer_t screen_bufs;

screen_create_buffer(screen_bufs[buf_idx]);
  •  设置buffers数据格式
 int format = SCREEN_FORMAT_RGBA8888;
 
 screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_FORMAT, &format);
  •  设置buffers size
int bsize = {1920,1080};

screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_BUFFER_SIZE,  bsize);
  • 设置stride 
int stride = bsize[0] * bpp / 8;

screen_set_buffer_property_iv(screen_bufs, SCREEN_PROPERTY_STRIDE, &stride);
  • 设置buffer 大小 
int buf_capacity = stride * bsize[1];

screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_SIZE,  &buf_capacity);
  • 设置offset, 如果是YUV planar格式,例如NV12,需要设置此属性 
 int offset[3]; offset[0] = 0; offset[1] = bsize[1] * stride; offect[2] = -1;
 
 screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_STRIDE, &offset);
  •  根据外部传入的物理地址获取虚拟地址
 unsigned *vaddr[MAX_BUFS_CNT];
 
 vaddr[buf_idx] = mmap_device_memory(0, attr->buf_capacity, PROT_READ | PROT_WRITE, 0, phyaddr[buf_idx]);
  •  screenbuf指针指向外部缓冲区
 screen_set_buffer_property_pv(screen_bufs[buf_idx], SCREEN_PROPERTY_POINTER, (void **)&vaddr[buf_idx]);
  •  将缓冲区与窗口关联
 screen_attach_window_buffers(screen_window, MAX_BUFS_CNT, screen_bufs);

 

 

九、screen post windows

  •  在显示屏上刷新窗口内容
 int rects[4] = {0, 0, 1920, 1080};
 
 int count = 1;
 
 screen_post_window(screen_window, screen_bufs[idx],  count, rects, SCREEN_WAIT_IDLE);

rects中包含一个窗口矩形的x,y 坐标,宽度和高度。注意xy坐标是相对坐标,相对与窗口的偏移位置

例如已经调用了screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_POSITION, pos);设置了窗口位置,那么此时xy坐标应该是相对与这个pos的位置。 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的 QNX Screen 使用范例,用于创建一个窗口并显示一段文本: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <screen/screen.h> int main(int argc, char **argv) { // 创建屏幕上下文 screen_context_t context; screen_create_context(&context, 0); // 创建屏幕窗口 screen_window_t window; screen_create_window(&window, context); // 设置窗口大小和位置 int size[2] = {640, 480}; int pos[2] = {0, 0}; screen_set_window_property_iv(window, SCREEN_PROPERTY_SIZE, size); screen_set_window_property_iv(window, SCREEN_PROPERTY_POSITION, pos); // 将窗口提交到屏幕显示 screen_post_window(window, context, 0); // 显示文本 char *text = "Hello, QNX Screen!"; int len = strlen(text); int font_size = 24; int text_color[4] = {255, 255, 255, 255}; int bg_color[4] = {0, 0, 0, 255}; int text_pos[2] = {100, 100}; screen_buffer_t buf; screen_create_window_buffers(window, 1); screen_get_window_property_pv(window, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&buf); screen_fill(ctx, buf, bg_color); screen_draw_text(ctx, buf, text, len, text_pos[0], text_pos[1], SCREEN_TEXT_ALIGNMENT_LEFT, font_size, text_color); // 将绘制的内容提交到屏幕显示 int rect[4] = {0, 0, size[0], size[1]}; screen_post_window(window, buf, 1, rect, 0); // 等待用户输入 getchar(); // 销毁窗口和上下文 screen_destroy_window(window); screen_destroy_context(context); return 0; } ``` 以上代码中,首先使用 `screen_create_context()` 函数创建一个屏幕上下文,然后使用 `screen_create_window()` 函数创建一个窗口,并设置窗口大小和位置。接下来,使用 `screen_post_window()` 函数将窗口提交到屏幕显示。 然后,使用 `screen_draw_text()` 函数在窗口中绘制一段文本,并使用 `screen_post_window()` 函数将绘制的内容提交到屏幕显示。最后,使用 `getchar()` 函数等待用户输入,销毁窗口和上下文后返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值