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 : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» wxScrolledWindow
Conversation : wxScrolledWindow
04-08-2013 15:58:46  wxScrolledWindow #1
RASC (Membre)
Inscrit le : 06-01-2013
Messages: 15
Snippets: 0
Tutoriels: 0
Hors ligne
Salut,

j'ai une question concernent les wxSrolledwindow, je suis entrain de faire une application avec laquelle je peux ouvrir une image BMP. Après ça je veux refaire mon image avec une nouvelle palette, ça marche super. Alors ma question est la suivante, quand j'ai une image plus grande que la surface sur laquelle je mets mon image, est ce que je dois utiliser OnDraw(), parce que quand je refait l'image quand elle arrive à la fin elle disparaît et je n'ai plus rien dans ma srolledWindow. J’espère que quelqu'un peut m'aider.

Meilleures salutations,
RASC.

Dernière modification par RASC (04-08-2013 15:59:37)

12-08-2013 21:29:10  Re: wxScrolledWindow #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut, et désolé pour le délai de réponse (vacances ;) )

Si c'est juste une histoire d'affichage, tu devrais essayer d'utiliser un wxStaticBitmap, placé dans ta wxScrolledWindow avec un wxSizer.

Sinon, c'est bien le "OnDraw" qu'il faut utiliser.
Il y a peut-être un problème de positionnement :
- quel est le symptôme exact ? (l'image disparait d'un coup, ou progressivement ?)
- fait-voir un peu le code de ton "OnDraw", au cas où...

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
12-08-2013 23:05:43  Re: wxScrolledWindow #3
RASC (Membre)
Inscrit le : 06-01-2013
Messages: 15
Snippets: 0
Tutoriels: 0
Hors ligne
Merci Xaviou,

je me suis dis que ce serait pas la bonne date pour faire ça :). Oui elle disparaît d'un coup, mais voilà je n'ai pas de méthode OnDraw, parce que quand je n'avais pas d'image plus grande que mon wxScrolledWindow ça marché super bien. Mais j'ai vu que je pouvais utiliser la méthode OnDraw, mais je comprend pas comment l'utiliser dans mon code. Le code est le suivant:

