如何正确使用GF编程画图 新手图形奠基[解决]

#include
#include

#include <stdio.h>
#include <stdlib.h>
//#include <Pt.h>
#include <gf/gf.h>


#include <Ap.h>



/* Constants for the shapes in the menu */
#define RECTANGLE 1
#define CIRCLE 2
#define DOT 3
#define BLOB 4
#define POLYGON 5


int main( int argc, char *argv[] )
{




void Draw(void);



Draw();
PtMainLoop();
return (EXIT_SUCCESS);
}

void Draw(void)
{
gf_dev_t gdev;
gf_dev_info_t gdev_info;
gf_display_t display;
gf_display_info_t display_info;
unsigned int i;
int width,height;
if (gf_dev_attach(&gdev, GF_DEVICE_INDEX(0), &gdev_info) != GF_ERR_OK)
{
printf(“gf_dev_attach() failed\n”);
}

printf(“Number of displays: %d\n”,gdev_info.ndisplays);

for (i = 0; i < gdev_info.ndisplays; i++ )
{
printf(“Display %d: “, i);
if (gf_display_attach(&display, gdev, i, &display_info) == GF_ERR_OK)
{
printf(”%dX%d, refresh = %dHz\n”, display_info.xres,
display_info.yres, display_info.refresh);
printf(“Number of layers: %d\n”, display_info.nlayers);
printf(“main_layer_index: %d\n”, display_info.main_layer_index);
} else
{
printf(“gf_display_attach() failed\n”);
}
}

if (display != NULL)
{
gf_layer_t layer;

long x ;
if ( gf_layer_attach(&layer, display, display_info.main_layer_index, 0) == GF_ERR_OK)
{

gf_surface_t surface;
width = display_info.xres;
height = display_info.yres;


x = gf_surface_create_layer(&surface, &layer, 0, 0,
width, height, GF_FORMAT_BGRA8888, NULL, 0 );
if (x == GF_ERR_OK)
{
gf_layer_set_surfaces(layer, &surface, 1);
gf_context_t context;
/* draw stuff here */
if (gf_context_create(&context) != GF_ERR_OK)
{
fprintf(stderr, “gf_context_create failed\n”);

}

if (gf_context_set_surface(context, surface) != GF_ERR_OK)
{
fprintf(stderr, “gf_context_set_surface failed\n”);

}

gf_draw_begin(context);
gf_context_set_fgcolor(context, 0xFFFFFF);
gf_draw_rect(context,10,10,50,50);
gf_context_set_fgcolor(context, 0x000000);
gf_draw_rect(context,20,20,40,40);
gf_draw_flush(context);
gf_draw_end(context);

}
else
{
printf(“gf_surface_create_layer() failed\n”);
}
}
else
{
printf(“gf_layer_attach() failed\n”);

}

}




gf_dev_detach(gdev);


}
上面运行到 gf_layer_attach(&layer, display, 1, 0) == GF_ERR_OK

就出现gf_layer_attach() failed 了

为什么会出现这样 时我建的QNX C++ Project 工程有问题 ?

还是 不要建窗口直接连接设备,连接图层,创建环境变量?

头大 希望大侠们不吝指导下

可能我描述的不清楚

谁能给个使用GF的简单的例子呢

我看了帮助文档的programe guide

那边要求使用PtRaw作图

我只是不想用那个控件 想直接使用下GF 和 缓存绘图
那效率高些 而且想要什么效果都可以自己设定
因为我要移植一些另外的代码来绘图

继续等待 大家的答复!

刚找到 这个文章

《QNX下,main_layer被占用如何处理?》

跟我的问题很类似

但是我不明白如何在 text mode 里面运行我的程序

我这个程序是在photon下吗?

我没用到任何Photon AB 里面的控件啊
因为是刚开始弄QNX 所以问的问题也许比较幼稚 希望大家不要见怪啊


另外 http://community.qnx.com/integration/viewvc/viewvc.cgi/trunk/apps/egl/demos/gles1-egl-gears/?root=graphics&system=exsy1001

这个网址找不到了

xtang大哥能出来简单说明一下吗 ?



热心的朋友们 留个言关注一下啦 不管有无答案

一个回复也没 好失望啊

首先,你是哪个QNX版本的?这个问题很重要。:slight_smile:

GF (Graphics Framework) 是QNX出的,与Photon完全不同的一套图形系统。现在的QNX,基本上有三种(四种?)图形开发用的环境可选 。

  1. 传统的Photon。这个可以像windows那样提供组件,并且有phab图形开发环境。是个完整的窗口系统。(窗口的大小,重叠什么的都有window manager来管理)。Photon的优点是开发相对容易(有工具);缺点是代码量比较大,而且因为历史的原因,有一些新的图形功能无法在Photon里实现。

  2. GF。GF说白了就是一个小巧、高速的图形库。与图形驱动非常地贴近,从而能有效,最大限地利用显示芯片的硬件能力。它优点是小巧,高速,因为很多嵌入式的界面其实不需要”窗口管理“。但缺点是不象Photon那样有系统组件,什么都得自己来,也没什么特别的编程工具。

在GF之上,有新开发的Composite Manager,这个主要是用软件来管理不同的图层,基础还是GF。但框架用了许多OpenKode的东西。

  1. 第三种图形界面就是Adobe Flash/Air了。QNX移植了Adobe Flash Player,所以你可以直接用Adobe工具,编一个.swf文件做为你的图形界面。优点是这种界面不依存于操作系统(能跑Flash就能用);缺点是在嵌入式设备上跑性能还有待提高。这个,基本上也是QNX的发展方向,PlayBook应该就是用的这个。

在6.4x以前,GF与Photon是不兼容的;要用GF,就得退出Photon。直接在文本态起动GF程序。在/usr/bin里应该有一些gf的例子。像是vsync,跑一下就知道了。到6.5,这几种图形环境又融合起来了。以GF打底,Photon变成了一个基于GF的窗口系统 ;而Flash Player也是基于GF的一个程序而已。

谢谢 xtang大哥的 回答 :smiley:

我使用的是6.5的版本 是官方下载评估版本的 只有30天使用期限(似乎已经过半个月了 -_-|||)

通过的VMware来模拟QNX系统下的开发 使用的也是官方下载的Neutrino650Target


我们公司就是做导航的 原来是使用的CE平台
现在着手先研究下QNX系统下的应用开发
1)使用GF的话可以较容易地移植原来的代码(因为原来的代码就是直接将数据画到缓存里,在显示出来的,像使用windows的GDI),而且速度也比较快
,一般在嵌入式平台下 效率还是很重要的
2)而使用Photon AppBuilder 开发周期会相对长些,绘图速度也会受影响

xtang大哥 所说的是target\qnx6\usr\bin下吗 里面只有 get_hw_info 和ph两个文件 其中的ph 我看上去 怎么有点像 开启Photon AppBuilder 使用的命令行执行文件

(今天跟同事沟通时发现photon的登录界面 直接可以切换到textmode,先试下)

老实说 我还不太会直接使用命令行直接执行文件
因为之前没接触过相关的Linux系统的知识
不知道xtang大哥有什么好的建议 麻烦指导下 :slight_smile:
谢谢啦[/img]

刚才测试了下 可以正常使用 GF画图了

使用的程序便是以上的代码


在QNX6.5 进入登录界面时 (要你输入账号和密码)

点下面的shutdown按钮

会提示你几个选项 选择Exit to TextMode就可以直接到TextMode了


然后运行程序就 有一个白色的矩形框了


希望这能帮助到像我一样的初学者!! :slight_smile:


再次感谢xtang大哥的帮助。 :smiley: