Xwindows开发学习

Xwindows开发学习 http://www.linuxsir.org/bbs/thread182379.html

第一个程序
hello world

每个Xwindows程序都由三个部分组成
1 Desplay 这个就是X服务器
2 Win 程序的窗口 可能有一个或多个
3 gc 图形上下文 如果你想在程序窗口中输出内容时 你就需要到这个东西

每个程序的流程就是
1 打开显示
2 创建窗口
3 创建GC
4 选择窗口关心的事件
5 映射窗口 这时在屏幕上显示程序界面
6 进程事件循环读事件并处理

下面就是hello world的流程



#include ≶X11/Xlib.h>
#include ≶X11/Xutil.h>
#include ≶X11/Xos.h>
#include ≶X11/Xatom.h>

#define DUMP_ERR printf

int main()
{
Display *display;
int screennum;
int width;
int height;

const char *strdraw = “hello world”;

Window win;
GC gc;
//打开显示 没有指明打开哪个显示时使用环境变量中的DESPLAY
display = XOpenDisplay(NULL);
if( !display ){
DUMP_ERR(”call XOpenDisplay(%s) fail\n”,XDisplayName(NULL));
return 1;
}

//得到系统当前的屏幕 (如果使用虚拟屏幕的话 一般会有几个)
// get default screen
screennum = DefaultScreen(display);
//根据屏幕的大小决定窗口的大小
width = DisplayWidth(display,screennum)/4;
height = DisplayHeight(display,screennum)/4;

//创建窗口
// create window
win = XCreateSimpleWindow(display,
RootWindow(display,screennum),
0,0,width,height,3,
BlackPixel(display,screennum),
WhitePixel(display,screennum));

//选择窗口关心的事件
// select event
XSelectInput(display,win,
ExposureMask|KeyPressMask
|ButtonPressMask|StructureNotifyMask);

//创建GC(图形上下文)
// create gc
{
unsigned long valuemask = 0;
XGCValues values;
gc = XCreateGC(display,win,valuemask,&values);
}

// 映射窗口 只有map后窗口才会在屏幕上显示
// show window
XMapWindow(display,win);

//进入事件循环
// event loop
while(1){
XEvent event;
XNextEvent(display,&event); // 读一个事件

switch(event.type){
case Expose: // expose window 显示事件
if( event.xexpose.count != 0) break;
XDrawString(display,win,gc,10,10,
strdraw,strlen(strdraw));
break;

// 按键事件
case ButtonPress:
case KeyPress:
XFreeGC(display,gc);
XCloseWindow(win);
XCloseDisplay(display);
return 0;
default:
break;
}
}
}
Xwindows开发学习

上面是一个最基本的例子 基本上除了hello world外什么事也不做
下面开始介绍在X上画图的例子
上面说过GC 画图就是在gc上输出内容
每个gc都有属性 可以通过XChangeGC修改或是通过其它修改gc性能的函数

XSetLineAttributes修改
这两个的效果是一样的


#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>

#define DUMP_ERR printf

static void draw(Display *display,Window win,GC gc,int width,int height);

int main()
{
Display *display;
int screennum;
int width;
int height;
Atom protocols;

const char *strdraw = “hello world”;

Window win;
GC gc;

display = XOpenDisplay(NULL);
if( !display ){
DUMP_ERR(”call XOpenDisplay(%s) fail\n”,XDisplayName(NULL));
return 1;
}

// get default screen
screennum = DefaultScreen(display);
width = DisplayWidth(display,screennum)/2;
height = DisplayHeight(display,screennum)/2;

// create window
win = XCreateSimpleWindow(display,
RootWindow(display,screennum),
0,0,width,height,3,
BlackPixel(display,screennum),
WhitePixel(display,screennum));

//增加这个代码是捕获程序退出事件
protocols = XInternAtom(display, “WM_DELETE_WINDOW”, True);
XSetWMProtocols(display, win, &protocols, 1);

// select event
XSelectInput(display,win,
ExposureMask|KeyPressMask
|ButtonPressMask|StructureNotifyMask);

// create gc
{
unsigned long valuemask = 0;
XGCValues values;
gc = XCreateGC(display,win,valuemask,&values);
}

// show window
XMapWindow(display,win);

// event loop
while(1){
XEvent event;
XNextEvent(display,&event);

switch(event.type){
case Expose: // expose window
if( event.xexpose.count != 0) break;
draw(display,win,gc,width,height);
//XDrawString(display,win,gc,10,10,
//strdraw,strlen(strdraw));
break;

case ConfigureNotify: // when the window’s size change
width = event.xconfigure.width;
height = event.xconfigure.height;
break;
case ClientMessage :
if(event.xclient.data.l[0] == protocols){
DUMP_ERR(”recv destroy notify\n”);
XFreeGC(display,gc);
XDestroyWindow(display, win);
XCloseDisplay(display);
}
return 0;

default:
break;
}
}
}

