linux 图形编程?linux图形界面
大家好,感谢邀请,今天来为大家分享一下linux 图形编程的问题,以及和linux图形界面的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
Linux下如何进行图形界面编程_linux进入图形化界面命令
一,linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程序实现的。
图形界面并不是linux的一部分,linux只是一个基于命令行的操作系统,linux和Xfree的关系就相当于当年的DOS和WINDOWS3.0一样,windows3.0不是独立的操作系统,它只是DOS的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样XFree只是linux下的一个应用程序而已。不是系统的一部分,但是X的存在可以方便用户使用电脑。WINDOWS95及以后的版本就不一样了,他们的图形界面是操作系统的一部分,图形界面在系统内核中就实现了,没有了图形界面windows就不成为windows了,但linux却不一样,没有图形界面linux还是linux,很多装linux的WEB服务器就根本不装X服务器。这也是WINDOWS和linux的重要区别之一。
二,X是协议,不是具体的某个软件:
X是协议,就像HTTP协议,IP协议一样。这个概念很多初学者甚至学习LINUX有一定时间的人都混淆,一个基于X的应用程序需要运行并显示内容时他就联接到X服务器,开始用X协议和服务器交谈。
比如一个X应用程序要在屏幕上输出一个圆那么他就用X协议对X服务器说:喂!我需要在屏幕上画一个圆。
X应用程序只负责告诉X服务器在屏幕的什么地方用什么颜色画一个多大的圆,而具体的”画”的动作,比如这个圆如何生成,用什么显卡的驱动程序去指挥显卡完成等等工作是由X服务器来完成的。
X服务器还负责捕捉键盘和鼠标的动作,假设X服务器捕捉到鼠标的左键被按下了,他就告诉X应用程序:亲爱的应用程序先生,我发现鼠标被按下了,您有什么指示吗?如果X应用程序被设计成当按下鼠标左健后再在屏幕上画一个正方形的话,X应用程序就对X服务器说:请再画一个正方形,当然他会告诉服务器在什么地方用什么颜色画多大的正方形,但不关心具体怎么画_那是服务器的事情。
linux 标准C/C++ 图像识别编程
[color=Red][size=5][b]谁能告诉我该怎么实现 Linux下c语言的图形编程[/b][/size][/color]
以下是UNIX下c语言的图形编程
UNIX下c语言的图形编程--curses.h函式库
作者:不详来源:supcode.com收集整理发布时间:2005-7-22 19:39:36
减小字体增大字体
相信您在网路上一定用过如 tin,elm等工具,这些软体有项共同的特色,
即他们能利用上下左右等方向键来控制游标的位置.除此之外,这些程式
的画面也较为美观.对 Programming有兴趣的朋友一定对此感到好奇,也
许他能在 PC上用 Turbo C轻易地写出类似的程式,然而,但当他将相同
的程式一字不变地移到工作站上来编译时,却出现一堆抓也抓不完的错误.
其实,原因很简单,他使用的函式库可能在 UNIX上是没有定义的.有些
在 Turbo-C上被广泛使用的一些函式,可能在 UNIX上是不被定义的.
为了因应网路上各式各样的终端机形态(terminal), UNIX上特别发展出
一套函式库,专门用来处理 UNIX上游标移动及萤幕的显示.这就是本篇
文章要为您介绍的- curses.h函式库.利用这个函式库,您也可以写出
像 elm般利用方向键来移动光棒位置的程式.(CCCA近来所提供的线上选
课程式,及程式服务界面,即是笔者利用 curses发展而成的)
■ curses的历史与版本
cureses最早是由柏克莱大学的 Bill Joy及 Ken Arnold所发展出来的.
当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设
计的.因此,利用 curses发展出来的程式将和您所使用的终端机无关.
也就是说,您不必担心您的程式因为换了一部终端机而无法使用.这对程
式设计师而言,尤其是网路上程式的撰写,是件相当重要的一件事.
curses之所以能对上百种以上的终端机工作,是因为它将所有终端机的资
料,存放在一个叫 termcap的资料库,(而在第二版的 System V系统中
,新版的 curses以 terminfo取代原来的 termcap).有了这些记录,程
式就能够知道遇到哪一种终端机时,须送什麽字元才能移动游标的位置,
送什麽字元才能清除整个萤幕清除.(*注一)
另外,本文的介绍以 System V的 curses版本为主.
■如何在您的程式使用 curses?
在您的 C程式的档头将<curses.h> include进来.当您引进 curses.h
这个函式库后,系统会自动将<stdio.h>和<unctl.h>一并 include进
来.另外,在 System V版本中,<terminfo.h>这个函式库也将一并
include进来.
#include<curses.h>
main()
{
::
::
}
当然,您的系统内必须放有 curses.h这个函式库.
■如何编译(compile)
当您编辑好您的程式,在 UNIX提示符号下键入:
%/usr/5bin/cc [file.c]-lcurses
^^^^^^^
引进 curses.h这个 library
或%/usr/5bin/cc [file.c]-lcurses-ltermlib
(*注二)
■如何开始我的第一个 curses程式?
在开始使用 curses的一切命令之前,您必须先利用 initscr()这个函式
来开启 curses模式.
相对的,在结束 curses模式前(通常在您结束程式前)也必须以
endwin()来关闭 curses模式.
#include<curses.h>
main()
{
initscr();
::
::
::
endwin();
}
这是一般 curses程式标准的模式.
此外,您可以就您程式所须,而做不同的设定.当然,您可以不做设定,而
只是呼叫 initscr().
您可以自己写一个函式来存放所有您所须要的设定.平常使用时,只要呼
叫这个函式即可启动 curses并完成一切设定.
下面的例子,即是笔者将平常较常用的一些设定放在一个叫 initial()的函
式内.
void initial()
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
各函式分别介绍如下:
□ initscr()
initscr()是一般 curses程式必须先呼叫的函数,一但这个函数
被呼叫之后,系统将根据终端机的形态并启动 curses模式.
□ endwin()
curses通常以呼叫 endwin()来结束程式. endwin()可用来关闭
curses模式,或是暂时的跳离 curses模式.如果您在程式中须要
call shell(如呼叫 system()函式)或是需要做 system call,
就必须先以 endwin()暂时跳离 curses模式.最后再以
wrefresh() doupdate()来重返 curses模式.
□ cbreak()
nocbreak()
当 cbreak模式被开启后,除了 DELETE或 CTRL等仍被视为特殊
控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak模
式时,从键盘输入的字元将被储存在 buffer里直到输入 RETURN
或 NEWLINE.在较旧版的 curses须呼叫 crmode(),nocrmode()来
取代 cbreak(),nocbreak()
□ nl()
nonl()
用来决定当输入资料时,按下 RETURN键是否被对应为 NEWLINE字
元(如\n).
而输出资料时, NEWLINE字元是否被对应为 RETURN和 LINDFEED
系统预设是开启的.
□ echo()
noecho()
此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统
预设是开启的.
□ intrflush(win,bf)
呼叫 intrflush时须传入两个值:
win为一 WINDOW型态指标,通常传入标准输出入萤幕 stdscr
bf为 TRUE或 FALSE
当 bf为 true时,当输入中断字元(如 break)时,中断的反应
将较为快速.但可能会造成萤幕的错乱.
□ keypad(win,bf)
呼叫 keypad时须传入两个值:
win为一 WINDOW型态指标,通常传入标准输出入萤幕 stdscr
bf为 TRUE或 FALSE
当开启 keypad后,可以使用键盘上的一些特殊字元,如上下左右
等方向键, curses会将这些特殊字元转换成 curses.h内定义的一
些特殊键.这些定义的特殊键通常以 KEY_开头.
□ refresh()
refresh()为 curses最常呼叫的一个函式.
curses为了使萤幕输出入达最佳化,当您呼叫萤幕输出函式企图改
变萤幕上的画面时, curses并不会立刻对萤幕做改变,而是等到
refresh()呼叫后,才将刚才所做的变动一次完成.其馀的资料将
维持不变.以尽可能送最少的字元至萤幕上.减少萤幕重绘的时间.
如果是 initscr()后第一次呼叫 refresh(), curses将做清除萤
幕的工作.
■游标的控制
move(y,x)将游标移动至 x,y的位置
getyx(win,y,x)得到目前游标的位置
(请注意!是 y,x而不是&y,&x)
■有关清除萤幕的函式
clear()
erase()将整个萤幕清除
(请注意配合refresh()使用)
■如何在萤幕上显示字元
echochar(ch)显示某个字元
addch(ch)显示某个字元
mvaddch(y,x,ch)在(x,y)上显示某个字元
相当於呼叫 move(y,x);addch(ch);
addstr(str)显示一串字串
mvaddstr(y,x,str)在(x,y)上显示一串字串
相当於呼叫 move(y,x);addstr(str);
printw(format,str)类似 printf(),以一定的格式输出至萤幕
mvprintw(y,x,format,str)在(x,y)位置上做 printw的工作.
相当於呼叫 move(y,x);printw(format,str);
■如何从键盘上读取字元
getch()从键盘读取一个字元(注意!传回的是
整数值)
getstr()从键盘读取一串字元
scanw(format,&arg1,&arg2...)如同 scanf,从键盘读取一串字元
□例:
int ch;
char string1[80];/*请注意!不可宣告为 char*string1;*/
char string2[80];
echo();/*开启 echo模式,使输入立刻显示在萤幕上*/
ch=getch();
string1=getstr();
scanw("%s",string2);
mvprintw(10,10,"String1=%s",string1);
mvprintw(11,10,"String2=%s",string2);
■如何利用方向键
curses将一些如方向键等特殊控制字元,以 KEY_为开头定义在 curses.h
这个档案里头,如 KEY_UP即代表方向键的"↑".但,如果您想使用
curses.h所为您定义的这些特殊键的话,您就必须将 keypad设定为
TRUE.否则,您就必须自己为所有的特殊键定义了.
curses.h为一些特殊键的定义如下:
KEY_UP 0403↑
KEY_DOWN 0402↓
KEY_LEFT 0404←
KEY_RIGHT 0405→
KEY_HOME 0406 Home key(upward+left arrow)
KEY_BACKSPACE 0407 backspace(unreliable)
KEY_F0 0410 Function keys.
KEY_F(n)(KEY_F0+(n)) formula for f.
KEY_NPAGE 0522 Next page
KEY_PPAGE 0523 Previous page
以上仅列出笔者较常使用的一些控制键,至於其他控制键的定义,请自行参
阅 man curses(*注三)
一并为您列出其他常用的一些特殊字元
[TAB]/t
[ENTER]/r
[ESC] 27
[BACKSPACE] 127
■如何改变萤幕显示字元的属性
为了使输出的萤幕画面更为生动美丽,我们常须要在萤幕上做一些如反白,
闪烁等变化. curses定义了一些特殊的属性,透过这些定义,我们也可以
在 curses程式□控制萤幕的输出变化.
attron(mod)开启属性
attroff(mod)关闭属性
curses.h里头定义了一些属性,如:
A_UNDERLINE加底线
A_REVERSE反白
A_BLINK闪烁
A_BOLD高亮度
A_NORMAL标准模式(只能配合 attrset()使用)
当使用 attron()开启某一种特殊属性模式后,接下来在萤幕的输出都会以
该种属性出现.直到您呼叫 attroff()将此模式关闭.
请注意,当您欲 attron()开启另一种属性时,请记得利用 attroff()先关
闭原来的属性,或直接以 attrset(A_NORMAL)将所有特殊属性关闭.否则,
curses会将两种属性做重叠处理.
□例:
attrset(A_NORMAL);/*先将属性设定为正常模式*/
attron(A_UNDERLINE);/*加底线*/
mvaddstr(9,10,"加底线");/*加底线输出一串字元*/
attroff(A_UNDERLINE);/*关闭加底线模式,恢复正常模式*/
attron(A_REVERSE);/*开启反白模式*/
mvaddstr(10,10,"反白");/*输出一串反白字元*/
attroff(A_REVERSE);/*关闭反白模式,恢复正常模式*/
attron(A_BLINK);/*开启闪烁模式*/
mvaddstr(11,10,"闪烁");/*输出一串闪烁字元*/
attroff(A_BLINK);/*关闭闪烁模式,恢复正常模式*/
attron(A_BOLD);/*开启高亮度模式*/
mvaddstr(12,10,"高亮度");/*输出一串高亮度字元*/
attroff(A_BOLD);/*关闭高亮度模式,恢复正常模式*/
■其他常用的一些函式
beep()发出一声哔声
box(win,ch1,ch2)自动画方框 ch1:画方框时垂直方向所用字元
ch2:画方框时水平方向所用字元
example: box(stdscr,'|','-');
将以|及-围成一个方框
■应用完整□例
下面所举的例子,即完全利用刚刚所介绍的含式来完成.这个程式可将从键
盘上读取的字元显示在萤幕上,并且可以上下左右方向键来控制游标的位置
,当按下 [ESC]后,程式即结束.
您有没有发现,这不就是一个简单全萤幕编辑器的雏形吗?
#include<curses.h>/*引进 curses.h,并自动引进
stdio.h*/
#define StartX 1/*决定游标初始位置*/
#define StartY 1
void initial();
main()
{
int x=StartX;/*宣告 x,y并设定其初值
*/
int y=StartY;
int ch;/*宣告 ch为整数,配合 getch()
使用*/
initial();/*呼叫 initial(),启动 curses
模式,*/
/*并完成其它设定
*/
box(stdscr,'|','-');/*画方框
*/
attron(A_REVERSE);/*开启反白模式
*/
mvaddstr(0,20,"Curses Program");/*在(20,0)处输出反白字元
*/
attroff(A_REVERSE);/*关闭反白模式
*/
move(x,y);/*将游标移至初始位置
*/
do{/*以无限回圈不断等待输入
*/
ch=getch();/*等待自键盘输入字元
switch(ch){/*判断输入字元为何
*/
case KEY_UP:--y;/*判断是否"↑"键被按下
*/
break;
case KEY_DOWN:++y;/*判断是否"↓"键被按下
*/
break;
case KEY_RIGHT:++x;/*判断是否"→"键被按下
*/
break;
case KEY_LEFT:--x;/*判断是否"←"键被按下
*/
break;
case'\r':/*判断是否 ENTER键被按下
*/
++y;
x=0;
break;
case'\t':/*判断是否 TAB键被按下
*/
x+=7;
break;
case 127:/*判断是否 BACKSPACE键被按下
*/
mvaddch(y,--x,'');/* delete一个字元
*/
break;
case 27: endwin();/*判断是否[ESC]键被按下
*/
exit(1);/*结束 curses模式
*/
/*结束此程式
*/
default:
addch(ch);/*如果不是特殊字元,将此字元印
出*/
x++;
break;
}
move(y,x);/*移动游标至现在位置
*/
} while(1);
}
void initial()/*自定开启 curses函式
*/
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
■后记
学完了上述的一些命令,相不相信您已经可以写出一个漂亮的全萤幕编辑
器了?事实上, curses提供的函式不下 200个,可是笔者认为,一切再
复杂的函式都可以用本文提到的一些组合变化而成,学了太多的函式,只
是徒增自己困扰罢了.当然,如果您对其它函式有兴趣,可以自行参阅
curses说明档.(方法:% man curses)本文不过行抛砖引玉之效,也
希望未来能陆续出现更多同学自行创作的程式.
*任何疑问及建议,欢迎 e-mail至 [email]ljh@CCCA.NCTU.edu.tw[/email].谢谢!*
注一:
请参考/usr/share/lib/termcup
/usr/share/lib/terminfo/s/sun
注二:
1.如果是 BSD的版本,需使用
cc [file.c]-lcurses-ltermcap来完成 compile.
2.计中工作站不知何故将原来的/usr/5bin/cc更改为/usr/5bin/cc.org
因此,您若想在计中工作站 compile curses程式.需以/usr/5bin/cc.
org
取代/usr/5bin/cc,否则 compile可能发生错误.
3.较旧版的 curses需同时引进 curses和 termlib这两个 library,
因此,您必须使用/usr/5bin/cc [file.c]-lcurses-ltermlib来
compile.
注三:
根据笔者的经验,上下左右方向键应可正常使用而不会发生问题,但其它
如 PgUp,PgDn,功能键,Home,End等特殊键,很容易因机器,键盘不同而无
法使用,因此,若您的程式须要在不同的机器上使用,建议您只用方向键来
控制,其它的特殊键少用为妙.
至於 PgUp,PgDn一些特殊键的控制方法,由於较为复杂,有兴趣的同学可
参
考 tin原始程式 curses.c内所使用的一些方法.
3D图形编程该如何学习
这个东西先不要急进~我也是学习OpenGL的也是以图像编程作为自己的职业发展方向的!先握个手~呵呵
首先!最重要的就是要把C++精通!精通意思是对指针,列表,向量等东西要非常熟悉,因为这些东西在图像编程中经常用到。然后就是基于C++的数据结构,栈、链表、二叉树是比较常用的,还有各种排序算法。但上面这些东西推荐你边做边学,这样不枯燥,而且容易掌握。
之后就是线性代数、几何、向量数学,这几门打好基础后(注意基础知识掌握就行),就可以去学习计算机图形学的相关知识(所有图形算法均用C++编写的,这样有助于以后OpenGL的学习)
最后就是OpenGL以及各种高级算法的学习了~
图像编程要成型一般要一年以上的时间(不包括学习C++的时间),所以加油吧!其实并不是太难,平时多观察,锻炼一下自己的空间想象力~!
至于碰撞检测其实是另外一门专业了,以后工作不会让一个图像编程员去写碰撞检测的,一个引擎通常是分开很多个类进行整合的。你只要了解基础的碰撞检测原理就行。