wxWidgets: отобразить wxBitmap на wxFrame
От: Аноним  
Дата: 02.03.08 12:26
Оценка:
Добрый день.

В основном пишу консольные программки, но возникла задача написать простенькую программку, которая бы выводила RGB битмап в окно. Раньше писал некоторые "графические" программки под винду, и как вывести изображение с помощью winapi в курсе. Сейчас же работаю в линуксах, и т.к. от гуи требуется только вывод одной картинки (хотя, было бы неплохо реализовать анимацию; но тоже в рамках простой смены кадров, которые выводились бы в определенную область окна) разбираться в графических библиотеках (wxWidgets, gtk, qt) лениво. Поэтому прошу знатоков привести пример простой программы создающей окно и отобразить на нем битмап. Либо ткнуть на уже готовый пример. Быстро пробежавшись по гуглу, осилил только создание главного окна используя wxWidgets (по gtk и qt еще не искал; исключительно субъективно — не хочется их трогать; хотя, если с их помощью можно решить задачу просто, то тоже пойдет).


#include <wx/wx.h>

using namespace std;

class MWND : public wxFrame
{
public:
    MWND(const wxString& title);
};

MWND::MWND(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(800, 600))
{
  Centre();
}

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

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    MWND *mwnd = new MWND(wxT("TITLE"));
//  подозреваю, где-то здесь нужно что-то типа: mwnd->AddControl(new wxBitmap("tmp.bmp"))
    mwnd->Show(true);

    return true;
}


