Автор Гілка: Простецьке віконце  (Прочитано 3076 раз)

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
У Вінді був спосіб створити вікно без MFC, Qt .... Чи є можливість в Linux'е зробити просте вікно без наворотів, не встановлюючи ще чогось собі на комп. Мені потрібно найпростіше вікно за допомогою якого я міг би виводити OpenGL.

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Простецьке віконце
« Відповідей #1 : 2012-02-01 22:45:45 »
Xlib?

Відсутній Dmytrish

  • Новачок
  • *
  • дописів: 4
  • Карма: +0/-0
Re: Простецьке віконце
« Відповідей #2 : 2012-02-04 20:33:52 »
Ось, тримайте: http://www.opengl.org/sdk/docs/man/xhtml/glXIntro.xml
Для отримання короткої і вичерпної довідки по функціях Xlib/OpenGL можна користуватись man 3 <функція(e.g.:glViewport/XFlush...)>. Незлецький тьюторіал з Xlib англійською є тут: http://tronche.com/gui/x/xlib-tutorial/

Але, чесно кажучи, не бачу великого смислу користуватись саме Xlib. Як альтернативні варіанти можна розглянути glut і його функції роботи з вікнами (для простої гри/візуалізації більш ніж достатньо, швидкість, думаю, також не постраждає). Якщо потрібен більш-менш складний GUI, раджу примиритись із оверхедом QtOpenGL або подібного.

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Re: Простецьке віконце
« Відповідей #3 : 2012-02-08 16:59:16 »
Simple window in Linux

Як я виявиви, то найпростіший спосіб - це wxWidgets.
Отже:

Відкриваємо термінал і виконуємо:
sudo apt-get install libwxgtk2.8-dev
sudo apt-get install libwxgtk2.8-dbg


Потім створюємо файл hworld.cpp з таким кодом:
#include "wx/wx.h"

class MyApp: public wxApp
{
    virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:

    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

    DECLARE_EVENT_TABLE()
};

enum
{
    ID_Quit = 1,
    ID_About,
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Quit, MyFrame::OnQuit)
    EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( _("Hello World"), wxPoint(50, 50),
                                  wxSize(450,340) );
    frame->Show(true);
    SetTopWindow(frame);
    return true;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame( NULL, -1, title, pos, size )
{
    wxMenu *menuFile = new wxMenu;

    menuFile->Append( ID_About, _("&About...") );
    menuFile->AppendSeparator();
    menuFile->Append( ID_Quit, _("E&xit") );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, _("&File") );

    SetMenuBar( menuBar );

    CreateStatusBar();
    SetStatusText( _("Welcome to wxWidgets!") );
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
    wxMessageBox( _("This is a wxWidgets Hello world sample"),
                  _("About Hello World"),
                  wxOK | wxICON_INFORMATION, this);
}

компілимо й збираємо:
g++ hworld.cpp `wx-config --libs` `wx-config --cxxflags` -o hworld

запускаємо:
./hworkd
« Змінено: 2012-02-08 17:00:46 від Yola »

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Re: Простецьке віконце
« Відповідей #4 : 2012-02-08 21:34:56 »
І зрештою, саме той спосіб, який і мав бути обраний і втілений спочатку, за допомогою GLUT, саме про нього й писав Dmytrish:

Створюємо файл з наступним кодом:
#include <GL/glut.h>

void display(void)
{
      glClear (GL_COLOR_BUFFER_BIT);

      glColor3f (1.0, 1.0, 1.0);
      glBegin(GL_POLYGON);
            glVertex3f (0.25, 0.25, 0.0);
            glVertex3f (0.75, 0.25, 0.0);
            glVertex3f (0.75, 0.75, 0.0);
            glVertex3f (0.25, 0.75, 0.0);
      glEnd();

      glFlush ();
}

void init (void)
{
      glClearColor (0.3, 0.3, 0.3, 0.0);

      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

int main(int argc, char **argv)
{
      glutInit(&argc, argv);
      glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
      glutInitWindowSize(500, 500);
      glutInitWindowPosition(0, 0);
      glutCreateWindow("simple OpenGL example");
      glutDisplayFunc(display);
      init();
      glutMainLoop();
}

і компілимо його так:
g++ first.cpp -lGL -lglut

./a.out
« Змінено: 2012-02-08 21:37:12 від Yola »