[C++ Builder] Changer la résolution

Changer la résolution [C++ Builder] - C++ - Programmation

Marsh Posté le 07-04-2002 à 14:57:50    

Bonjour,
 
sous windows et C++ Builder, j'aimerais changer la résolution d'écran et la profondeur des couleurs. J'ai trouvé l'API suivante : ChangeDisplaySettings() , et après avoir regardé l'aide voilà le code que j'ai fait, et bien sûr ça marche pas :D
 
 

Code :
  1. #include <winuser.h>
  2. void WinMain()
  3. {
  4. DEVMODE *chgres;
  5. chgres->dmSize = sizeof(chgres);
  6. chgres->dmFields = DM_BITSPERPEL;
  7. chgres->dmFields = DM_PELSWIDTH;
  8. chgres->dmFields = DM_PELSHEIGHT;
  9. chgres->dmBitsPerPel = 16;
  10. chgres->dmPelsWidth = 800;
  11. chgres->dmPelsHeight = 600;
  12. ChangeDisplaySettings(chgres, 0);
  13. }


 
Merci de vos réponses :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 14:57:50   

Reply

Marsh Posté le 07-04-2002 à 16:29:37    

Y a pas un GetLastError()
 
Pour savoir ou est le problème?


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 07-04-2002 à 16:30:15    

Mieux que ca...
 
ChangeDisplaySettings
F1
 
 :D  
 
Return Values
 
Returns one of the following values:
 
Value Meaning
DISP_CHANGE_SUCCESSFUL The settings change was successful.
DISP_CHANGE_RESTART The computer must be restarted in order for the graphics mode to work.
DISP_CHANGE_BADFLAGS An invalid set of flags was passed in.
DISP_CHANGE_FAILED The display driver failed the specified graphics mode.
DISP_CHANGE_BADMODE The graphics mode is not supported.
DISP_CHANGE_NOTUPDATED Windows NT only: Unable to write settings to the registry.


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 07-04-2002 à 16:52:29    

salut,
 
n'ai-je point précisé que je me suis servi de l'aide ???
 
en fait il me fait un access violation, j'aurais du le préciser il est vrai...
à ton avis panzanni ???  :D  :D  :D  
 
@++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 17:06:16    

juju_le_barbare a écrit a écrit :

 
en fait il me fait un access violation, j'aurais du le préciser il est vrai...




 
Oui tu aurais dû le préciser :p
 
DEVMODE *chgres; // tu crées un pointeur
chgres->dmSize = sizeof(chgres); // tu accèdes à la valeur pointée par ce pointeur, une valeur au pif vu que tu n'as pas initialisé le pointeur : boum :)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-04-2002 à 18:37:59    

antp a écrit a écrit :

 
 
Oui tu aurais dû le préciser :p
 
DEVMODE *chgres; // tu crées un pointeur
chgres->dmSize = sizeof(chgres); // tu accèdes à la valeur pointée par ce pointeur, une valeur au pif vu que tu n'as pas initialisé le pointeur : boum :)  




 
salut OKY merci grand chef ;)
Mais alors je dois l'initialiser avec quoi le ptr ???
 
DEVMODE *chgres = ???;
 
dans l'aide il me semble pas avoir vu quoique ce soit qui l'indique (aïe je vais me faire taper sur les doigts !!! :na: )
 
@++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 18:44:30    

Avec "new":
chgres = new DEVMODE.
Mais comme DEVMODE c'est une structure et pas une classe, je sais plus si ça marche :/
C'est peut-être plus simple de pas mettre le "*" et d'y accéder alors avec un "."

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-04-2002 à 18:49:51    

antp a écrit a écrit :

Avec "new":
chgres = new DEVMODE.
Mais comme DEVMODE c'est une structure et pas une classe, je sais plus si ça marche :/
C'est peut-être plus simple de pas mettre le "*" et d'y accéder alors avec un "."  
 
 




 
merci, je vais essayer la 1st sol. si ça marche pas la 2nd.
 
Merci encore :hello:  
 
PS : pas vexé pour la photo ? C'était dans un but sympathique ...


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 18:54:46    

Non, mais tâche de ne pas recommencer :p

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-04-2002 à 19:23:02    

voici le code final qui "marche" :
 

Code :
  1. DEVMODE *chgres = new DEVMODE;
  2. chgres->dmSize = sizeof(chgres);
  3. chgres->dmFields = DM_BITSPERPEL;
  4. chgres->dmFields = DM_PELSWIDTH;
  5. chgres->dmFields = DM_PELSHEIGHT;
  6. chgres->dmBitsPerPel = StrToIntDef(ComboBox1->Text, 16);
  7. chgres->dmPelsWidth = StrToIntDef(Edit2->Text, 800);
  8. chgres->dmPelsHeight = StrToIntDef(Edit3->Text, 600);
  9. LONG A = ChangeDisplaySettings(chgres, 0);
  10. switch (A)
  11. {
  12. case DISP_CHANGE_SUCCESSFUL : ShowMessage("Résolution changée" );
  13.                                break;
  14. case DISP_CHANGE_RESTART    : ShowMessage("Veuillez redémarrer" );
  15.                                break;
  16. case DISP_CHANGE_BADFLAGS   : ShowMessage("Erreur du programme" );
  17.                                break;
  18. case DISP_CHANGE_FAILED     : ShowMessage("Impossible de déterminer le mode graphique" );
  19.                                break;
  20. case DISP_CHANGE_BADMODE    : ShowMessage("Mode graphique non supporté" );
  21.                                break;
  22. case DISP_CHANGE_NOTUPDATED : ShowMessage("Impossible d'écrire dans le registre (NT)" );
  23.                                break;
  24. default : ShowMessage("Erreur inconnue" );
  25. }


 
