x11中文教程
c语言吧
全部回复
仅看楼主
level 7
二饼弟弟 楼主
序:
作为目前Linux和unix系统上使用最广泛的图形api,x11几乎找不到任何中文教程,即便有,也只是简单的寥寥数语,今天我将制作一个x11图文教程[阴险]
参考书-《unix系统v第四版 程序员指南:xwin图形窗口系统》
《xlib-c language interface》
(虽然上面两本书内容几乎一模一样,但是第一本是1991年翻译的,第二本是2009年最后更新,所以在教程中,我主要写一个新手引导和第一本书的错误修正)
2024年02月01日 01点02分 1
level 14
抢个
前排
,国内就是这样,稍微专业一点的东西就没有教程了。[阴险]
2024年02月01日 01点02分 2
level 7
二饼弟弟 楼主
概略介绍:
作为一个1985年诞生的计算机技术,x11具有很多妥协的"特性",所以他的有些机制对于刚刚学习他的人来说比较难以理解,所以在下面的教程中,我会在楼中楼写出我自己的理解
2024年02月01日 01点02分 3
对了,我的字超级丑,但是我在书上写了些笔记,所以我还是会拍书,别骂我[泪]
2024年02月01日 01点02分
支持[香槟][香槟]
2024年02月01日 02点02分
level 7
二饼弟弟 楼主
display指的是显示器,众所周知,广场上的大型显示器往往由多个屏幕组成,所以有屏幕编号的说法,但是这里指定的屏幕为什么只有一个呢?因为这里指定的屏幕将会是你的默认屏幕,但是对于大部分人来说,是没有控制广场大屏的需求的,所以你只需要在参数里填入NULL即可
例:
Display *dsp = XOpenDisplay(NULL);
2024年02月01日 01点02分 4
level 7
二饼弟弟 楼主
别的你先别管,这仨还是挺重要的,别到时候像我一样“哎呀,怎么colormap还要自定义呀[啊]
一个一个介绍:
XDefaultRootWindow(display)
可以看到下面的介绍,返回根窗口,根窗口是一切窗口的祖先窗口,反过来说,除了根窗口没有父窗口,一切窗口都有父窗口,所以当你创建一个程序的第一个窗口时,一般都是在根窗口下,后面将会使用这个函数
XDefaultScreen(display)
返回的就是你刚刚填的默认屏幕编号,如果你没填,那么他也会给你找一个默认屏幕,所以如果你是一个个人电脑用户而且没有超多屏幕组成的超大屏的话,在不知道自己的默认屏幕编号的情况下,就使用这个函数吧
XDefaultColormap(display,screen_number)
返回默认的colormap,顾名思义colormap有很多color,但是我们在使用其他接口的时候一般都是rgb,为什么到这就这么复杂?这就是我说的“特性”了,在个人电脑发展早期,黑白屏幕还很常见(当然现在客制化键盘上也很常见)所以不是你要哪个颜色就有的,所以要经历一个转化过程,即使在现在,便宜的屏幕也无法显示很多色彩,所以需要一个转化过程寻找接近的色彩,那么为什么除了显示器还需要屏幕编号呢?那是因为鬼知道一个显示器里面包含多少不同色域的屏幕啊[怒],但是对于大部分个人电脑用户来说,XDefaultScreen够用了
还有就是,不是组合而成[怒]只有一个colormap,原文是made out of,原文并没有暗示有多个colormap
gc-graphic context比较复杂,以后会介绍,先不急
神马?颜色深度你都看不懂?那我就勉为其难地告诉你,颜色深度就是一个颜色由多少bit表示,计算可以表示的颜色数的公式初中信息课教过了[阴险]
剩下的看我圈画应该能明白对吧?(对吧?)
2024年02月01日 02点02分 5
level 7
二饼弟弟 楼主
这里再提一下这个函数,和之前的XDefaultRootWindow差不多,至少对没有广场超大屏的人差不多
2024年02月01日 02点02分 6
level 7
二饼弟弟 楼主
那么,创建窗口的一切准备都已做好
窗口,启动!
窗口有属性,有很多属性,这里面最难理解的我个人认为就是gravity了,窗口怎么会有引力呢?但是,当你伸缩窗口的时候,图形应该往哪里动呢?懂了吧,这就是在窗口大小变化的情况下控制窗口下属的图像和窗口往哪动的东西,所以窗口不仅有gravity,还分为bit_gravity和win_gravity分别控制图像和子窗口
如果你想要创建一个具有个性化的窗口,怎么办呢?当然是自己研究去喽,我这是新手引导,只教到在简单窗口里放图片[阴险](主要是懒,说不定以后有激情了还会增加内容呢)
所以直接使用XCreateSimpleWindow
函数声明比较复杂,我就不写了,在下面图片上了,这个函数隐藏了大部分窗口的细节,这些细节要么copyfromparent(我要是也能copy from parent多好啊),要么就是类似gravity这种又复杂又得视情况而定的玩意直接给个默认值,图片引力的默认值是不动,子窗口引力的默认值是向西北方向也就是左上角动
然后这个窗口毕竟是我们的第一个窗口所以直接让这个窗口创建为默认屏幕的根窗口的子窗口,直接使用XDefaultRootWindow作为父窗口,后面创建的的坐标,窗口大小,边框宽度的应该不用解释
那么问题来了,边框颜色和背景颜色呢?怎么办?颜色机制我将会在之后介绍,现在先用两个函数解燃眉之急,这两个函数可以帮你找到在某个屏幕上,什么样的白最白,什么样的黑最黑所以直接使用这两个函数作为XCreateSimpleWindow的参数了
例:
Window win = XCreateSimpleWindow(dsp,XDefaultRootWindow(dsp),50,50,800,600,0,BlackPixel(dsp,screen_number),BlackPixel(dsp,acreen_number));
那么窗口创建完了,欸?为什么没有窗口呢?答案是窗口的全部数据都有了,但是我们还需要让他根据这些数据画出来,就像是Git里先add再commit一样,所以使用
XMapWindow(dsp,win);
ok,欸?程序怎么卡住不动弹了?原来是每个窗口创建都是一个事件,就类似于键盘输入,如果你一直不刷新事件队列,后面的事件和步骤就一直完成不了,旧的不去新的不来嘛,所以这里也祝大家新年快乐,年年都有新气象,怎么办呢?
直接使用XFlush(dsp);这里就不多介绍这个函数了,以后讲事件的时候会说到,一个就足矣
ok,欸?程序怎么结束了?原来是窗口刚map出来就直接return 0了所以最后再写一个死循环吧
终于,我们的窗口出来了,如果你看到了一个背景是黑的窗口出现在你的屏幕上,说明你成功了[呵呵]
2024年02月01日 03点02分 7
这里纠个错,上文中的acreen_number实际上是screen_number
2024年02月06日 09点02分
level 7
二饼弟弟 楼主
突然犯懒,一会再写,先立个flag,两天内写完
2024年02月01日 03点02分 8
吧务
level 14
现在都在转wayland了[滑稽]
2024年02月01日 03点02分 9
cobol在千禧年都开始说转了,现在也没转完[滑稽]
2024年02月01日 04点02分
kde + wayland + nvidia = 寄
2024年02月12日 04点02分
吧务
level 15
前排落座[太开心],支持楼主[真棒]
2024年02月01日 04点02分 10
level 11
[小乖]已收藏
2024年02月01日 05点02分 11
level 12
前排
2024年02月01日 06点02分 12
level 5
请问下,跟OpenGL有什么区别?
2024年02月01日 07点02分 13
x11可以依赖OpenGL等 或其他接口制作,但是x11并不是某一个库,而是一个标准,只要一个软件完美符合x11的标准,那么这个软件就是x11,所以理论上来说,你用现有的x11功能制作一个x11也是x11,就像用c语言写的c语言编译器也是c语言编译器一样,但是无论如何OpenGL更底层,直接控制显卡
2024年02月01日 11点02分
[真棒]
2024年02月01日 16点02分
level 12
牛,收藏
2024年02月01日 23点02分 15
level 1
初中生学这么多?(╥ω╥`) 厉害的(╥ω╥`)
2024年02月02日 04点02分 16
1 2 尾页