ساده ترین برنامه ی دارای یک پنجره در Linux - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

ساده ترین برنامه ی دارای یک پنجره در Linux

+3 امتیاز

سلام!

در Windows می تونستم با استفاده از توابع API ـی که Windows ارائه می ده و بدون استفاده از ابزار خاص دیگه ای با زبان C یا ++C یه برنامه ی ساده بنویسیم که فقط یه پنجره داشته باشه...

ساده ترین مثالش در Linux سیستم عامل های مبتنی بر هسته ی Linux یا توزیع های GNU/Linux چی هست؟

در واقع نمی خوام از Qt ،GTK و این جور ابزارها استفاده کنم...

سوال شده شهریور 11, 1393  بوسیله ی مسعود لپه‌چی (امتیاز 928)   12 31 50
ویرایش شده شهریور 11, 1393 بوسیله ی مسعود لپه‌چی
Qt خودش از این lib استفاده می کنه : Xlib

3 پاسخ

+4 امتیاز
 
بهترین پاسخ

سلام .

Linux فقط یه Kernel هست و چیزی دیگه ای نیست .

مثل Windows توابع برای Window و GUI رو همراه با خودش نداره .

Linux از یک مدیریت پنجره به نام X Window System استفاده میکنه .

درواقع بیشتر سیستم های Unix از مدیریت پنجره ی X Window System استفاده میکنن که البته خیلی قدیمی هم هست و الان داره سعی میشه تا با Wayland که یک مدیریت پنجره جدید هست جایگذین بشه .

از Qt و GTK و .... گرفته تا OpenGL همه ی اینها در انتها از X Window System استفاده میکنند .

پس شما هم میتونید از همین X Window System برای ساختن یک پنجره ساده استفاده کنید .

یعنی میشه گفت X Window System توی Linux یجورایی یک استاندارد شده .

توی لینک زیر یک مثال هست .

http://en.wikibooks.org/wiki/X_Window_Programming/XLib

پاسخ داده شده شهریور 11, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد شهریور 13, 1393 بوسیله ی مسعود لپه‌چی
+2 امتیاز
Juce - http://www.rawmaterialsoftware.com/juce.php
Qt - http://qt.nokia.com/products
WxWidget - http://www.wxwidgets.org
GTK+ - http://www.gtk.org

Fltk - http://www.fltk.org

IUP - http://webserver2.tecgraf.puc-rio.br/iup/

Ultimate++

باید از یکی از اون بالاییا استفاده کنی که پیشنهاد من Qt هست

اون موقع ها که من جوون بودم اصلا چیزی به نام GUI نبود همچی توی terminal بود الان این میزکار های Gnome و KDE و ... اومده و GUI داره سی هم اصلا توی ترمینال بدنیا اومده به خاطر همین بدون استفاده از از کیت های بالا نمیشه یعنی توی سی نمیشه وگرنه توی جاوا به راحتی میتونی باخود جاوا فریم بسازی

پاسخ داده شده شهریور 11, 1393 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
ویرایش شده شهریور 19, 1393 بوسیله ی Fire360Boy
گردآوری خوبیه.
FLTK و Tk رو هم خوبه اضافه کنید...
البته خیلی های دیگه هم هستند... ++IUP ،Ultimate، ...
ممنون.....
چشم......
+4 امتیاز

نزدیک ترین معادلی که برای winapi می‌شناسم X11 هست. با X11 برنامه نوشته‌ام اما نیازی به ساختن پنجره نداشته‌ام. تا جایی که مشخص است مثل winappi یک حلقۀ پیام داریم که بسیار شبیه به winappi هست. برنامۀ زیر از لینک:

 http://www.geeks3d.com/20120102/programming-tutorial-simple-x11-x-window-code-sample-for-linux-and-mac-os-x

برداشته شده است که یک پنجره می‌سازد:

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/utsname.h>

int main()
{
    Display* dpy = XOpenDisplay(NULL);
    if (dpy == NULL)
    {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }

    int s = DefaultScreen(dpy);
    Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, s), 10, 10, 660, 200, 1,
                                     BlackPixel(dpy, s), WhitePixel(dpy, s));
    XSelectInput(dpy, win, ExposureMask | KeyPressMask);
    XMapWindow(dpy, win);

#if defined(__APPLE_CC__)
    XStoreName(dpy, win, "Geeks3D.com - X11 window under Mac OS X (Lion)");
#else
    XStoreName(dpy, win, "Geeks3D.com - X11 window under Linux (Mint 10)");
#endif

    Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(dpy, win, &WM_DELETE_WINDOW, 1);

    bool uname_ok = false;
    struct utsname sname;
    int ret = uname(&sname);
    if (ret != -1)
    {
        uname_ok = true;
    }

    XEvent e;
    while (1)
    {
        XNextEvent(dpy, &e);
        if (e.type == Expose)
        {
            int y_offset = 20;


            const char* s1 = "X11 test app under Linux";


            const char* s2 = "(C)2012 Geeks3D.com";
            XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, s1, strlen(s1));
            y_offset += 20;
            XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, s2, strlen(s2));
            y_offset += 20;

            if (uname_ok)
            {
                char buf[256] = {0};

                sprintf(buf, "System information:");
                XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, buf, strlen(buf));
                y_offset += 15;

                sprintf(buf, "- System: %s", sname.sysname);
                XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, buf, strlen(buf));
                y_offset += 15;

                sprintf(buf, "- Release: %s", sname.release);
                XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, buf, strlen(buf));
                y_offset += 15;

                sprintf(buf, "- Version: %s", sname.version);
                XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, buf, strlen(buf));
                y_offset += 15;

                sprintf(buf, "- Machine: %s", sname.machine);
                XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, buf, strlen(buf));
                y_offset += 20;
            }


            XWindowAttributes  wa;
            XGetWindowAttributes(dpy, win, &wa);
            int width = wa.width;
            int height = wa.height;
            char buf[128]= {0};
            sprintf(buf, "Current window size: %dx%d", width, height);
            XDrawString(dpy, win, DefaultGC(dpy, s), 10, y_offset, buf, strlen(buf));
            y_offset += 20;
        }

        if (e.type == KeyPress)
        {
            char buf[128] = {0};
            KeySym keysym;
            XLookupString(&e.xkey, buf, sizeof buf, &keysym, NULL);
            if (keysym == XK_Escape)
                break;
        }

        if ((e.type == ClientMessage) &&
                (static_cast<unsigned int>(e.xclient.data.l[0]) == WM_DELETE_WINDOW))
        {
            break;
        }
    }

    XDestroyWindow(dpy, win);
    XCloseDisplay(dpy);
    return 0;
}

 

توجه کنید که کتابخانۀ ‎-lX11 را باید اضافه کرد تا برنامه اجرا شود.

پاسخ داده شده شهریور 12, 1393 بوسیله ی irancplusplus (امتیاز 203)   1 2 14
ویرایش شده شهریور 13, 1393 بوسیله ی irancplusplus
...