See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [tutorial] Posez vos question sur les DLL C++  (Read 84587 times)

0 Members and 1 Guest are viewing this topic.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #250 - 30 July 2007, 16:58:56

OK, ça rentre, je vois le truc, j'ai ajouté un argument dans la fonction  pour choisir quel
display est actionné. La condition teste bien display du haut display du bas,  qui est écrit
plus bas dans le code. Quand j'actionne le display du haut la séquence du display du bas
s'éxécute aussi ...

Je vois le topo ... il faut tout conditionner ... :sick:
Ce doit être l'enfer sur des systèmes complexes.
Je commence à comprendre le pourquoi des structures et du
" Tu en as mis partout  et tu ne sais plus ou tu en es...
Normal c'est l'effet KissCool ... "

Quand je vois déjà le bordel sur deux boutons qui appellent deux displays par la même fonction :sick:



Alt F9 sur CTRL A d'un CPP, ça ne donne rien chez moi ...
Le code reste strictement dans le même état :sad:
Bon y'a plein d'options et j'ai pas pris le temps de les regarder .... ;)


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #251 - 30 July 2007, 18:56:49
Bon, ça ça fonctionne bien ...

Il reste bien un petit problème, la première surf|1] n'existe pas au lancement d'Orbiter et le Display 1
est tout noir, couleur du fond du background , alors que la surf du Display 2 est bien là et bien affichée ....
je vais bien trouver ;)
Dingue tout ce à quoi il faut penser pour faire un programme ....
Messieurs les programmeurs ...
Chapeau bas :wor:

Je met ce code ici juste pour ma culture perso et voir si les mécanismes d'un prog commence
à rentrer dans mon pauvre ciboulot  .... et puis, des réflexions de noob peuvent en
aider d'autres aussi ...

ZE QUESTION de débutant :siffle:
Y'avait il moyen de faire plus simple, plus efficace, plus mieux quoi ?
Genre, du code beau à pleurer parce qu'il est simple et efficace ...

Code: [Select]
// Dans la classe, on déclare les variables et la fonction  plus tard on mettra toutes les variables dans
une structure

         bool bDisplayStatus;
int iDisplay;
void Irridium::SwitchDisplay (bool Status, int Display);

// Dans clbkSetClassCap on initialise les variables, plus tard, grâce aux structures, ça se fera en une ligne


bDisplayStatus = 0;
iDisplay = 0;


[b]// Dans Mouse event, on teste quel bouton est tripoté et ou il est tripoté[/b]


case AID_BOUTONTOPDISPLAY:
           if (my>22)
                      SwitchDisplay(TRUE,1);
           else
                      SwitchDisplay(FALSE,1);
           return true;
case AID_BOUTONBOTTOMDISPLAY:
           if (my>22)
                      SwitchDisplay(TRUE,2);
           else
                      SwitchDisplay(FALSE,2);
           return true;


 // Dans Fonctions, on affiche les surfaces


void Irridium::SwitchDisplay (bool Status,int Display)
{
bDisplayStatus = Status;
iDisplay = Display;

if (Display ==1)
    {
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
}
else if (Display ==2)
    {
oapiTriggerPanelRedrawArea (0, AID_BOTTOMDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONBOTTOMDISPLAY);
}
if (bDisplayStatus == 0)
PlayVesselWave3(MyID,ON);
else
PlayVesselWave3(MyID,OFF);
}



// Dans Redraw event, on fabrique les surfaces à afficher



        case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==1)
{
oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton 1 ON sur la bitmap
               }
             else if (iDisplay == 1)
{
oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton 1 OFF sur la bitmap
            }
return true;
case AID_TOPDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==1)
{
oapiBlt (surf, srf[1], 0, 0, 1, 1, 100, 100); // Display 1 allume sur la bitmap
               }
             else if (iDisplay == 1)
{
oapiBlt (surf, srf[1], 0, 0, 101, 101, 100, 100); // Display 1 eteint sur la bitmap
               }
