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 » Développement C/C++
» WxGrid : colonnes bloquées et scrollbar
Conversation (Résolue) : WxGrid : colonnes bloquées et scrollbar
20-07-2010 14:26:29  WxGrid : colonnes bloquées et scrollbar #1
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,

Je désirerai bloquer les premières colonnes d'un wxGrid lors d'un scrolling (de la même façon que la colonnes label qui ne bouge pas lorsqu'on tire sur la scrollbar).

Malheureusement, après moultes recherches, je crains que cela ne soit pas implémenté...

Existerait t'il une solution qui éviterait de créer deux grilles liées, ou est-ce le plus simple ?

Merci !

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
20-07-2010 22:27:49  Re: WxGrid : colonnes bloquées et scrollbar #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut

milope:
Existerait t'il une solution qui éviterait de créer deux grilles liées, ou est-ce le plus simple ?
Je ne connais pas suffisamment la classe wxGrid pour pouvoir l'affirmer, mais après avoir jeté un coup d'oeil rapide à la documentation, il ne semble pas qu'il y ait quelque chose permettant de faire ça...

La solution des deux wxGrid liées me paraît la plus simple.

Sinon, tu peux peut-être regarder du côté de wxAdvTable qui semble plus complet que wxGrid.

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
21-07-2010 18:02:45  Re: WxGrid : colonnes bloquées et scrollbar #3
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Ola,

Ben effectivement, il manque quelques fonctions utiles à wxGrid :s
J'ai donc opté pour la liaison entre deux grilles.

Le seul gros problème que je rencontre concerne les scrollbars.

Mis à part le fait qu'on ne puisse pas facilement les cacher, le soucis vient de trouver un évènement à partir duquel les coordonner lorsque l'on bouge la scrollbar.

J'ai placé ma fonction permettant de le faire dans le OnPaint de ma grille, mais l'évènement ne se déclenche pas... J'ai beau tracer, le programme ne passe pas par là !

Je bloque :(

Code Cpp:

Grid1->Connect(wxEVT_PAINT,(wxObjectEventFunction)&FrameGrille::OnGrid1Paint,0,this);
 
void FrameGrille::OnGrid1Paint(wxPaintEvent& event)
{
    int X=0;
    int Y=0;
    int scale_X=0;
    int scale_Y=0;
 
    Grid1->GetScrollPixelsPerUnit(&scale_X, &scale_Y)/// recupere le nombre de pixels par unite de scroll
    Grid1->CalcUnscrolledPosition(0, 0, &X, &Y);        /// recupere le nombre d unite de scroll
 
    Grid2->Scroll(0, Y/scale_Y);                        /// en pixels
}

----------
Bon, ben j'essaye d'autres solutions mais cela pose le même genre de problèmes :

Code Cpp:

BEGIN_EVENT_TABLE(FrameGrille,wxFrame)
    EVT_COMMAND_SCROLL(ID_GRID1, FrameGrille::OnScroll)
END_EVENT_TABLE()
 
 
void FrameGrille::OnScroll(wxScrollEvent &event)
{
   /// fonction similaire à la precedente
}

Et là encore, rien ne se passe...

Crotte de Biques ! Mais comment fait on pour connecter un évènement !!?

Dernière modification par milope (26-07-2010 17:07:42)


C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
26-07-2010 17:21:06  Re: WxGrid : colonnes bloquées et scrollbar #4
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
coucou,
as tu essayé de générer un event qui va bien avec ProcessWindowEvent?
Sem
26-07-2010 17:25:51  Re: WxGrid : colonnes bloquées et scrollbar #5
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
humm c'est à dire ?

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
26-07-2010 17:37:01  Re: WxGrid : colonnes bloquées et scrollbar #6
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
coucou,
je sais pas trop où tu en es de ton investigation mais wxGrid c'est une wxScrolledWindow qui a donc ses propres scrollbars. L'event générer par ce type de fenêtre est du type EVT_SCROLLWIN si je me souviens bien.
Donc ca fait quelque chose comme ca.

Code wxWidgets:

 
BEGIN_EVENT_TABLE(FrameGrille,wxFrame)
    EVT_SCROLLWIN(ID_GRID1, FrameGrille::OnScroll)
END_EVENT_TABLE()
 
 
void FrameGrille::OnScroll(wxScrollWinEvent&event)
{
   /// fonction similaire à la precedente
}


Après, je ne sais pas exactement ce que tu souhaites faire, mais si tu veux faire scroller l'autre, il te suffit de générer un event sur l'autre wxGrid,
Sem
26-07-2010 17:51:28  Re: WxGrid : colonnes bloquées et scrollbar #7
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
ah ok! merci pour ta reponse

J'ai recherché de ce coté mais il se trouve que cette macro ne prends qu'un argument : je ne peut donc pas lui indiquer quel objet pointer, a part la frame :/

raaa ! plus je cherche et plus je me rends compte que ceux qui ont essayés se sont cassés les dents la dessus :(

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
26-07-2010 18:52:19  Re: WxGrid : colonnes bloquées et scrollbar #8
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
coucou,
tu fais un bind à ce moment la:

Code wxWidgets:

 
FrameGrille::FrameGrille(..)
{
  // Construit tes 2 grids
  m_Grid1 = new wxGrid(this, ID_GRID1, ...);
  m_Grid2 = new wxGrid(this, ID_GRID2, ...);
 
  m_Grid1->Bind(wxEVT_SCROLLWIN, &FrameGrille::OnScroll, this);
 
...
}
 
void FrameGrille::OnScroll(wxScrollWinEvent &event)
{
   // On a grid 1 qui a scroll
 
   int orientation = event.GetOrientation ();
   int position    = event.GetPosition();
 
   // Traite tout ca
...
}


Sem
27-07-2010 10:16:23  Re: WxGrid : colonnes bloquées et scrollbar #9
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,
Merci pour ton aide !
J'ai essayé tout cela, mais :
- la classe wxGrid n'a pas de membre 'Bind'
- wxEVT_SCROLLWIN n'est pas reconnu (j'ajoute '#include <wx/scrolwin.h>')

J'imagine que Connect pourrait faire l'affaire, mais le fait que la macro ne soit pas reconnue est bloquant :(

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
27-07-2010 10:42:23  Re: WxGrid : colonnes bloquées et scrollbar #10
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
bonjour,
oui excuse moi, j'ai l'habitude d'utiliser wxWidgets 2.9.1, dans la 2.8 Bind s'appelait Connect.
pour le wxEVT_SCROLLWIN ca se situe dans event.h, je te conseil de regarder ca:
http://docs.wxwidgets.org/2.8/wx_wxscro … llwinevent

Code wxWidgets:

 
FrameGrille::FrameGrille(..)
{
  // Construit tes 2 grids
  m_Grid1 = new wxGrid(this, ID_GRID1, ...);
  m_Grid2 = new wxGrid(this, ID_GRID2, ...);
 
  m_Grid1->Connect(wxEVT_SCROLLWIN_THUMBTRACK, &FrameGrille::OnScroll, this);
  m_Grid1->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, &FrameGrille::OnScroll, this);
// A toi de voir quels évenements conviendraient
 
 
...
}
 
void FrameGrille::OnScroll(wxScrollWinEvent &event)
{
   // On a grid 1 qui a scroll
 
   int orientation = event.GetOrientation ();
   int position    = event.GetPosition();
 
   // Traite tout ca
...
}

Sem
27-07-2010 10:55:04  Re: WxGrid : colonnes bloquées et scrollbar #11
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Waou ! Ca fonctionne ! :D

Me reste plus qu'a intercepter l'évènement de la molette du mulot et cela sera parfait !

Merci beaucoup pour tout !

Dernière modification par milope (27-07-2010 17:20:52)


C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
27-07-2010 17:21:03  Re: WxGrid : colonnes bloquées et scrollbar #12
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Oups, je suis allé un peu vite en besogne :
Pour vérifier si la fonction était atteinte, j'utilisais un wxMessageBox. Là ok.

Par contre, en complétant ma fonction, j'ai un beau segfault.
En y regardant de plus près, il se trouve que cela plante des que j'évoque mes grilles

Code Cpp:

Grid2->Scroll(0, position);

et effectivement, l'adresse de ma grille n'est pas bonne (après l'initialisation, elle est par ex. à 0x83de800 et se retrouve à 0x17a dans ma fonction OnScroll).

Faut donc caster ma grille avec un genre de

Code Cpp:

wxGrid* grid1 = dynamic_cast<wxGrid*>(event.GetEventObject());

Mais comment faire pour mon autre grille, qui elle n'est pas liée à l'event ?

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
28-07-2010 01:22:48  Re: WxGrid : colonnes bloquées et scrollbar #13
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
bonsoir,
on pourrait avoir un peu plus de ton code ?
ca me parait vraiment bizarre que tu ne puisses pas accéder à tes grids sans passer par l'event,
Sem
28-07-2010 09:04:01  Re: WxGrid : colonnes bloquées et scrollbar #14
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
voila un peu plus de code

Code Cpp:

#include "FrameGrille.h"
 
//(*InternalHeaders(FrameGrille)
#include <wx/intl.h>
#include <wx/string.h>
//*)
 
#include <wx/msgdlg.h>
#include <wx/settings.h>
#include <wx/gdicmn.h>
#include <wx/dcclient.h>
#include <wx/scrolwin.h>
 
//(*IdInit(FrameGrille)
const long FrameGrille::ID_TREECTRL1 = wxNewId();
const long FrameGrille::ID_GRID1 = wxNewId();
const long FrameGrille::ID_GRID2 = wxNewId();
const long FrameGrille::ID_SPLITTERWINDOW2 = wxNewId();
const long FrameGrille::ID_SPLITTERWINDOW1 = wxNewId();
//*)
 
BEGIN_EVENT_TABLE(FrameGrille,wxFrame)
    //(*EventTable(FrameGrille)
    //*)
END_EVENT_TABLE()
 
FrameGrille::FrameGrille(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size)
{
    //(*Initialize(FrameGrille)
    Create(parent, id, _("MaFrame"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxCLIP_CHILDREN, _T("id"));
    SetMinSize(wxSize(651,368));
    SplitterWindow1 = new wxSplitterWindow(this, ID_SPLITTERWINDOW1, wxPoint(176,240), wxDefaultSize, wxSP_3D, _T("ID_SPLITTERWINDOW1"));
    SplitterWindow1->SetMinSize(wxSize(10,10));
    SplitterWindow1->SetMinimumPaneSize(10);
    TreeCtrl1 = new wxTreeCtrl(SplitterWindow1, ID_TREECTRL1, wxPoint(30,328), wxDefaultSize, wxTR_DEFAULT_STYLE, wxDefaultValidator, _T("ID_TREECTRL1"));
    SplitterWindow2 = new wxSplitterWindow(SplitterWindow1, ID_SPLITTERWINDOW2, wxDefaultPosition, wxDefaultSize, wxSP_3D, _T("ID_SPLITTERWINDOW2"));
    SplitterWindow2->SetMinSize(wxSize(10,10));
    SplitterWindow2->SetMinimumPaneSize(10);
    Grid1 = new wxGrid(SplitterWindow2, ID_GRID1, wxPoint(-1,-1), wxSize(194,450), 0, _T("ID_GRID1"));
    Grid2 = new wxGrid(SplitterWindow2, ID_GRID2, wxPoint(-1,-1), wxSize(181,450), 0, _T("ID_GRID2"));
    SplitterWindow2->SplitVertically(Grid1, Grid2);
    SplitterWindow1->SplitVertically(TreeCtrl1, SplitterWindow2);
    //*)
 
    //Grid1->Connect(wxEVT_SCROLLWIN_THUMBTRACK, (wxObjectEventFunction) &FrameGrille::OnScroll, this);
    Grid1->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, (wxObjectEventFunction) &FrameGrille::OnScroll, this);
 
    Grid1->CreateGrid(0, 1);
    Grid1->SetColMinimalAcceptableWidth(5); /// taille mini des colonnes
 
    Grid2->CreateGrid(0, 1);
    Grid2->SetColMinimalAcceptableWidth(5); /// taille mini des colonnes
 
    InitSpread();
}
 
FrameGrille::~FrameGrille()
{
    //(*Destroy(FrameGrille)
    //*)
}
 
/**-------------------------------------------------------------------
//  Initialisation de la grille avec ecriture des entetes
//-----------------------------------------------------------------**/

int FrameGrille::InitSpread(void)
{
    bool bProbleme;
    bProbleme = false;
 
    /// les 7 premieres colonnes -> 1ere grille
    Grid1->InsertCols(0, iNombreColonneARemplir_Grid1-1);
    for (int i = 0; i < iNombreColonneARemplir_Grid1; i++)
        Grid1->SetColLabelValue(i, LabelColGrid1[i].NomLabel);
 
    /// le reste -> 2eme grille
    Grid2->SetRowLabelSize(0);
    Grid2->InsertCols(0, iNombreColonneARemplir_Grid2-1);
    for (int i = 0; i < iNombreColonneARemplir_Grid2; i++)
        Grid2->SetColLabelValue(i, LabelColGrid2[i].NomLabel);
 
    return 0;
}
 
void FrameGrille::OnScroll(wxScrollWinEvent &event)
{
    /// cette ligne provoque un segfault (exemple)
    Grid1->Scroll(0, 100);
 
    // sans cette ligne l'adresse n'est pas correcte
    wxGrid* grid1 = dynamic_cast<wxGrid*>(event.GetEventObject());
 
    /// apres le dynamic cast ok
    Grid1->Scroll(0, 100);
 
    /// cette ligne provoque un segfault car pas caste   
    Grid2->Scroll(0, 100);
 
    event.Skip();
}
Merci !

Dernière modification par milope (28-07-2010 17:03:04)


C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
28-07-2010 11:13:41  Re: WxGrid : colonnes bloquées et scrollbar #15
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
bonjour,
as tu essayé en passant l'eventhandler en paramètre ici

Code wxWidgets:

Grid1->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, (wxObjectEventFunction) &FrameGrille::OnScroll, NULL, this);


Sem
28-07-2010 14:28:09  Re: WxGrid : colonnes bloquées et scrollbar #16
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
He ben merci bien ! Ca marche impec !

Par contre, chose étrange, le " event.GetPosition(); " retourne toujours 0 lorsque la molette de la souris est utilisée au dessus de la grille, alors que cela devrait retourner 1...

Bof, pas grave, la moulinette

Code Cpp:

Grid1->GetScrollPixelsPerUnit(&scale_X, &scale_Y);
Grid1->CalcUnscrolledPosition(0, 0, &X, &Y);
donne le resultat attendu :)

Merci encore !

Dernière modification par milope (28-07-2010 14:38:42)


C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
28-07-2010 14:39:22  Re: WxGrid : colonnes bloquées et scrollbar #17
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Ha oui, et pis, tant que j'y suis, il y a aussi les
wxEVT_SCROLLWIN_TOP et wxEVT_SCROLLWIN_BOTTOM
(clic droit avec la souris sur le bouton flèche aux extrémités du scrollbar) qui n'ont pas l'air de fonctionner :
la grille scrolle bien respectivement vers les premières et dernières position, mais l'évènement n'est pas appelé :/

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
28-07-2010 15:00:32  Re: WxGrid : colonnes bloquées et scrollbar #18
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne
bonjour,
le clique droit n'est pas censé faire quelque chose si ?
avec un clique gauche l'event est appelé ?
Sem
28-07-2010 15:59:40  Re: WxGrid : colonnes bloquées et scrollbar #19
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Justement, si! lorsqu'on clique droit sur un des deux boutons aux extrémités du scrollbar, la grille scrolle à la 1ere ou a la dernière ligne du tableur, mais n'appelle ni wxEVT_SCROLLWIN_PAGEUP ni wxEVT_SCROLLWIN_PAGEDOWN, comme il le devrait...

Le clic gauche, sur un de ces deux boutons, appelle bien l'event adéquat : wxEVT_SCROLLWIN_LINEUP ou wxEVT_SCROLLWIN_LINEDOWN

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
28-07-2010 17:23:01  Re: WxGrid : colonnes bloquées et scrollbar #20
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne
Bon petit bilan de l'aventure, ca pourrait servir à d'autres :

Sous wxWidget 2.8, gestion d'evenements d'une wxGrid.

Le but de l'opération était de relier les évènements verticaux scroll, selection, etc... entre deux grilles séparées par un wxSplitterWindow, car on ne peut pas de base figer certaines colonnes lors d'un scroll horizontal.

Code Cpp:

#include "FrameGrille.h"
 
//(*InternalHeaders(FrameGrille)
#include <wx/intl.h>
#include <wx/string.h>
//*)
 
#include <wx/msgdlg.h>
#include <wx/settings.h>
#include <wx/gdicmn.h>
#include <wx/dcclient.h>
#include <wx/scrolwin.h>
 
s_LabelColGrid LabelColGrid1[iNombreColonneARemplir_Grid1] =
{
    { _("Grille-1_cabel_col_1")},
    { _("Grille-1_cabel_col_2")},
    { _("Grille-1_cabel_col_3")},
    { _("Grille-1_cabel_col_4")},
    { _("Grille-1_cabel_col_5")},
    { _("Grille-1_cabel_col_6")},
    { _("Grille-1_cabel_col_7")}
};
 
s_LabelColGrid LabelColGrid2[iNombreColonneARemplir_Grid2] =
{
    { _("Grille-2_cabel_col_1")},
    { _("Grille-2_cabel_col_2")},
    { _("Grille-2_cabel_col_3")},
    { _("Grille-2_cabel_col_4")},
    { _("Grille-2_cabel_col_5")},
    { _("Grille-2_cabel_col_6")},
    { _("Grille-2_cabel_col_7")},
    { _("Grille-2_cabel_col_8")}
};
 
//(*IdInit(FrameGrille)
const long FrameGrille::ID_GRID1 = wxNewId();
const long FrameGrille::ID_GRID2 = wxNewId();
const long FrameGrille::ID_SPLITTERWINDOW2 = wxNewId();
//
 
BEGIN_EVENT_TABLE(FrameGrille,wxFrame)
    //(*EventTable(FrameGrille)
    //*)
END_EVENT_TABLE()
 
FrameGrille::FrameGrille(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size)
{
    //(*Initialize(FrameGrille)
    Create(parent, id, _("MaFrame"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxCLIP_CHILDREN, _T("id"));
    SplitterWindow2 = new wxSplitterWindow(SplitterWindow1, ID_SPLITTERWINDOW2, wxDefaultPosition, wxDefaultSize, wxSP_3D, _T("ID_SPLITTERWINDOW2"));
    Grid1 = new wxGrid(SplitterWindow2, ID_GRID1, wxPoint(-1,-1), wxSize(194,450), 0, _T("ID_GRID1"));
    Grid2 = new wxGrid(SplitterWindow2, ID_GRID2, wxPoint(-1,-1), wxSize(181,450), 0, _T("ID_GRID2"));
    SplitterWindow2->SplitVertically(Grid1, Grid2);
 
    Connect(ID_GRID1,wxEVT_GRID_LABEL_LEFT_CLICK,(wxObjectEventFunction)&FrameGrille::OnGrid1LabelLeftClick);
    //*)
 
    ///----- evenements scroll en tout genre
    Grid1->Connect(wxEVT_MOUSEWHEEL, (wxObjectEventFunction) &FrameGrille::OnScrollMouseGrid1, NULL, this);
 
    Grid1->Connect(wxEVT_SCROLLWIN_THUMBTRACK, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
    Grid1->Connect(wxEVT_SCROLLWIN_LINEUP, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
    Grid1->Connect(wxEVT_SCROLLWIN_LINEDOWN, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
    Grid1->Connect(wxEVT_SCROLLWIN_PAGEUP, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
    Grid1->Connect(wxEVT_SCROLLWIN_PAGEDOWN, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
    Grid1->Connect(wxEVT_SCROLLWIN_TOP, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
    Grid1->Connect(wxEVT_SCROLLWIN_BOTTOM, (wxObjectEventFunction) &FrameGrille::OnScrollGrille1, NULL, this);
 
    Grid1->Connect(wxEVT_MOUSEWHEEL, (wxObjectEventFunction) &FrameGrille::OnScrollMouseGrid2, NULL, this);
 
    Grid2->Connect(wxEVT_SCROLLWIN_THUMBTRACK, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    Grid2->Connect(wxEVT_SCROLLWIN_LINEUP, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    Grid2->Connect(wxEVT_SCROLLWIN_LINEDOWN, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    Grid2->Connect(wxEVT_SCROLLWIN_PAGEUP, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    Grid2->Connect(wxEVT_SCROLLWIN_PAGEDOWN, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    Grid2->Connect(wxEVT_SCROLLWIN_TOP, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    Grid2->Connect(wxEVT_SCROLLWIN_BOTTOM, (wxObjectEventFunction) &FrameGrille::OnScrollGrille2, NULL, this);
    ///-----
 
    Grid1->CreateGrid(0, 1);
    Grid1->SetColMinimalAcceptableWidth(5); /// taille mini des colonnes
 
    Grid2->CreateGrid(0, 1);
    Grid2->SetColMinimalAcceptableWidth(5); /// taille mini des colonnes
 
    InitFrameGrille();
 
    RemplirSpread();
}
 
FrameGrille::~FrameGrille()
{
    //(*Destroy(FrameGrille)
    //*)
}
 
int FrameGrille::InitFrameGrille()
{
    /// initialisation de la grille
    if (InitSpread())
        return 1;
 
    Grid1->AutoSizeColumns(false);
    Grid2->AutoSizeColumns(false);
 
    return 0;
}
 
/**----------------------------------------------------------
//  Initialisation de la grille avec ecriture des entetes
//  pour tous les composants du fichiers nomenclature
//--------------------------------------------------------**/

int FrameGrille::InitSpread(void)
{
    bool bProbleme;
    bProbleme = false;
 
    /// les 7 premieres colonnes
    Grid1->InsertCols(0, iNombreColonneARemplir_Grid1-1);
    for (int i = 0; i < iNombreColonneARemplir_Grid1; i++)
        Grid1->SetColLabelValue(i, LabelColGrid1[i].NomLabel);
 
    /// le reste
    Grid2->SetRowLabelSize(0);
    Grid2->InsertCols(0, iNombreColonneARemplir_Grid2-1);
    for (int i = 0; i < iNombreColonneARemplir_Grid2; i++)
        Grid2->SetColLabelValue(i, LabelColGrid2[i].NomLabel);
 
    return bProbleme;
}
 
/**---------------------------------------------------------------
// Remplis les grilles après leur initialisation
//-------------------------------------------------------------**/

int FrameGrille::RemplirSpread()
{
    /// remplissage comme on l'entends
}
 
/**---------------------------------------------------------------
// surligne une ligne dans les deux grilles
//-------------------------------------------------------------**/

void FrameGrille::OnGrid1LabelLeftClick(wxGridEvent& event)
{
    int iNumeroLigne = event.GetRow();
 
    Grid2->SelectRow(iNumeroLigne, false);
 
    event.Skip();
}
 
/**---------------------------------------------------------------
// recupere les evenement de wxScrollWinEvent de la grille_1
// et synchronise la position verticale des deux grilles
//-------------------------------------------------------------**/

void FrameGrille::OnScrollGrille1(wxScrollWinEvent &event)
{
    event.Skip();
 
    int iPosition1 = Grid1->GetScrollPos(wxVERTICAL);
 
    Grid2->Scroll(0, iPosition1);
}
 
/**---------------------------------------------------------------
// recupere les evenement de wxScrollWinEvent de la grille_2
// et synchronise la position verticale des deux grilles
//-------------------------------------------------------------**/

void FrameGrille::OnScrollGrille2(wxScrollWinEvent &event)
{
    event.Skip();
 
    int iPosition = Grid2->GetScrollPos(wxVERTICAL);
 
    Grid1->Scroll(0, iPosition);
}
 
/**---------------------------------------------------------------
// recupere les evenement de wxMouseEvent de la grille_1
// et synchronise la position verticale des deux grilles
//-------------------------------------------------------------**/

void FrameGrille::OnScrollMouseGrid1(wxMouseEvent &event)
{
    int iPosition = event.m_wheelRotation;
    iPosition = Grid2->GetScrollPos(wxVERTICAL) - iPosition/120;
 
    Grid1->Scroll(0, iPosition);
    Grid2->Scroll(0, iPosition);
 
    // pas de event.skip() afin de ne pas passer
    //  par les evenement de wxScrollWinEvent
}
 
/**---------------------------------------------------------------
// recupere les evenement de wxMouseEvent de la grille_2
// et synchronise la position verticale des deux grilles
//-------------------------------------------------------------**/

void FrameGrille::OnScrollMouseGrid2(wxMouseEvent &event)
{
    int iPosition = event.m_wheelRotation;
    iPosition = Grid1->GetScrollPos(wxVERTICAL) - iPosition/120;
 
    Grid1->Scroll(0, iPosition);
    Grid2->Scroll(0, iPosition);
 
    // pas de event.skip() afin de ne pas passer
    //  par les evenement de wxScrollWinEvent
}

J'imagine qu'on peut faire plus élégant, mais ca marche ! :)

C::B 10.05
wx 2.8.10 (unicode), Linux et MinGW
2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» WxGrid : colonnes bloquées et scrollbar