QNX下Photon编程二简单例子.docx
《QNX下Photon编程二简单例子.docx》由会员分享,可在线阅读,更多相关《QNX下Photon编程二简单例子.docx(13页珍藏版)》请在冰点文库上搜索。
QNX下Photon编程二简单例子
QNX下Photon编程
(二)简单例子
这是一个系列讲座,从官方文档《photon_prog_guide》而来,主要讲述QNX下的GUI编程-Photon编程,主要针对初学者。
第一个例子:
首先我们创建一个QNXPhotonAppbuilderproject,这时会自动打开PhAB工具。
PhAB工具界面如下所示:
我们在弹出的对话框中选择新的应用程序样式为basewindow。
我们在右侧的widgetpalette中选择label
并回到我们的窗口上点击一下,发现新创建了一个label,之后我们到资源控制面板并选择label的LabelText属性,修改为“HelloWorld!
”
在PhAB中选择Build→GenerateUI,这时将生成界面代码,然后回到QNXMomenticsIDE,编译工程并下载到目标机运行,可以查看到刚才编辑的效果。
第二个例子:
下面我们在窗口上添加一个Button,并修改其BevelWidth属性为6,Font属性为TextFont,设置HorzAlignment属性为Pt_CENTER,在BasicFlag属性中添加Pt_TOP_INLINE、Pt_BOTTOM_INLINE、Pt_LEFT_INLINE、Pt_RIGHT_INLINE属性、修改Color:
Fill属性,查看修改后的效果。
Label控件可以通过设置LabelType属性为Pt_IMAGE使其显示一个图片而不显示文字,选择LabelImage属性可以编辑Label的显示图片。
添加一个PtMultiTextWidget显示一个多行文本。
编辑TextString属性可以修改显示的文字。
添加一个PtListWidget可以显示一个选择列表。
修改ListofItems可以修改选择项。
很多时候我们可能需要创建相同表现的widget,此时我们可以创建一个widget模板。
选择一个widget并从右键菜单选择DefineTemplete创建一个widget模板。
当成功创建一个模板widget之后我们可以从PhAB的window菜单选择ShowTempletes显示模板并将其添加到我们的界面中去。
第三个例子:
使用PhAB,我们可以通过两步创建菜单:
1.menubutton,点击时显示菜单;
2.menumodule,包含菜单项
在一个应用程序中添加一个MenuBar,并添加两个MenuButton,设置它们的instantname分别为base_file和base_help
,同时设置LabelText属性为File和Help。
在Project菜单中选择AddMenu,并将其name修改为filemenu,修改MenuItem添加菜单项,并将新菜单项的instname修改为file_new,同样创建file_open,file_save,之后再新建一个Separator菜单项,最后建立一个file_quit菜单项。
为了在点击File菜单按钮时显示file菜单,我们需要将Arm回调关联到这个按钮。
选择base_file按钮的Arm回调,由于我们想弹出一个菜单,选择Menu。
之后在Name下拉菜单中选择我们的filemenu。
回到filemenu的编辑,我们选择file_quit菜单项,添加一个Quit回调函数。
选择Build->GenerateUI生成界面代码,然后在PhAB中选择菜单Window->ShowProject看到文件列表中的Quit.c,选择他并点击Edit按钮,或者直接双击来修改quit函数。
[cpp] viewplain copy
1.int
2.Quit( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
3. {
4. /* eliminate 'unreferenced' warnings */
5. widget = widget, apinfo = apinfo, cbinfo = cbinfo;
6. PtExit( EXIT_SUCCESS );
7. return( Pt_CONTINUE );
8. }
之后运行程序观看效果。
第四个例子:
接上面的程序,我们创建一个helpmenu菜单,并且建立菜单项help_help,help_about,同时我们建立help_about菜单项的callback为一个名为aboutdlg的对话框对象(由于对话框现在还不存在,我们只能在列表框中手动输入对话框名称)。
在setupfunction框中,我们输入aboutdlg_setup,这里指定了aboutdlg在实例化时将要调用的函数。
同时对话框的Location属性我们设置为CenterScreen。
最终设置的效果如下图:
选择apply之后PhAB弹出一个对话框让我们选择aboutdlg应该是什么类型,我们选择Plain类型。
下面我们选择aboutdlg对话框,放两个PtLabel对象到对话框上,再放一个按钮。
设置一个Label名字为about_version并什么都不显示,另一个显示文字“aboutthisdemo”。
Button的名字为about_done,显示文字“Done”。
并将该按钮的activecallback设置为Done类型。
下面添加相应事件代码:
[cpp] viewplain copy
1.int
2.aboutdlg_setup( PtWidget_t *link_instance, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
3. {
4. /* eliminate 'unreferenced' warnings */
5. link_instance = link_instance, apinfo = apinfo, cbinfo = cbinfo;
6. PtSetResource( ABW_about_version, Pt_ARG_TEXT_STRING, "1.00", 0);
7.
8. return( Pt_CONTINUE );
9. }
编译代码并执行可以查看效果。
第五个例子:
接上面的例子,我们从Project菜单选择新建一个Window,选择Plain样式并把Window的名字修改为newwin。
从新建的newwin的callback中我们选择windowmanager,添加newwin_close函数,回到Resource控制面板选择Notify,并确认选择Ph_WM_CLOSE标志。
把主窗口的filenew菜单项的回调修改为对窗口newwin,并选择Setup函数为newwin_setup。
在newwin中添加一个PtRect、四个PtButton并显示如下:
修改上面一行三个按钮中:
最左边那个名字为btn_red,显示文字Red,添加ActiveCallback为color_change函数。
中间那个名字为btn_green,显示文字Green,添加ActiveCallback为color_change函数。
最右边那个名字为btn_blue,显示文字Blue,添加ActiveCallback为color_change函数。
下面一个最大的按钮的text修改为“Changepreviouswindow'scolor”,名字为btn_prev,回调同样是color_change函数。
最后界面如图:
下面生成界面代码并修改:
newwin_setup.c修改:
[cpp] viewplain copy
1.int win_ctr = 0;
2.PtWidget_t *win[5];
3.int
4.newwin_setup( PtWidget_t *link_instance, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
5. {
6. /* eliminate 'unreferenced' warnings */
7.
8. char buffer[40];
9. /* eliminate ’unreferenced’ warnings */
10. link_instance = link_instance, apinfo = apinfo;
11. cbinfo = cbinfo;
12. /* Note:
Returning Pt_END in a prerealize setup
13. function tells PhAB to destroy the module
14. without realizing it */
15. /* allow only 5 windows max */
16. if ( win_ctr == 5 ) {
17. return( Pt_END );
18. }
19. /* save window-module instance pointer */
20. win[win_ctr] = link_instance;
21. sprintf( buffer, "Window %d", win_ctr + 1 );
22. PtSetResource( win[win_ctr], Pt_ARG_WINDOW_TITLE,
23. buffer, 0 );
24. win_ctr++;
25.
26. return( Pt_CONTINUE );
27. }
color_change.c修改为:
[cpp] viewplain copy
1.PgColor_t colors[5] = {Pg_BLACK, Pg_YELLOW,
2.Pg_MAGENTA, Pg_CYAN,
3.Pg_GREEN};
4.int base_clr = -1;
5.extern int win_ctr;
6.extern PtWidget_t *win[5];
7.
8.int
9.color_change( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
10. {
11. int i, prev;
12. PtWidget_t *this_window;
13. /* eliminate ’unreferenced’ warnings */
14. widget = widget, apinfo = apinfo, cbinfo = cbinfo;
15. /* Get a pointer to the current window. */
16. this_window = ApGetInstance( widget );
17. if ( ApName( widget ) == ABN_btn_red ) {
18. PtSetResource(
19. ApGetWidgetPtr( this_window, ABN_color_rect ),
20. Pt_ARG_FILL_COLOR, Pg_RED, 0 );
21. } else if ( ApName( widget ) == ABN_btn_green ) {
22. PtSetResource(
23. ApGetWidgetPtr( this_window, ABN_color_rect ),
24. Pt_ARG_FILL_COLOR, Pg_GREEN, 0 );
25. } else if ( ApName( widget ) == ABN_btn_blue ) {
26. PtSetResource(
27. ApGetWidgetPtr( this_window, ABN_color_rect ),
28. Pt_ARG_FILL_COLOR, Pg_BLUE, 0 );
29. } else if ( ApName( widget ) == ABN_btn_prev ) {
30. /* Note:
Here we use the window-module instance
31. pointers saved in newwin_setup to update
32. the window previous to the current window
33. provided it hasn’t been closed.
34. Determine which window is previous to this window. */
35. prev = -1;
36. for ( i = 0; i < win_ctr; i++ ) {
37. if ( win[i] == this_window ) {
38. prev = i - 1;
39. break;
40. }
41. }
42. /* If the window still exists, update its background
43. color. */
44. if ( prev !
= -1 && win[prev] ) {
45. base_clr++;
46. if (base_clr >= 5) {
47. base_clr = 0;
48. }
49. PtSetResource( win[prev], Pt_ARG_FILL_COLOR,
50. colors[base_clr], 0 );
51. }
52. }
53. return( Pt_CONTINUE );
54.
55. }
newwin_close.c修改为:
[cpp] viewplain copy
1.extern int win_ctr;
2.extern PtWidget_t *win[5];
3.
4.int
5.newwin_close( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
6. {
7. PhWindowEvent_t *we = cbinfo->cbdata;
8. int i;
9. /* eliminate ’unreferenced’ warnings */
10. apinfo = apinfo;
11. /* only process WM close events */
12. if ( we->event_f !
= Ph_WM_CLOSE ) {
13. return( Pt_CONTINUE );
14. }
15. /* okay it’s a close so who is it?
*/
16. for ( i = 0; i < win_ctr; i++ ) {
17. if ( win[i] == widget ) {
18. win[i] = NULL;
19. break;
20. }
21. }
22. return( Pt_CONTINUE );
23. }
编译运行,查看效果。