return true;
case AID_BOUTONBOTTOMDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==2)
{
oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton 2 ON sur la bitmap
               }
             else if (iDisplay == 2)
{
oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton 2 OFF sur la bitmap
               }
return true;
case AID_BOTTOMDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==2)
{
oapiBlt (surf, srf[1], 0, 0, 1, 1, 100, 100); // Display 2 allume sur la bitmap
               }
             else if (iDisplay == 2)
{
oapiBlt (surf, srf[1], 0, 0, 101, 101, 100, 100); // Display 2 eteint sur la bitmap
               }
return true;
[/b]



Message modifié ( 03-08-2007 12:34 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #252 - 30 July 2007, 21:59:25
Quote
picto a écrit:
ZE QUESTION de débutant :siffle:
Y'avait il moyen de faire plus simple, plus efficace, plus mieux quoi ?
Genre, du code beau à pleurer parce qu'il est simple et efficace ...

Oui, tout mettre dans une classe mais ca c'est hors de portée pour l'instant je crois.
Me faudrais encore deux ou trois posts pour expliquer tout ca. La faute à la souplesse
une classe on peut l'utiliser de 10 manière différente.

Une fois la classe faite il suffirais de declarer la position des boutons et leurs ID
et tout marcherais automatiquement: détection+mouvement+affichage.

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #253 - 30 July 2007, 22:11:24

J'ai lu un peu sur les classes, c'est pas le moment effectivement ... :badsmile:

Surtout que, c'est hallucinant la difficulté pour arriver à un truc bien carré.
J'ai incorporé Horizon.cpp dans le même système ON OFF ... bonjour les dégâts ...
Ca fait plein de trucs bizarres sur les surfs .... par exemple en passant du VC au panel
ou du panel du bas vers le panel central ... plus des conflits entre affichage de displays ...

Bref, c'est l'horreur ... ;)


Pic

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #254 - 30 July 2007, 22:16:57
Quote
Suite à ton PM je comprend pas pour les sons "qui joue trop vite"
Des problèmes de sons qui jouent pas à la bonne vitesse Picto?
Çà m'est arrivé dans un cas bien précis, lorsqu'un son n'est pas samplé en 22050Hz.

Il me semble avoir lu dans le header orbitersoundSDK qu'orbitersound joue en 22050 par défaut (je ne sais plus trop
si c'est générique ou uniquement avec les PlayVesselWave3 ).
Bref, avec un son en 11025, si il est joué en 22050, il sera forcément accéléré.

à voir :
BOOL PlayVesselWave3(int MyID,int WavNumber,int Loop=NOLOOP,int Volume=255,int Frequency=NULL);



Message modifié ( 30-07-2007 22:19 )

------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #255 - 30 July 2007, 22:31:32
Quote
no matter a écrit:
Il me semble avoir lu dans le header orbitersoundSDK qu'orbitersound joue en 22050 par défaut (je ne sais plus trop
si c'est générique ou uniquement avec les PlayVesselWave3 ).
Bref, avec un son en 11025, si il est joué en 22050, il sera forcément accéléré.

Non, c'est le buffer principal qui est jouée a 22050 mais chaque wav est joué a sa vitesse native
si on ne touche pas au parametre "frequency" (frequency=NULL)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #256 - 30 July 2007, 22:35:54
Non, ce n'était pas ça ...

Juste un problème de timing.
Imagines que tu joues le son Système ... puis les sons On ou Off.
J'avais viré tous les blancs sur Audacity pour alléger les fichiers.
Mais comme l'ordi va plus vite que la musique ça donnait des trucs du genre ...

Syst...o..è ...n ...me ...
Au lieu de
Système .... On ....

Suffit de refaire les sons avec les blancs qui vont bien pour que tout se joue dans l'ordre désiré.
Mais ton info est bonne à prendre quand même ;)



Message modifié ( 30-07-2007 22:36 )

Pic

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #257 - 30 July 2007, 23:05:46
Quote
Non, c'est le buffer principal qui est jouée a 22050 mais chaque wav est joué a sa vitesse native
si on ne touche pas au parametre "frequency" (frequency=NULL)
Ok, merci pour cette précision.