Code wxWidgets:

 
void MainFrame::OnCreate( wxCommandEvent& event )
{
    wxClientDC dc( scrollWin );
    scrollWin->DoPrepareDC( dc );
 
    int idx = convDataVtr.size() - 1;
    int heigth = scrollWin->GetSize().GetHeight();
    int width = scrollWin->GetSize().GetWidth();
    int startPointW = 0, startPointH = 0;
    int endPointW = 0, endPointH = 0;
 
    wxPoint centerPoint( scrollWin->GetSize().GetWidth() / 2 , scrollWin->GetSize().GetHeight() / 2 );
    //If image > srolledWindow
    if( bitMapReader.bmpInfoHeader.width > ( unsigned ) scrollWin->GetSize().GetWidth() && bitMapReader.bmpInfoHeader.height > ( unsigned ) scrollWin->GetSize().GetHeight() )
    {
        //set scrollbars with image dimentions
        scrollWin->SetScrollbars( 10, 10, bitMapReader.bmpInfoHeader.width - scrollWin->GetSize().GetWidth(), bitMapReader.bmpInfoHeader.height - scrollWin->GetSize().GetHeight() );
        //Set initial points to start drawing
        startPointW = 0;
        startPointH = 0;
        //set end points for drawing
        endPointW = bitMapReader.bmpInfoHeader.width;
        endPointH = bitMapReader.bmpInfoHeader.height;
    }
    else if( bitMapReader.bmpInfoHeader.width > ( unsigned ) scrollWin->GetSize().GetWidth() || bitMapReader.bmpInfoHeader.height > ( unsigned ) scrollWin->GetSize().GetHeight() )
    {
        //If image width higher
        if( bitMapReader.bmpInfoHeader.width > ( unsigned ) scrollWin->GetSize().GetWidth() )
        {   
            //set scrollbars with image width
            scrollWin->SetScrollbars( 10, 0, bitMapReader.bmpInfoHeader.width, 0 );
 
            //Set limits for drawing
            startPointW = 0;
 
            endPointW = bitMapReader.bmpInfoHeader.width;
 
            if( bitMapReader.bmpInfoHeader.height % 2 == 0 )
                startPointH = centerPoint.y - bitMapReader.bmpInfoHeader.height / 2;
            else
                startPointH = centerPoint.y - ( ( int ) ( bitMapReader.bmpInfoHeader.height / 2 ) + 1 );
 
            endPointH = bitMapReader.bmpInfoHeader.height / 2;
        }//If image height higher
        else if( bitMapReader.bmpInfoHeader.height > ( unsigned ) scrollWin->GetSize().GetHeight() )
        {
            //set scrollbars with image width
            scrollWin->SetScrollbars( 0, 10, 0, bitMapReader.bmpInfoHeader.height );
 
            //Set limits for drawing
            startPointH = 0;
            endPointH = bitMapReader.bmpInfoHeader.height;
 
            if( bitMapReader.bmpInfoHeader.width % 2 == 0 )
                startPointW = centerPoint.x - bitMapReader.bmpInfoHeader.width / 2;
            else
                startPointW = centerPoint.x - ( ( int ) ( bitMapReader.bmpInfoHeader.width / 2 ) + 1 );
 
            endPointW = centerPoint.x + bitMapReader.bmpInfoHeader.width / 2;
        }
    }
    else //Image < scrolledWindow
    {
        if( bitMapReader.bmpInfoHeader.width % 2 == 0 )
            startPointW = centerPoint.x - bitMapReader.bmpInfoHeader.width / 2;
        else
            startPointW = centerPoint.x - ( ( int ) ( bitMapReader.bmpInfoHeader.width / 2 ) + 1 );
 
        if( bitMapReader.bmpInfoHeader.height % 2 == 0 )
            startPointH = centerPoint.y - bitMapReader.bmpInfoHeader.height / 2;
        else
            startPointH = centerPoint.y - ( ( int ) ( bitMapReader.bmpInfoHeader.height / 2 ) + 1 );
 
        endPointW = centerPoint.x + bitMapReader.bmpInfoHeader.width / 2;
        endPointH = centerPoint.y + bitMapReader.bmpInfoHeader.height / 2;
    }
 
    wxPoint startPoint( startPointW , startPointH );
 
    wxPoint endPoint( endPointW, endPointH );
 
    wxPoint currentPoint( endPoint.x,startPoint.y );
 
    for( currentPoint.y; currentPoint.y < endPoint.y; currentPoint.y++ )
    {
        for( currentPoint.x; currentPoint.x > startPoint.x; currentPoint.x-- )
        {
            if( convDataVtr.at( idx ) <= 0x0F )
                dc.SetPen( wxPen( wxColour( wxT("#00000") + wxString::Format( "%X", convDataVtr.at( idx ) ) ) ) );
            else if( convDataVtr.at( idx ) <= 0xFF )
                dc.SetPen( wxPen( wxColour( wxT("#0000") + wxString::Format( "%X", convDataVtr.at( idx ) ) ) ) );
            else if( convDataVtr.at( idx ) <= 0xFFF )
                dc.SetPen( wxPen( wxColour( wxT("#000") + wxString::Format( "%X", convDataVtr.at( idx ) ) ) ) );
            else if( convDataVtr.at( idx ) <= 0xFFFF )
                dc.SetPen( wxPen( wxColour( wxT("#00") + wxString::Format( "%X", convDataVtr.at( idx ) ) ) ) );
            else if(  convDataVtr.at( idx ) <= 0xFFFFF )
                dc.SetPen( wxPen( wxColour( wxT("#0") + wxString::Format( "%X", convDataVtr.at( idx ) ) ) ) );
            else
                dc.SetPen( wxPen( wxColour( wxT("#") + wxString::Format( "%X", convDataVtr.at( idx ) ) ) ) );
 
            dc.DrawPoint( currentPoint );
            idx--;       
        }
 
        currentPoint.x = endPoint.x;
    }
}
 

