Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: wxWidgets ikkunan taustakuvan asettaminen

Sivun loppuun

alottelijaa [04.12.2008 22:37:36]

#

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.

Jalmari91 [05.12.2008 16:02:19]

#

Tuolta löytyy http://www.informit.com/articles/article.aspx?p­=405047 eli se OnErase funktio.

alottelijaa [05.12.2008 17:21:10]

#

Näyttää suunnilleen siltä mitä haen :) pitääpä koittaa kotiin päästyäni

alottelijaa [07.12.2008 12:13:46]

#

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.

Jalmari91 [07.12.2008 18:40:33]

#

Jos tajusin oikein, niin oletko koittanut tehdä sen "piirtopinnan" wxPanel:iin? eli näin

wxPaintDC *dc = new wxPaintDC(paneeli);

alottelijaa [08.12.2008 08:26:03]

#

en ole koittanut.

alottelijaa [09.12.2008 22:14:25]

#

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.

Jalmari91 [10.12.2008 17:05:38]

#

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.

alottelijaa [11.12.2008 08:21:22]

#

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.

Jalmari91 [11.12.2008 17:44:13]

#

Laitappa tuonne OnQuit() funktioon sellanen rivi kun

this->Destroy()

Tuon this:n laitto ei ole pakollista, mutta ainakin itse laitan aina sen.

alottelijaa [11.12.2008 22:37:03]

#

Kiitos paljon tuo auttoi :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta