• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Jak mogę wyświetlić obraz w wxwidgets.

Object Storage Arubacloud
0 głosów
384 wizyt
pytanie zadane 16 lipca 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
zamknięte 25 lipca 2021 przez tonn204

Witam, chciałbym napisać aplikację w C++ używając wxwidgets, która pozwoli na przeglądanie zdjęć. Jak mogę załadować zdjęcie (jaka klasa za to odpowiada)  tak aby wyświtliło się w we wskazanym przez mnie miejscu? 

Kiedy klikam przyciks Back wyskakuje mi błąd: Can't load bitmap from "ścieżka do pliku" resource. Check.rc file

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

int const ID_BTN_BACK = 1, ID_BTN_NEXT = 2, ID_BTN_CHOOSE_FILE = 3;

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

class myFrame : public wxFrame
{
public:
	myFrame();
	wxPanel* img_panel;
private:
	void back_btn_clicked(wxCommandEvent& event);
	void next_btn_clicked(wxCommandEvent& event);
	void choose_file_btn_clicked(wxCommandEvent& event);
};

wxIMPLEMENT_APP(myApp);

bool myApp::OnInit()
{
	myFrame* frame = new myFrame();
	frame->Show(true);
	return true;
}

myFrame::myFrame() : 
wxFrame(NULL, wxID_ANY, "My image aplication", wxDefaultPosition, wxSize(800, 600), wxCAPTION | wxCLOSE_BOX | wxMINIMIZE_BOX)
{
	wxPanel* panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(800, 600));
	img_panel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxSize(400, 300));
	wxButton* btn_back = new wxButton(panel, ID_BTN_BACK, "Back", wxPoint(300, 400), wxSize(100, 50));
	wxButton* btn_next = new wxButton(panel, ID_BTN_NEXT, "Next", wxPoint(400, 400), wxSize(100, 50));
	wxButton* btn_choose_file = new wxButton(panel, ID_BTN_CHOOSE_FILE, "Choose file", wxPoint(350, 450), wxSize(100, 50));

	Bind(wxEVT_BUTTON, &myFrame::back_btn_clicked, this, ID_BTN_BACK);
}

void myFrame::back_btn_clicked(wxCommandEvent& event)
{
	wxStaticBitmap* img = new wxStaticBitmap(img_panel, wxID_ANY, wxBitmap(std::string("C:\\Users\\usr\\Pictures\\avatary\\zdjecie.jpg")), wxDefaultPosition,
	wxSize(800, 200));
}

void myFrame::next_btn_clicked(wxCommandEvent& event)
{
    // obsluga klawisza
}

void myFrame::choose_file_btn_clicked(wxCommandEvent& event)
{
   // obsluga klawisza
}

 

komentarz zamknięcia: Problem został rozwiązany.
komentarz 17 lipca 2021 przez tkz Nałogowiec (42,000 p.)
https://wiki.wxwidgets.org/An_image_panel

Albo najzwyczajniej w świecie podajesz złą ścieżkę do pliku.
komentarz 17 lipca 2021 przez j23 Mędrzec (194,920 p.)

Nie tyle złą ścieżkę, co nie podał typu ładowanego pliku (domyślnie jest wxBITMAP_DEFAULT_TYPE, co pod Windowsem może oznaczać nazwę zasobu)

komentarz 24 lipca 2021 przez tonn204 Mądrala (7,440 p.)
Czyli jaki typ muszę podać aby wszystko działało?
komentarz 25 lipca 2021 przez tonn204 Mądrala (7,440 p.)

Zmieniłem na coś takeigo, wyskakuje ten sam błąd. Ale teraz pojawia się szary obraz w tym okienku

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

int const ID_BTN_BACK = 1, ID_BTN_NEXT = 2, ID_BTN_CHOOSE_FILE = 3;

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

class myFrame : public wxFrame
{
public:
	myFrame();
	wxPanel* img_panel;
private:
	void back_btn_clicked(wxCommandEvent& event);
	void next_btn_clicked(wxCommandEvent& event);
	void choose_file_btn_clicked(wxCommandEvent& event);
};

wxIMPLEMENT_APP(myApp);

bool myApp::OnInit()
{
	myFrame* frame = new myFrame();
	frame->Show(true);
	return true;
}

