wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 3

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» Rafraichir une image
Conversation : Rafraichir une image
04-12-2007 19:06:37  Rafraichir une image #1
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Salut,
Il se trove que j'ai un petit problème celui-ci étant probablement du au rafraichissement d'une image qui est au format bmp et qui est bien trop grosse.
Donc en faite toujours sur ma carte, quand elle est petite ça ne ose pas de problème mais dès qu'elle devient un peu plus conséquence je veut dire en taille (donc en poid...) elle met super lontemps à se rafraichir entre le moment ou je clique pour coller une image et un autre clique ya un gros temps de latence don voci le bout de code (pur faire simple je vous met tous):
.cpp

Code wxWidgets:

 
RpgCarteFrame::RpgCarteFrame(wxFrame *frame, const wxString& title,int w, int h, int x, int y)
    : wxFrame(frame, -1, title)
{
    m_scrwnd=new wxScrolledWindow(this,-1);
 
    wxInitAllImageHandlers();
    couche1T = wxImage(w,h);
    couche2T = wxImage(w,h);
    couche3T = wxImage(w,h);
    m_bmpmap1 = wxBitmap(couche1T);
    m_bmpmap2 = wxBitmap(couche2T);
    m_bmpmap3 = wxBitmap(couche3T);
 
 
    m_mapctrl=new RpgStaticBitmap(m_scrwnd,-1,m_bmpmap1);
    m_mapctrl=new RpgStaticBitmap(m_scrwnd,-1,m_bmpmap2);
    m_mapctrl=new RpgStaticBitmap(m_scrwnd,-1,m_bmpmap3);
 
    m_scrwnd->SetScrollRate(20,20);
    m_scrwnd->SetVirtualSize(m_bmpmap1.GetWidth(),m_bmpmap1.GetHeight());
 
    couche1.resize( x, std::vector<int>( y, 0 ) );
    couche2.resize( x, std::vector<int>( y, 0 ) );
    couche3.resize( x, std::vector<int>( y, 0 ) );
}
 
RpgCarteFrame::~RpgCarteFrame()
{
 
}
 
// La méthode publique qui sera appelée par le contrôle wxStaticBitmap personnalisé
void RpgCarteFrame::OnMapClicked(wxMouseEvent &event)
{
    int i,j;
    wxString nomDuDossier;
    wxImage image;
    wxString nomImage;
 
    EditeurApp* prnt=(EditeurApp*)GetParent();
    wxString numeroImg =  prnt->GetImageType();
    std::cout << _T("Dans La carte : ") <<numeroImg << std::endl;
 
    wxString typeImage = numeroImg.Left(1);
    wxString FinChaine = numeroImg.AfterFirst(*typeImage);
 
 
    if(typeImage == _T("T")) nomDuDossier = _T("./textures/terrains/");
    else if(typeImage == _T("D")) nomDuDossier = _T("./textures/decors/");
    else if(typeImage == _T("C")) nomDuDossier = _T("./textures/creatures/");
    else if(typeImage == _T("P")) nomDuDossier = _T("./textures/personnages/");
    else return;
 
 
    if(typeImage != _T("D")) nomImage = nomDuDossier << FinChaine << _T(".jpg");
    else nomImage = nomDuDossier << FinChaine << _T(".png");
 
    std::cout << _T("L'image Chargee est : ") << nomImage << std::endl;
 
    image.LoadFile(nomImage,wxBITMAP_TYPE_ANY);
 
    if(typeImage == _T("D")) image.SetMaskColour(115,109,181);
    else if(typeImage == _T("C") or typeImage == _T("P")) image.SetMaskColour(191,123,200);
 
    coucheT = prnt->GetCoucheTerrain();
    switch(coucheT)
    {
        case 1:
            mdc = new wxMemoryDC(m_bmpmap1);
            break;
        case 2:
            mdc = new wxMemoryDC(m_bmpmap2);
            break;
        case 3:
            mdc = new wxMemoryDC(m_bmpmap3);
            break;
    }
    wxBitmap bmpitem(image);
 
 
 
    int x = event.GetX();
    int y = event.GetY();
 
    int h = bmpitem.GetHeight();
    int w = bmpitem.GetWidth();
 
    if(typeImage == _T("T"))
    {
        x -= (x % w);
        y -= (y % h);
    }
    else
    {
        x -= w / 2;
        y -= h / 2;
    }
 
    mdc->DrawBitmap(bmpitem,x,y,true);
    mdc->SelectObject(wxNullBitmap);
    i = x/128;
    j = y/96;
    long num = 0;
    FinChaine.ToLong(&num);
 
    switch(coucheT)
    {
        case 1:
            couche1[i][j] = num;
            m_mapctrl->SetBitmap(m_bmpmap1);
            break;
        case 2:
            couche2[i][j] = num;
            m_mapctrl->SetBitmap(m_bmpmap2);
            break;
        case 3:
            couche3[i][j] = num;
            m_mapctrl->SetBitmap(m_bmpmap3);
            break;
    }
}
 