Sur le CTV, j'ai pourtant un son qui ne se comporte pas comme attendu.
J'ai remplacé le son d'air conditionné grâce à:
ReplaceStockSound3 (MyID,"Sound\\CTV\\CTV-1aircond.wav",REPLACE_AIR_CONDITIONNING);
Le fichier .wav est en 11025 (8bits-mono) et dans orbiter il est accéléré par rapport à l'original.
Çà n'est pas génant d'ailleurs, il passe mieux ainsi :)

J'utilise par ailleurs plein d'autre fréquences (16000Hz, 8000Hz) mais il n'y a que ce wav là qui pose problème.
J'essaierai de voir si c'est valable avec d'autre sons 11025hz 8bit mono.



Message modifié ( 30-07-2007 23:06 )

------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #258 - 31 July 2007, 02:41:43
Quote
no matter a écrit:
J'utilise par ailleurs plein d'autre fréquences (16000Hz, 8000Hz) mais il n'y a que ce wav là qui pose problème.
J'essaierai de voir si c'est valable avec d'autre sons 11025hz 8bit mono.

AAaaah oui, désolé, dans ce cas c'est différent, comme ces wav sont constamment jouée à d'autre fréquence il faut
bien faire attention a remplacer par des wav de même fréquence que l'original. (les replace j'entend)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #259 - 31 July 2007, 05:38:59
Si je définis une zone de
 
117 par 78 pixels



Puis que je la teste dans mouse event avec ceci

      static int navmode[6] = {1,2,3,4,5,6};
      int mode = navmode[(mx/39)*2 + my/39];


Je retourne bien

mode = 1 Si je clique n'importe ou dans la case 1
mode = 2 Si je clique n'importe ou dans la case 2

Etc ...

Tout le reste fonctionne, le redraw par trigger, l'appel par les
touches clavier et le vaisseau prend bien l'attitude indiquée dans
chaque case. Il n'y a que ce fichu contrôle mouse qui fait des siennes.

Ca ne fonctionne QUE si je clique sur les lignes horizontales 38 et 39 ? :wall:


[EDIT]
OOOOUUUUPPPPSSSssss .... désolé ... :sad:

J'ai trouvé le bug .... Comme je trouve super chiantes à faire les déclarations de zones actives, j'avais défini des petits carrés pour chaque bouton d'attitude en même temps que tous les autres boutons, avant de découvrir le système  par pavé  pour les autopilotes ... et  en fait ça définissait les mêmes zones à deux rangées de pixels près .... et j'avais oublié de les enlever ... les définitions précédentes ... :sick:

Ca fonctionne nickel avec le calcul du dessus !