// 使用changeGC修改属性的代码 只有valuemask被设置的属性才会根据XCGValues里面的值进行修改
static void set_gc_values(Display *display,GC gc)
{
XGCValues values;
values.line_width = 2;
values.line_style = LineSolid;
values.cap_style = CapRound;
values.join_style = JoinRound;

XChangeGC(display,gc,GCLineWidth|GCLineStyle,//|GCCapStyle|GCFillStyle,
&values);
}

// 画画的代码
static void draw(Display *display,Window win,GC gc,int width,int height)
{
int i,x,y;
unsigned int ling_width = 0;
int line_style = LineSolid;// 是实线
int cap_style = CapRound; // 端点类型是圆的
int join_style = JoinRound;// 接点类型是圆的

XPoint points[5] = {
{400,200},
{600,200},
{450,300},
{500,150},
{550,300},
};

// draw point
for(i = 0;i< width;i++)
XDrawPoint(display,win,gc,i,10);

// draw line
y = 30;
for(i = 0;i<10;i+=2){
// int XSetLineAttributes(Display *display, GC gc, unsigned int
// line_width, int line_style, int cap_style, int join_style);
XSetLineAttributes(display,gc,i,line_style,cap_style,join_style);
// int XDrawLine(Display *display, Drawable d, GC gc, int x1, int y1, int
//x2, int y2);
XDrawLine(display,win,gc,10,y,width-10,y);
y += 20;
}

set_gc_values(display,gc);
XDrawRectangle(display,win,gc,10,y,50,50);
XDrawRectangle(display,win,gc,100,y,200,200);

XDrawArc(display,win,gc,100,y,200,200,0,90*64);
XFillArc(display,win,gc,100,y,200,200,90*64,120*64);

XFillPolygon(display,win,gc,points,5,Complex,EvenOddRule);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要进行Windows内核开发,你需要学习以下知识和技能: 1. 操作系统原理:了解操作系统的基本原理,包括进程管理、内存管理、文件系统等。深入理解操作系统内核的设计和实现方式。 2. C/C++编程:熟练掌握C/C++编程语言,因为Windows内核是使用C/C++编写的。熟悉指针操作、内存管理、数据结构等基本概念。 3. 汇编语言:了解汇编语言是必要的,因为在内核开发中,可能需要编写或分析汇编代码。熟悉x86或x64汇编语言。 4. Windows体系结构:深入了解Windows操作系统的体系结构和内核模式编程。包括内核对象、调度程序、中断处理、系统调用等的工作原理和机制。 5. Windows驱动开发:掌握Windows驱动开发的基本概念和技术。了解驱动程序的加载、初始化、通信和资源管理等方面的知识。 6. 调试和分析工具:熟悉使用Windows内核调试器和分析工具,如WinDbg、KD(Kernel Debugger)等。这些工具对于诊断和调试内核级问题非常重要。 7. 内核模块开发:了解内核模块的开发和加载过程。熟悉内核模块的结构、导出函数、驱动入口点等。 8. 安全知识:理解操作系统和内核的安全机制和原则。掌握安全编码实践,以防止安全漏洞和攻击。 9. 实践和调试技巧:通过实践和调试来加深对内核开发的理解。掌握调试技巧,能够有效地定位和解决内核级问题。 请注意,Windows内核开发是一项复杂而庞大的领域,需要时间和经验的积累。建议先从学习基础知识开始,然后逐步深入研究和实践。参考微软官方文档、书籍和在线资源是学习的好途径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值