Meilleures salutations,
RASC.
12-08-2013 23:40:19  Re: wxScrolledWindow #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Le processus de mise en place de la méthode "OnDraw" fonctionne comme pour un clic sur un bouton.
La différence se situe au niveau du paramètre : il ne s'agit plus d'un wxCommandEvent, mais d'un wxPaintEvent

Code wxWidgets:

void MainFrame::OnDraw(wxPaintEvent &event)

Et l'événement à intercepter n'est plus, pour l'exemple d'un clic sur un bouton, un wxEVT_COMMAND_BUTTON_CLICKED (ou EVT_BUTTON si tu utilises une table statique d'événements) mais un wxEVT_PAINT.

Il faut que l'événement concerne la wxScrolledWindow, et non la wxFrame. Tu vas donc devoir utiliser la connexion dynamique des événements.

Voici la marche à suivre :
A la fin du constructeur de ta frame, tu ajoutes un ligne du style :

Code wxWidgets:

scrollWin->Connect(wxEVT_PAINT, wxPaintEventHandler(MainFrame::OnDraw), NULL, this);

Ensuite, pour le contenu de la méthode "OnDraw", c'est le même que celui de ton actuelle "OnCreate", sauf pour le début (les 2 premières lignes sont à supprimer, et à remplacer par celle ci-dessous):

Code wxWidgets:

void MainFrame::OnDraw(wxPaintEvent &event)
{
    wxPaintDC dc(scrollWin);
 
    ......
}
 


Ensuite, tu pourras virer tout le code de ta fonction "OnCreate" et le remplacer par :

Code wxWidgets:

void MainFrame::OnCreate( wxCommandEvent& event )
{
    scrollWin->Refresh();
}
 


@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
15-08-2013 17:43:16  Re: wxScrolledWindow #5
RASC (Membre)
Inscrit le : 06-01-2013
Messages: 15
Snippets: 0
Tutoriels: 0
Hors ligne
Ça ne marche pas encore :( , je constate qu'il est toujours entrain de dessiner l'image en background, après avoir traité le fichier pour le refaire avec ma palette de couleurs, il se met tout de suite a dessiner l'image en background avant que je ne lui donne l'ordre de le faire, et après quand je lui donne l'ordre de dessiner sur ma wxSrolledWindow, elle se dessine mais quand elle est fini il recommence tout de suite en background, je le sais parce que je lui est mit un wxGauge dans le OnDraw, alors il est toujours entrain de me montrer qu'il y de l'activité.

Dernière modification par RASC (16-08-2013 00:16:41)

16-08-2013 18:34:07  Re: wxScrolledWindow #6
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Sinon tu as la possibilité de créer un nouveau wxBitmap en mémoire avec ton image à afficher, et tu l'affecte à un wxStaticBitmap placé dans un wxBoxSizer affecté à ta wxScrolledWindow.

Cette solution n'est à mon avis valable que si l'image à afficher ne change pas trop souvent.

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
05-09-2013 19:54:22  Re: wxScrolledWindow #7
RASC (Membre)
Inscrit le : 06-01-2013
Messages: 15
Snippets: 0
Tutoriels: 0
Hors ligne
Salut, désolé mais j'ai était en vacances.

Alors laissons les images , et si je voulais par exemple faire un logiciel qui communique avec un 
microcontrôleur, lequel à son tour est entrain de lire de signaux électriques. Alors je veux montrer dans mon logiciel ces signaux au long du temps. Je commence par un wxPanel ou wxScrolledWindow? Je veux contrôler le démarrage et l'arrêt.

Merci,
RASC.
10-09-2013 08:28:19  Re: wxScrolledWindow #8
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut.

A mon avis, pour ce genre de truc, tu devrais rester sur un wxPanel, et adapter l'affichage à la taille de la zone disponible pour "dessiner".

Regarde aussi du côté des wxBufferedDc / wxBufferedPaintDC pour l'affichage si nécessaire.

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
10-09-2013 21:08:43  Re: wxScrolledWindow #9
RASC (Membre)
Inscrit le : 06-01-2013
Messages: 15
Snippets: 0
Tutoriels: 0
Hors ligne
Ok merci pour ton aide.

RASC.
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» wxScrolledWindow