Message modifié ( 31-07-2007 07:03 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #260 - 31 July 2007, 23:12:11
Gros problème avec les SurfHandles, mais je ne parviens pas à identifier le problème :sad:
Les surfaces se perdent quand je switche d'un panel à l'autre ou du panel au VC.

Idem au lancement d'Orbiter .... initialisations des surfs ratées ? oubliées ? j'ai beau retourner dans tous
les sens les exemples, j'ai l'impression de ne rien oublier ... et pourtant :badsmile:
Par contre pas de problème entre vue externe et vue interne.
Le Panel Générique est déconnecté.

Pour le (IDB_PANEL1-id) c'est normal, les hasards de la construction
des ressources ont placé le panel central après le panel annexe.

Code: [Select]
// --------------------
//    Dans la classe
// --------------------

const int nsurf = 4;
    SURFHANDLE srf[nsurf];

// --------------------
//    Dans Panel.cpp
// --------------------

// --------------------------------------------------------------
// Constructeur
// --------------------------------------------------------------

Irridium::Irridium (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
int i;
 for (i = 0; i < nsurf; i++)
                   srf[i] = 0;
DefineAnimations ();
}

// --------------------------------------------------------------
// Destructeur
// --------------------------------------------------------------

Irridium::~Irridium ()
{
ReleaseSurfaces();
}

// --------------------------------------------------------------
// Release bitmaps used for panel animations
// --------------------------------------------------------------

void Irridium::ReleaseSurfaces ()
{
for (int i = 0; i < nsurf; i++)
if (srf[i]) {
oapiDestroySurface (srf[i]);
srf[i] = 0;
}
}

// --------------------------------------------------------------
// Load panel animation bitmaps and initialise panel state
// --------------------------------------------------------------

void Irridium::InitPanel (int panel)
{
srf[0] = oapiCreateSurface (LOADBMP (IDB_SLIDER1));
srf[1] = oapiCreateSurface (LOADBMP (IDB_BITMAP1));
srf[2] = oapiCreateSurface (LOADBMP (IDB_BITMAP2));
srf[3] = oapiCreateSurface (LOADBMP (IDB_HORIZON));     oapiSetSurfaceColourKey (srf[3], 0);
}


// --------------------------------
// Load 2-D instrument panel mode  
// --------------------------------


bool Irridium::clbkLoadPanel (int id)
{

ReleaseSurfaces();

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
   Etc... etc ...



Message modifié ( 03-08-2007 12:27 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #261 - 31 July 2007, 23:29:26
Code: [Select]
bool Irridium::clbkLoadPanel (int id)
{

ReleaseSurfaces();

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
   Etc... etc ...
   [glow=yellow,2,300]//C'est justement la que ca m'interessais[/glow] :rant:

[glow=yellow,2,300] t'a mis tout a la fin ici [/glow]"InitPanel();" ?

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #262 - 31 July 2007, 23:37:30
Ah ben ... comme là ça ne cause plus surfs  ... je me disais :sad:
Oui, j'ai le initpanel et return hBmp != NULL; aussi
Je t'épargne les registers panel quand même :sad:

Code: [Select]
bool Irridium::clbkLoadPanel (int id)
{

ReleaseSurfaces();

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
MFDSPEC mfds_left  = {{232, 59,  521, 349}, 6, 6, 30, 45};
MFDSPEC mfds_right = {{760, 59, 1049, 349}, 6, 6, 30, 45};

switch (id) {
case 0: // main panel
oapiRegisterPanelBackground (hBmp,PANEL_ATTACH_BOTTOM|PANEL_MOVEOUT_BOTTOM,0xffffff);
oapiSetPanelNeighbours (-1,-1,-1,1);
SetCameraDefaultDirection (_V(0,0,1));
         
break;
case 1: //  Bottom Panel
oapiRegisterPanelBackground (hBmp, PANEL_ATTACH_TOP|PANEL_MOVEOUT_TOP, 0xffffff);
oapiSetPanelNeighbours (-1,-1,0,-1);

break;
}
InitPanel (id);
return hBmp != NULL;
}



Message modifié ( 03-08-2007 12:28 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #263 - 31 July 2007, 23:40:18
Un des problème que tu a je crois c'est que tu fait beaucoup de copier/coller sans vraiment tout comprendre je me
trompe ? :badsmile:

On parlait du peu de bug en pm c'est beaucoup du a ca, quand tu "créera" ton code (donc en ayant completement
compris ce que tu faisais) il y en aura beaucoup moins.

C'est pas du tout une critique note, juste un constatation, c'est la bonne methode car c'est vraiment motivant
de "faire" plutot que de ce taper des "cout>>hello world" mais en paralllele il faut vraiment essayer de comprendre
avant de copier/coller comment marche le code que tu va copier. Ca te permet de l'adpater a tes besoin sans tomber
dans des bug triviaux.

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #264 - 31 July 2007, 23:43:50
Quote
picto a écrit:
Ah ben ... comme là ça ne cause plus surfs  ... je me disais :sad:
Oui, j'ai le initpanel et return hBmp != NULL; aussi

Ce beug toujours ?

Si oui fout un breakpoint (F9) sur tes routines d'affichage (clbkredraw) et regarde si tout tes handle (surf[ ]
sont correct (!=NULL non egal à zéro)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #265 - 31 July 2007, 23:48:24

Ben ... le comprendre ... c'est sur des détails ... :sad:
Comment fonctionne une fonction ... le vocabulaire.
Mais tous ces trucs de constructeur destructeur je n'y comprend rien.
Je trouve les choses redondantes.

Par exemple la fonction  ReleaseSurfaces();
Je comprend qu'elle serve en destructeur, pour effacer les handles de surfaces.
Mais alors pourquoi est elle utilisée au début de initpanel ?


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #266 - 31 July 2007, 23:56:05
Quote
picto a écrit:
Par exemple la fonction  ReleaseSurfaces();
Je comprend qu'elle serve en destructeur, pour effacer les handles de surfaces.
Mais alors pourquoi est elle utilisée au début de initpanel ?

Je pensais justement a ca en me disant que tu n'avais pas pigé le principe de InitPanel (int panel)
... comme tu vois on lui passe l'id car le shuttleA charge différente surface suivant le panel affiché (optimisation)

donc surf[ 0 ] de panel 0 n'est pas egal a surf[ 0] de panel 1

Code: [Select]
InitPanel (int panel)
{
switch (panel) {
case 0:
srf[0] = oapiCreateSurface (LOADBMP (IDB_SLIDER1));
srf[1] = oapiCreateSurface (LOADBMP (IDB_SWITCH1));
srf[2] = oapiCreateSurface (LOADBMP (IDB_BUTTON1));
break;
case 1:
srf[0] = oapiCreateSurface (LOADBMP (IDB_SWITCH2));
srf[1] = oapiCreateSurface (LOADBMP (IDB_SWITCH3));
srf[2] = oapiCreateSurface (LOADBMP (IDB_SWITCH4));
srf[3] = oapiCreateSurface (LOADBMP (IDB_INDICATOR1));
srf[4] = oapiCreateSurface (LOADBMP (IDB_INDICATOR2));
break;
}
}

tu vois panel 0 surf[ 0] = IDB_SLIDER1 mais panel 1 surf[ 0 ] on a IDB_SWITCH2 a la place.
C'est pour ca que les surface sont détruite au debut du clbkPanel et reconstruite la la fin.
Perso je reprouve franchement cette maniere d'utiliser les même handles pour différente
chose , c'est le piege ca, mais bon.

Toi en fait ca sert pratiquement a rien car panel 0 ou 1 tu charge les même surfaces.
Cela dis le prob peut venir des coordonnée oapiBlit non reinitialisée mais on peut tourner en rond
longtemps, envoie moi un chti mail je regarde...

Dan



Message modifié ( 31-07-2007 23:57 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #267 - 01 August 2007, 00:08:01

D'accord, je vois bien le truc ...
Et encore, je n'ai rien fait sur le panel du bas ...
J'ose pas imaginer les CTD  à cause des surfs. :sick:

J'apprend en même temps sur les Handles.
Il y a quand même des principes qui rentrent bien.
Par exemple, quand j'ai fait les sliders sur le modèle du ShuttleA, je n'avais
encore rien touché sur les moteurs et autres propellant handles...

J'te raconte pas le CTD au démarrage d'Orbiter.
Il ne m'a pas fallu longtemps pour savoir d'ou venait le problème.
Donc plouf ... un chtit copié collé des moteurs du Shuttle, en attendant autre chose
et pour pouvoir continuer à bosser sur le panel ...

Le mesh aussi c'est le shuttle pour le moment ;)


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #268 - 01 August 2007, 00:53:28
ok, juste en regardant le code une permier intuition (ca compile pas evidemment :badsmile: )

Faute de logique:

Par exemple la:
Code: [Select]
case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==1)
            {
                      oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton allume sur le bitmap
             }
             else if (iDisplay == 1)
            {
                      oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton eteint sur le bitmap
            }

bDisplayStatus c'est si le bouton est allumé ou eteint, très bien, par contre si je comprend bien iDisplay lui peut
prendre la valeur "2" (panel du bas)

A omn avis quand tu reviens du panel du bas iDisplay!=1 comme aucune condition n'est vrai tu a tout simplement pas
de oapiBlt.


Code: [Select]
           if (bDisplayStatus == 1 && iDisplay ==1)   // faux vu que iDisplay!=1
            else if (iDisplay == 1)  // faux aussi pour la meme raison

... donc.. fait rien pas de oapiBlt... surface remplie avec du bordel.
                         

Dans ce bout de code "iDisplay" ne te sert strictement a rien d'ailleurs... BOUTONTOPDISPLAY sera appelé de toute
facon que quand panel du haut affiché... Et les "oapiTriggerRedaw" envoie une demande de rafraichissement, tu t'en
fous quel panel est affiché Orbiter ce demerde et ne rafraichi ce qui est a l'ecran..

Ca c'est tout pourris: Le premier parametre c'est l'id du panel donc main=0 bas probablement 1
la tu trigger que pour le main panel (ca marche ??? 8o )
Code: [Select]
void Irridium::SwitchDisplay (bool Status,int Display)
{
bDisplayStatus = Status;
iDisplay = Display; ca sert probablement a rien ca
if (Display ==1)
    {
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
}
else if (Display ==2)
    {
oapiTriggerPanelRedrawArea (0, AID_BOTTOMDISPLAY);  // id du bottom n'est pas zéro
oapiTriggerPanelRedrawArea (0, AID_BOUTONBOTTOMDISPLAY);
}
}

Je te propose de virer definitivement iDisplay de partout et de faire comme ca:

Code: [Select]
void Irridium::SwitchDisplay (bool Status)
{
bDisplayStatus = Status;
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
oapiTriggerPanelRedrawArea (1, AID_BOTTOMDISPLAY);
oapiTriggerPanelRedrawArea (1, AID_BOUTONBOTTOMDISPLAY);
}

Si le panel 0 ou 1 n'est pas a l'ecran on s'en fout,Orbiter ignorera ta demande et ne traitera que le panel affiché.
(control que l'id du panel du bas est 1 sinon change le premier parametre simplement)


Et dans ce genre de truc aussi exemple ici:
Code: [Select]
case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1)
             {
                      oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton allume sur le bitmap
             }
             else
             {
                      oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton eteint sur le bitmap
            }

La t'est sur qu'un des deux oapiBlt sera affiché dans n'importe quel situation.

Tu pige le gag ?


Dan



Message modifié ( 01-08-2007 00:56 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #269 - 01 August 2007, 00:57:38
J'ai pas été plus loins, essaie ca et on verra ce qui reste comme bug ;)

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #270 - 01 August 2007, 01:00:56
pour virer completement et facilement une variable de classe vire la du header et compile,
quand t'aura clearé toutte les erreurs car elle manque elle aura disparu de partout ;)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #271 - 01 August 2007, 01:06:30
Nan, c'est pas ça du tout ton analyse du code... :sad:

Il y a deux boutons qui commandent deux displays sur le même panel !
J'ai donc ajouté un flag pour que la fonction redessine bien en même temps le bouton ET le display
concerné ... quatre trucs à redessiner selon le cas mais toujours deux par deux.

bool Status : c'est le display est il allumé ou éteint ? ... oui ... non ...
int Display : c'est est ce le bouton du display 1 ou le bouton du display 2 qui a été tripoté ? ... oui ... non ...

Process ...

Ca fonctionne chez moi ....



Message modifié ( 01-08-2007 01:07 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #272 - 01 August 2007, 01:10:55
Oooops désolé, j'avais pas pigé ce que tu bricolais avec SwitchDisplay

Bon probablement que tu garde le status de chaque ecran, allumé ou éteint ?            
dans ce qua tu peux pas garder avec une variable (bDisplayStatus) seulement le status de 3 écran
T'a pas 1 bouton on/off pour trois ecran chez toi ?

Va falloir 3 "bDisplayStatus"

Comprendo ?

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #273 - 01 August 2007, 01:11:31
bon c'est un chat ici :) attend je lis, je pige et je te dis...

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #274 - 01 August 2007, 01:11:51
Un partie de ce que je t'ai dis est bonne...

Dan