.h

Code wxWidgets:

 
/***************************************************************
* Name:      RpgCarteFrame.h
* Purpose:   Defines Application Frame
* Author:    Brice ()
* Created:   2007-08-25
* Copyright: Brice ()
* License:
**************************************************************/

 
#ifndef RPGCARTEFRAME_H_INCLUDED
#define RPGCARTEFRAME_H_INCLUDED
 
#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif
 
#include <iostream>
#include <vector>
#include <wx/graphics.h>
 
#include <wx/scrolwin.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/bitmap.h>
#include "RpgStaticBitmap.h"
#include "RpgMain.h"
 
class RpgCarteFrame: public wxFrame
{
public:
    RpgCarteFrame(wxFrame *frame, const wxString& title,int w, int h, int x, int y);
    ~RpgCarteFrame();
    virtual void OnMapClicked(wxMouseEvent &event);
    std::vector <std::vector <int> > GetSave();
private:
    wxImage couche1T, couche2T,couche3T;
    wxScrolledWindow *m_scrwnd;
    RpgStaticBitmap *m_mapctrl;
    wxBitmap m_bmpmap1,m_bmpmap2,m_bmpmap3,bmpitem;
    int coucheT;
    wxMemoryDC *mdc;
    std::vector < std::vector <int> > couche1;
    std::vector < std::vector <int> > couche2;
    std::vector < std::vector <int> > couche3;
};
 
#endif // RPGCARTEFRAME_H_INCLUDED
 


Et donc j'avais pensé à 2 solution, une qui consisterai à crée un gride sizer de x ligne et y colone et d'y coller des petits images de 128*96 (taille d'un terrain) comme ç je n'aurai qu'a rafraichir une seule case de gridSizer et non pas toute l'image.
Et là deuxieme solution aurai constité à utiliser une bibliothèque externe, donc SFML en l'occurence qui se marie bien à wxWidgets apparement, qui me permetrai d'afficher les image beaucoup plus rapidement mais voilà le hic c'est que je ne sait pas du tout comment faire pour intégré une fenetre SFML à une fenetre wxWidgets contenant un scrollbar donc la premiere solution me semblerai la mieux auriez vous un conseille à me donner ?
De plus je ne sais pas comment le grid sizer sais dans quelle case je coche donc voilà si vous pouviez m'aider aussi je vous en serai très reconnaissant
Merci et à ++ :)

Edit : j'ai oublié de demander sinon ya un moyen de ne pas rafraichir toute l'image mais juste la zone qui change ?

Dernière modification par Warzer (04-12-2007 21:40:11)

06-12-2007 13:30:10  Re: Rafraichir une image #2
Ivory69 (Membre)
Inscrit le : 09-10-2007
Messages: 69
Snippets: 0
Tutoriels: 0
Hors ligne
Salut !

Tu as mis l'ensemble de ton code ?
Tu n'as pas de méthode OnPaint() ?
Pourquoi tu ne crées pas une classe spécifique style DragImage comme dans l'exemple de wxWidgets ?
----------
à ce que je vois, tu affiches plusieurs images l'une sur l'autre c'est ça ?
T'as un screenshot ?

Dernière modification par Ivory69 (06-12-2007 13:33:32)

06-12-2007 14:08:32  Re: Rafraichir une image #3
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Donc là ce que j'ai mit comme code c'est ce qui mer sert à crée et à placer des éléments sur la carte à dessiner quoi, Mais le problème vient pas du fait que je ne peut pas afficher d'image c'est que l'image de fond (en noir qui représente l'endroite de la carte ou il n'y a aucun terrain) et très lourde en mo je parle du fait que ce soit un bitmap voilà un petit screen.

