Aloittelin tässä tekemään käyttöliittymää tulevalle ohjelmalleni (ja harjoitellakseni wxWidgetsiä :)
Ongelma on että tahtoisin saada ikkunalleni "taustakuvan" wxFrameen, mutta näin tehdessäni myös menu pyyhkiytyy (koska koko ikkuna maalataan).
wxWindowDC *paaAlue = new wxWindowDC(ikkuna); //Luodaan piirtopinta taustakuvaa varten wxBitmap taustakuva(wxBITMAP(TAUSTA)); //Ladataan kuva paaAlue->DrawBitmap(taustakuva, 0,48, 0);
Kun nettiä selailin en löytänyt mitään hyvää keinoa tehdä asiaa :/
Ikkunaan on tarkoitus vielä laittaa nappuloita sun muuta tilpehööriä, joten tausta ei saisi peittää niitä.
Ehdotuksia?
EDIT: kuva on siis resurssitiedostossa ja on bmp päätteinen.
Tuolta löytyy http://www.informit.com/articles/article.aspx?p=405047 eli se OnErase funktio.
Näyttää suunnilleen siltä mitä haen :) pitääpä koittaa kotiin päästyäni
Vielä sellainen "ongelma" tuli vastaan että kun luon uuden wxPanel:n ja laitan sille vaikka nappulan tausta pyyhkiytyy ja siitä tulee harmaa. Kun en luo panelia ja laitan sizerin avulla nappulan se menee ns. oikein ettei koko tausta pyyhkiydy, mutta en saa sen paikkaa vaihdettua (sizerin takia, ja ilman sitä nappula valtaa koko ikkunan laitoinpa sille arvoiksi mitä tahansa). Vai onko panelin "taustan" vaihtamiseen mitään helppoa keinoa?
PS: kirjoitin tämän kiireessä koska olen juuri lähdössä kylpylään joten kirjoitusvirheitä saattaa löytyä :)
Muoks. tausta siis tuolla OnErase() eventillä tehty.
Jos tajusin oikein, niin oletko koittanut tehdä sen "piirtopinnan" wxPanel:iin? eli näin
wxPaintDC *dc = new wxPaintDC(paneeli);
en ole koittanut.
Nyt tuli sellainen ongelma että en saa ohjelmaa sammumaan tuon OnErase() kanssa.
void Ikkuna::OnErase(wxEraseEvent& event) { wxClientDC* clientDC = NULL; if (!event.GetDC()) clientDC = new wxClientDC(this); wxDC* dc = clientDC ? clientDC : event.GetDC() ; wxSize sz = GetClientSize(); wxEffects effects; effects.TileBitmap(wxRect(0, 0, sz.x, sz.y), *dc, wxBITMAP(TAUSTA)); if (clientDC) delete clientDC; }
ja
BEGIN_EVENT_TABLE(Ikkuna, wxWindow) EVT_ERASE_BACKGROUND(Ikkuna::OnErase) END_EVENT_TABLE()
Ilman noita valikot yms. toimivat hyvin ja ohjelma sammuu kun OnQuit:tia kutsutaan.
PS: muut eventit ovat suoraan Connect():lla, mutta niitä ei ole paljoa ja ne eivät tähän vaikuta.
Mikset oo tuotakin tehnyt Connect():lla? Joo tuosta ei ainakaan selviä miks se ei sammu?(Ehkä joku viisaampi näkee). Jos sais vähän enemmän tuota koodia niin ehkä silloin näkis, että missä on vika.
Jalmari91 kirjoitti:
Mikset oo tuotakin tehnyt Connect():lla? Joo tuosta ei ainakaan selviä miks se ei sammu?(Ehkä joku viisaampi näkee). Jos sais vähän enemmän tuota koodia niin ehkä silloin näkis, että missä on vika.
En tiedä :P voisihan ne kaikki tuohon taulukkoonkin laittaa. Tässä kumminkin koodia. En tiennyt missäpäin vika on niin laitan kaiken.
#ifndef HEADER_H #define HEADER_H #define IKONI 1 #define TAUSTA 20 #define EKA 21 /**************************************** * IKKUNALUOKKA * * Täällä itse ikkuna yms. * * ****************************************/ class Ikkuna : public wxFrame { public: Ikkuna(wxWindow *parent, wxWindowID id, const wxString &title); void OnQuit(wxCommandEvent &event); void OnErase(wxEraseEvent &event); wxMenuBar *valikko; wxMenu *menu; protected: DECLARE_EVENT_TABLE(); }; BEGIN_EVENT_TABLE(Ikkuna, wxWindow) EVT_ERASE_BACKGROUND(Ikkuna::OnErase) END_EVENT_TABLE() Ikkuna::Ikkuna(wxWindow *parent, wxWindowID id, const wxString &title) : wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxSize(640,480)) { wxIcon iKoni; iKoni.LoadFile(wxT("IKONI")); //Ladataan ja asetetaan ikoni SetIcon(wxIcon(wxT(iKoni))); valikko = new wxMenuBar; menu = new wxMenu; valikko->Append(menu, wxT("&Aloita")); menu->Append(wxID_CLOSE, wxT("&Sulje")); SetMenuBar(valikko); Connect(wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(Ikkuna::OnQuit)); wxBoxSizer *aaa = new wxBoxSizer(wxVERTICAL); //nappulahärpäkkeistä ei kannata välittää aaa->Add(new wxPanel(this, -1,wxPoint(0,0), wxSize(0,0), wxSUNKEN_BORDER)); aaa->Add(new wxButton(this,EKA,wxT("ax + b = c"), wxPoint(20,40),wxSize(100,100), wxBORDER_STATIC)); Centre(); } void Ikkuna::OnQuit(wxCommandEvent &event) { Close(true); } void Ikkuna::OnErase(wxEraseEvent& event) //taustan piirto täällä { wxClientDC* clientDC = NULL; if (!event.GetDC()) clientDC = new wxClientDC(this); wxDC* dc = clientDC ? clientDC : event.GetDC() ; wxSize sz = GetClientSize(); wxEffects effects; effects.TileBitmap(wxRect(0, 0, sz.x, sz.y), *dc, wxBITMAP(TAUSTA)); if (clientDC) delete clientDC; } /************************************ * OHJELMALUOKKA * * * ************************************/ class Ohjelma : public wxApp { Ikkuna *ikkuna; public: virtual bool OnInit(); }; #endif
sekä
#include <wx/wx.h> #include <effects.h> #include "header.h" bool Ohjelma::OnInit() { ikkuna = new Ikkuna(NULL,-1,wxT("Ohjelma")); //Luodaan uusi ikkuna SetTopWindow(ikkuna); ikkuna->Show(TRUE); return TRUE; } IMPLEMENT_APP(Ohjelma)
Poistin turhia kommentteja koska ne vain epäselvensivät koodia. Epäilen että vika löytyy OnErase:n sisältä koska en device contexteista paljoa tiedä ja ne saattavat sekoittaa ohjelmaa jollain tavalla.
Vaikka vaihtaisin tuon yhden Connect():ksi niin se ei muuta mitään.
Laitappa tuonne OnQuit() funktioon sellanen rivi kun
this->Destroy()
Tuon this:n laitto ei ole pakollista, mutta ainakin itse laitan aina sen.
Kiitos paljon tuo auttoi :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.