• 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.

VPS Starter Arubacloud
0 głosów
370 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ź 310 wizyt
+1 głos
0 odpowiedzi 321 wizyt
0 głosów
1 odpowiedź 323 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...