myFrame::myFrame() : 
wxFrame(NULL, wxID_ANY, "My image aplication", wxDefaultPosition, wxSize(800, 600), wxCAPTION | wxCLOSE_BOX | wxMINIMIZE_BOX)
{
	wxPanel* panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(800, 600));
	img_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(400, 300));
	wxButton* btn_back = new wxButton(panel, ID_BTN_BACK, "Back", wxPoint(300, 400), wxSize(100, 50));
	wxButton* btn_next = new wxButton(panel, ID_BTN_NEXT, "Next", wxPoint(400, 400), wxSize(100, 50));
	wxButton* btn_choose_file = new wxButton(panel, ID_BTN_CHOOSE_FILE, "Choose file", wxPoint(350, 450), wxSize(100, 50));

	Bind(wxEVT_BUTTON, &myFrame::back_btn_clicked, this, ID_BTN_BACK);
}

void myFrame::back_btn_clicked(wxCommandEvent& event)
{
	wxStaticBitmap* img = new wxStaticBitmap(this, wxID_ANY, wxBitmap("C:/Users/usr/Desktop/zdj1.png"), wxDefaultPosition,
	wxSize(200, 200), wxBITMAP_TYPE_PNG);
}

void myFrame::next_btn_clicked(wxCommandEvent& event)
{

}

void myFrame::choose_file_btn_clicked(wxCommandEvent& event)
{

}

 

komentarz 25 lipca 2021 przez j23 Mędrzec (194,920 p.)
edycja 25 lipca 2021 przez j23
wxStaticBitmap* img = new wxStaticBitmap(this, 
                        wxID_ANY, 
                        wxBitmap(wxT("C:\\Users\\usr\\Desktop\\zdj1.png"), wxBITMAP_TYPE_PNG), 
                        wxDefaultPosition, 
                        wxSize(200, 200));

Czytaj dokumentację!

komentarz 25 lipca 2021 przez tonn204 Mądrala (7,440 p.)

Wielkie dzięki za pomoc. Oprócz tego kodu który tu podałeś musiałem jeszcze doodać obsługe formatu pliku png tak jak w kodzie poniżej wszystko już działa :))).

 

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

int const ID_BTN_BACK = 1, ID_BTN_NEXT = 2, ID_BTN_CHOOSE_FILE = 3;

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

class myFrame : public wxFrame
{
public:
	myFrame();
private:
	void back_btn_clicked(wxCommandEvent& event);
	void next_btn_clicked(wxCommandEvent& event);
	void choose_file_btn_clicked(wxCommandEvent& event);
};

wxIMPLEMENT_APP(myApp);

bool myApp::OnInit()
{
	myFrame* frame = new myFrame();
	frame->Show(true);
	return true;
}

myFrame::myFrame() : 
wxFrame(NULL, wxID_ANY, "My image aplication", wxDefaultPosition, wxSize(800, 600), wxCAPTION | wxCLOSE_BOX | wxMINIMIZE_BOX)
{
	wxPanel* panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(800, 600));
	wxButton* btn_back = new wxButton(panel, ID_BTN_BACK, "Back", wxPoint(300, 400), wxSize(100, 50));
	wxButton* btn_next = new wxButton(panel, ID_BTN_NEXT, "Next", wxPoint(400, 400), wxSize(100, 50));
	wxButton* btn_choose_file = new wxButton(panel, ID_BTN_CHOOSE_FILE, "Choose file", wxPoint(350, 450), wxSize(100, 50));

	wxImage::AddHandler(new wxPNGHandler);

	wxStaticBitmap* img = new wxStaticBitmap(this, wxID_ANY, wxBitmap(wxT("C:\\Users\\usr\\Desktop\\zdjecie.png"), wxBITMAP_TYPE_PNG), wxDefaultPosition, wxDefaultSize, 0);

	Bind(wxEVT_BUTTON, &myFrame::back_btn_clicked, this, ID_BTN_BACK);
	Bind(wxEVT_BUTTON, &myFrame::next_btn_clicked, this, ID_BTN_NEXT);
	Bind(wxEVT_BUTTON, &myFrame::choose_file_btn_clicked, this, ID_BTN_CHOOSE_FILE);
}

void myFrame::back_btn_clicked(wxCommandEvent& event)
{

}

void myFrame::next_btn_clicked(wxCommandEvent& event)
{

}

void myFrame::choose_file_btn_clicked(wxCommandEvent& event)
{

}

 

komentarz 26 lipca 2021 przez j23 Mędrzec (194,920 p.)

musiałem jeszcze doodać obsługe formatu pliku png

Faktycznie. Wydawało mi się, że obsługa wszystkich formatów jest domyślnie załadowana, ale według dokumentacji tylko bmp.

Możesz wywołać gdzieś w myApp::OnInit funkcję wxInitAllImageHandlers.

Podobne pytania

0 głosów
1 odpowiedź 314 wizyt
+1 głos
0 odpowiedzi 335 wizyt
0 głosów
1 odpowiedź 331 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)

92,536 zapytań

141,376 odpowiedzi

319,452 komentarzy

61,920 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...