Все — дальше затык. Почитал (поискал по форуму) про wxBitmap — но как его "вставить" в окно так и не разобрался (в основном, все примеры на форуме http://wxforum.shadonet.com уж слишком монстрообразные и без разучивания апи мне не поддались

Еще хочу добавить: битмап генерируется непосредственно в памяти (т.е. на диск *.bmp не ложится), поэтому хотелось бы непосредственно выводить из: char *rgb_buf; //просто область памяти по три байта (rgb) на на пиксель. Но на данный момент это непринципиально...

Заранее благодарен
Сергей



03.03.08 13:28: Перенесено модератором из 'C/C++' — Odi$$ey
Re: wxWidgets: отобразить wxBitmap на wxFrame
От: Аноним  
Дата: 02.03.08 14:27
Оценка:
...
bool MyApp::OnInit()
{
    MWND *mwnd = new MWND(wxT("TITLE"));
//  подозреваю, где-то здесь нужно что-то типа: mwnd->AddControl(new wxBitmap("tmp.bmp"))

Таки я не ошибся:
    new wxStaticBitmap(mwnd, wxID_ANY, wxBitmap(wxT("tmp.bmp")));

    mwnd->>Show(true);

   return true;
}
Re[2]: wxWidgets: отобразить wxBitmap на wxFrame
От: игппук Беларусь  
Дата: 02.03.08 15:46
Оценка:
у wxWidgets очень толковая и вменяемая документация. вы не потеряете много времени, если ее попытаетесь осилить. также там есть куча сэмплов.
проклятый антисутенерский закон
Re[3]: wxWidgets: отобразить wxBitmap на wxFrame
От: Аноним  
Дата: 02.03.08 16:24
Оценка:
Здравствуйте, игппук, Вы писали:

И>у wxWidgets очень толковая и вменяемая документация. вы не потеряете много времени, если ее попытаетесь осилить. также там есть куча сэмплов.


Признаюсь — хотел сфилонить но таки пришлось бегло пройтись по документации. Сейчас пытаюсь прикрутить "анимацию". Застрял на обновлении битмапа. Т.е. у wxImage есть метод void SetData(unsigned char* data), но, подозреваю, нужно блитить битмап на DC фрейма.
http://www.wxwidgets.org/wiki/index.php/WxBitmapButton
Разбираюсь с событиями... Эх... Читаю доки
Re[4]: wxWidgets: отобразить wxBitmap на wxFrame
От: игппук Беларусь  
Дата: 02.03.08 18:06
Оценка:
анимацию можно на основе gif сделать. wxWidject умеет с ними работать. посмотрите в wxImage метод LoadFile и загрузите в него gif картинку. и еще посмотрите AddHandler. признаться, с гифами пока что не работал сам, но беглый просмотр документации показал, что копать можно в эту сторону.
проклятый антисутенерский закон
Re[5]: wxWidgets: отобразить wxBitmap на wxFrame
От: Аноним  
Дата: 02.03.08 19:10
Оценка:
Здравствуйте, игппук, Вы писали:

И>анимацию можно на основе gif сделать. wxWidject умеет с ними работать. посмотрите в wxImage метод LoadFile и загрузите в него gif картинку. и еще посмотрите AddHandler. признаться, с гифами пока что не работал сам, но беглый просмотр документации показал, что копать можно в эту сторону.


Эээ... Вероятно, я словом "анимация" ввел в заблуждение. Мне нужна, скорее, не анимация — в классическом понимании данного термина — а ренедеринг изображения. Т.е. каждый кадр будет новый, генерируемый динамически программой (соотв. gif тут не при делах). Фактически, это будет поток RGB фреймов, которые и нужно выводить на wxFrame. Аналогичную операцию я проворачивал под виндовс, суть понимаю, но лениво разбираться в апи графической либы под линукс (в этом и суть моих постов здесь). Но, как говорится: "Ленивый платит дважды..."
Re[6]: wxWidgets: отобразить wxBitmap на wxFrame
От: игппук Беларусь  
Дата: 02.03.08 20:30
Оценка:
но ведь эти изображения будут получаться в виде файлов? если так, то просто используйте каждый раз LoadFile и SetData останется не при делах.
проклятый антисутенерский закон
Re[7]: wxWidgets: отобразить wxBitmap на wxFrame
От: Аноним  
Дата: 02.03.08 20:41
Оценка:
И>но ведь эти изображения будут получаться в виде файлов? если так, то просто используйте каждый раз LoadFile и SetData останется не при делах.

Вот как раз и нет. В том-то все и дело, что не фалы (иначе и вопроса не возникло). Ну, считайте, что я делаю игрушку (на самом деле это не так, но суть отрисовки изображения та же), и мне нужно без лишнего оверхида — не говоря уже о том, чтобы складывать кадр в файл и потом LoadFile — копировать определенный участок памяти (unsigned char *buf; который и есть сам сгенерированный кадр в формате rgb) прямо на форму. Сейчас ковыряю rawbmp.h
Re[8]: wxWidgets: отобразить wxBitmap на wxFrame
От: Аноним  
Дата: 02.03.08 22:00
Оценка:
И>>но ведь эти изображения будут получаться в виде файлов? если так, то просто используйте каждый раз LoadFile и SetData останется не при делах.

А>Вот как раз и нет. В том-то все и дело, что не фалы (иначе и вопроса не возникло). Ну, считайте, что я делаю игрушку (на самом деле это не так, но суть отрисовки изображения та же), и мне нужно без лишнего оверхида — не говоря уже о том, чтобы складывать кадр в файл и потом LoadFile — копировать определенный участок памяти (unsigned char *buf; который и есть сам сгенерированный кадр в формате rgb) прямо на форму. Сейчас ковыряю rawbmp.h



Ну, в первом приближении, похоже, решил:


#include <wx/wx.h>
#include <wx/rawbmp.h>

// init
wxBitmap bmp = wxBitmap(xres, yres, 24);
wxNativePixelData pixdata = wxNativePixelData(bmp);
unsigned char *rgb_buf = pixdata->GetPixels().m_ptr;

// рисуем что-нибудь через rgb_buf
memset(rgb_buf, 0xff, xres * yres * 3);

// отображаем на фрейме
wxPaintDC dc(some_wxFrame);
dc.DrawBitmap(bmp,0,0);


Нужно еще отловить EVT_ERASE_BACKGROUND и поиграться с DoubleBuffering, но это уже следующий шаг...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.