sous winxp : il dit que la res est changée, mais c'est faux même après reboot, sous 98 il dit "moed graphique non supporté"...
 
Where's the problem ???


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 19:23:02   

Reply

Marsh Posté le 07-04-2002 à 19:35:55    

Je sais pas...
Mais tu dois pas oublier de faire un delete de ta variable après, vu que tu l'as créée avec un new (mais c'est pas ça qui fait que ça ne marche pas).


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-04-2002 à 20:04:17    

Code :
  1. chgres->dmFields = DM_BITSPERPEL;
  2. chgres->dmFields = DM_PELSWIDTH;
  3. chgres->dmFields = DM_PELSHEIGHT;


Ca serait pas plustôt:

Code :
  1. chgres->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;


 
Parce que autrement tu dit de n'utiliser que le dernier flag spécifier... qui se trouve à être DM_PELSHEIGHT...

 

[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-04-2002 à 20:06:23    

Ventilo a écrit a écrit :

Code :
  1. chgres->dmFields = DM_BITSPERPEL;
  2. chgres->dmFields = DM_PELSWIDTH;
  3. chgres->dmFields = DM_PELSHEIGHT;


Ca serait pas plustôt:

Code :
  1. chgres->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;


 
Parce que autrement tu dit de n'utiliser que le dernier flag spécifier... qui se trouve à être DM_PELSHEIGHT...  
 
 




 
mais c'est bien sûr !!! que JE SUIS CON !!!
 
je teste, MERCI !!!


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 20:07:51    

ça marche pas :(
 
pô grave merci ;)


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 07-04-2002 à 20:28:20    

Je me suis penché sur ton problème (petit chanceux va  ;)) et je me suis rappeller que j'avais déjà fait un truc comme ca en VB. Voilà donc ce que ma donner le code après avoir modifier ton code:

Code :
  1. void ShowMessage (char *texte)
  2. {
  3. MessageBox(0,texte,"Fuck!",MB_OK | MB_ICONEXCLAMATION);
  4. }
  5. int APIENTRY WinMain(HINSTANCE hInstance,
  6.                      HINSTANCE hPrevInstance,
  7.                      LPSTR     lpCmdLine,
  8.                      int       nCmdShow)
  9. {
  10. DEVMODE *chgres = new DEVMODE;
  11. chgres->dmSize = sizeof(chgres); // on initialise le pointeur
  12. EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,chgres); //on initialise la structure avec la valeur présente
  13. chgres->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
  14. chgres->dmBitsPerPel = 16;
  15. chgres->dmPelsWidth = 640;
  16. chgres->dmPelsHeight = 480;
  17. LONG Resulta = ChangeDisplaySettings(chgres, 0); //Variable avec des noms représentatif plz :p
  18. switch (Resulta)
  19. {
  20.  case DISP_CHANGE_SUCCESSFUL:
  21.   ShowMessage("Résolution changée" );
  22.   break;
  23.  case DISP_CHANGE_RESTART:
  24.   ShowMessage("Veuillez redémarrer" );
  25.   break;
  26.  case DISP_CHANGE_BADFLAGS:
  27.   ShowMessage("Erreur du programme" );
  28.   break;
  29.  case DISP_CHANGE_FAILED:
  30.   ShowMessage("Impossible de déterminer le mode graphique" );
  31.   break;
  32.  case DISP_CHANGE_BADMODE:
  33.   ShowMessage("Mode graphique non supporté" );
  34.   break;
  35.  case DISP_CHANGE_NOTUPDATED:
  36.   ShowMessage("Impossible d'écrire dans le registre (NT)" );
  37.   break;
  38.  case -6: //devrais être DISP_CHANGE_BADDUALVIEW mais VC++ me fait chier
  39.   ShowMessage("Windows XP: The settings change was unsuccessful because system is DualView capable." );
  40.   //J'ai recopier lerreur du platforme SDK
  41.   break;
  42.  default:
  43.   ShowMessage("Erreur inconnue" );
  44. }
  45. return 0;


 
Fallait juste prendre la valeur actuelle(EnumDispleySettings) et les modifier :hello:

 

[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-04-2002 à 20:33:04    

Reply

Marsh Posté le 08-04-2002 à 09:59:37    

Ventilo a écrit a écrit :

Je me suis penché sur ton problème (petit chanceux va  ;)) et je me suis rappeller que j'avais déjà fait un truc comme ca en VB. Voilà donc ce que ma donner le code après avoir modifier ton code:
[code]
void ShowMessage (char *texte)
{
 MessageBox(0,texte,"Fuck!",MB_OK | MB_ICONEXCLAMATION);
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
 
etc...



 
Merci beaucoup, j'analyse le tout !!!
 
@++ :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed