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

Fiszki IT
Fiszki IT
0 głosów
64 wizyt
pytanie zadane 16 lipca w C i C++ przez tonn204 Mądrala (6,590 p.)
zamknięte 25 lipca 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 przez tkz Nałogowiec (39,540 p.)
https://wiki.wxwidgets.org/An_image_panel

Albo najzwyczajniej w świecie podajesz złą ścieżkę do pliku.
komentarz 17 lipca przez j23 Mędrzec (164,140 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 przez tonn204 Mądrala (6,590 p.)
Czyli jaki typ muszę podać aby wszystko działało?
komentarz 25 lipca przez tonn204 Mądrala (6,590 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 przez j23 Mędrzec (164,140 p.)
edycja 25 lipca 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 przez tonn204 Mądrala (6,590 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 przez j23 Mędrzec (164,140 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ź 62 wizyt
+1 głos
0 odpowiedzi 63 wizyt
0 głosów
2 odpowiedzi 184 wizyt
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

84,721 zapytań

133,526 odpowiedzi

295,919 komentarzy

55,997 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...