http://i209.photobucket.com/albums/bb283/warzer/sreenShotEdit.jpg

J'ai éssayer de faire avec un grid sizer mais c'est encore plus long cette fois ci pas pour rafrachir mais pour afficher ^^
06-12-2007 14:12:58  Re: Rafraichir une image #4
Ivory69 (Membre)
Inscrit le : 09-10-2007
Messages: 69
Snippets: 0
Tutoriels: 0
Hors ligne
A oki, ton problème vient de l'image du fond c'est ça. Quand tu essayes de faire autre chose que du noir, ça ralenti c'est ça ? Elle est de quelle taille ton image de background ?
06-12-2007 14:18:41  Re: Rafraichir une image #5
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Donc l'image de fond vari selon les valeurs que j'entre au clavier grace à des wxTextCtrl et donc elle ferai minimun quand elle est assez petit genre 5 ou 10 case par 5 ou 10 case (1 case = 128*96) soit environ 1280*960 sa rafraichi relativement vite mais dès que je vais vers 20*20 (casse) soit 2560*1920 pixel ou plus ce que je veut faire et bien dès que je colle un terrain sur la map entre le moment ou je clique et le moment ou le terrain apparait il se passe plusieurs millisecondes voir secondes ^^

Dernière modification par Warzer (06-12-2007 14:19:14)

06-12-2007 14:25:59  Re: Rafraichir une image #6
Ivory69 (Membre)
Inscrit le : 09-10-2007
Messages: 69
Snippets: 0
Tutoriels: 0
Hors ligne
Je n'ai pas eu ce genre de problème parce que je définissait le background comme un collage d'une image élémentaire.
Mais peut être une piste pour toi est de définir "à la main" ton background pour ton wxScrolledWindow qui dérive de wxWidnow je crois. Regarde la méthode wxWindow::SetBackgroundStyle sur la doc avec le style wxBG_STYLE_CUSTOM. Tu peux après définir ton propre background à partir d'un bitmap (à priori). Je n'ai pas les précisions mais je vais y jeter un coup d'oeil.

Ah en fait c'est une wxFrame mais elle dérive aussi de wxWindow. ça marche aussi

Dernière modification par Ivory69 (06-12-2007 14:27:14)

06-12-2007 14:34:45  Re: Rafraichir une image #7
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Sinon je vient de penser à un truc c'est de ne pas dessiner sur une image à fond noir mais directement dans la fenetre ça marcherai ?
06-12-2007 14:36:32  Re: Rafraichir une image #8
Ivory69 (Membre)
Inscrit le : 09-10-2007
Messages: 69
Snippets: 0
Tutoriels: 0
Hors ligne
si c'est une image à fond noir pourquoi tu ne définis pas une image élémentaire noire (style 200x200) que tu reproduis ?
ceci dit ton idée peut résoudre le problème, c'est pas long à tester.
tiens moi au courant
07-12-2007 22:52:31  Re: Rafraichir une image #9
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut.

Pour intégrer SFML à wxWidgets, il y a apparement un article sur le site officiel :

Et pour le mettre dans la wxScrolledWindow, tu fais comme avec le wxStaticBitmap.

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
08-12-2007 19:12:40  Re: Rafraichir une image #10
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Je t'avouerai que la je bloque avcec SFML j'ai un peu de mal je sais pas trop comment l'intégré à un wxScrolledWindow et donc j'ai fait plein de test en crée carement une fenetre de sfml qui dérive d'une classe de sfm et wxControl mais je ne comprend pas à quoi sert wxControl comment l'utiliser et comment ça marche ?
J'ai éssayer comme ça mais ça ne fait rien :

Code wxWidgets:

 
BEGIN_EVENT_TABLE(RpgSFMLMap, wxControl)
    EVT_COMMAND(-1,wxEVT_LEFT_DOWN,RpgSFMLMap::OnSizeEvent)
END_EVENT_TABLE()
 
void RpgSFMLMap::OnSizeEvent(wxCommandEvent& event)
{
    std::cout << _T("Test du clique dans la fenetre SFML") << std::endl;
}
 


Comment doit-je m'y prendre ?
Voilà merci ++

Une idée peut être ?

Dernière modification par Warzer (15-12-2007 23:38:34)

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» Rafraichir une image