如何在现代Linux中轻松制作图形?

时间:2014-05-06 21:37:07

标签: java c linux graphics turbo-c++

以下是过去可以编写的C程序的一个例子:

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

void main()
{
    int gd=DETECT, gm;

    initgraph(&gd, &gm, "c:\\turboc\\bgi");
    circle(200,100,150);

    getch();
    closegraph();
}

我认为这是MSDOS下的turbo C.它为您提供了一个屏幕上的绘图,可以很容易地扩展到快速动画图形,如xscreensaver hacks中的那些。

我如何在ubuntu上用gcc编写等效代码?它可以用Java完成吗?

3 个答案:

答案 0 :(得分:3)

#include<X11/Xlib.h>
#include<stdlib.h>

/* gcc -std=gnu99 -o circle circle.c -lX11 */

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

  /* connect to the X server and make a window */
  Display *dpy = XOpenDisplay (getenv ("DISPLAY"));
  Window w = XCreateSimpleWindow (dpy, DefaultRootWindow (dpy),
                                  100, 100, 640, 480, 1,
                                  BlackPixel (dpy, DefaultScreen (dpy)),
                                  WhitePixel (dpy, DefaultScreen (dpy)));

  /* raise it and wait */
  XSelectInput (dpy, w, StructureNotifyMask);
  XMapRaised (dpy, w);
  for(XEvent e; ( e.type != MapNotify );
      XWindowEvent (dpy, w, StructureNotifyMask, &e));

  /* create a graphics context for drawing in the window */
  GC g = XCreateGC (dpy, w, 0, NULL);

  /* draw a circle */
  XDrawArc(dpy,w,g,200,100,150,150,0,360*64);
  XFlush(dpy);

  /*wait for key press*/
  XSelectInput (dpy, w, KeyReleaseMask);
  for(XEvent e; ( e.type != KeyRelease ); 
      XWindowEvent (dpy, w, KeyReleaseMask, &e));

  /*clean up*/
  XDestroyWindow( dpy, w );
  XCloseDisplay (dpy);
}

答案 1 :(得分:2)

好的,关于基础知识的话很少:

  1. 您提供的示例使用名为BGI的库 - Borland图形界面 - 来自MS DOS时代的非常古老的东西
  2. GCC本身只是一个编译器 - 您必须搜索支持绘图的库
  3. 在Linux上我们使用了几个GUI工具包,但是现在只有Gtk和Qt是相关的。
  4. 如果您想要低级图形库,可以查看Allegro(http://alleg.sourceforge.net/)或SDL(http://www.libsdl.org/
  5. 但严重的是,我认为你正在寻找错误的方向。您应该专注于使用现代工具包(Gtk,Qt),现代语言(C ++,C#,Java,Python等)和OpenGL进行“特殊效果”的现代事件驱动GUI编程。

答案 2 :(得分:1)

您需要了解Linux图形通常是通过X11完成的(或许Wayland可能会在未来成为竞争对手)。

然后你应该使用一些X11工具包。如果您想要C语言,请考虑GTKlibSDL。但是如果你了解C ++,我会推荐Qt(阅读它的graphics能力)。

您可以在大约一百行中找到一些简短的Qt或Gtk或SDL示例程序。

Java至少有Swing

请注意,Linux本质上是一个多任务系统。所以你想运行几个图形程序。换句话说,您需要几个窗口(以及窗口或桌面管理器)。因此,您需要一个事件循环,并且您需要处理调整大小和/或重叠的窗口。因此,复杂性比上个世纪的TurboC时代要大得多!

或者,考虑将您的应用程序设置为专用HTTP服务器(并在HTML5中编写图形代码),例如使用libonion作为C HTTP服务器库。