Comment cacher proprement la barre de la fenetre win en Plein Ecran ?

Comment cacher proprement la barre de la fenetre win en Plein Ecran ? - C++ - Programmation

Marsh Posté le 22-07-2004 à 16:26:03    

:hello:
 
Quand je passe en plein ecran mon appli win32, le coutour de la fenetre windows reste dessinée... :/
 
Je n'ai pas trouvé de bonnes méthodes pour cacher la barre de la fenêtre windows et le contour des fenetres, mis à part ca http://www.codeguru.com/Cpp/W-D/do [...] php/c3351/ mais ca parait ultra compliqué pour si peu... Moi je fais ca en quelques lignes mon passage en plein ecran... :??:
 
Donc pour l'instant la seule mehode que j'ai trouvé c'est de dessiner la fenetre en la decallant en haut à gauche, et en la dessinant plus grande... D'ailleurs cette bidouille pourrait etre très bien mais fait merder mes coordonnées, car j'ai l'impression qu'en plein ecran le pixel (0,0) est celui en haut à gauche au niveau de la barre windows... (Ce qui est normalement déssiné en bas en fenétré se retrouve hors de l'ecran au retour du mode fenétré... :/)
 
Quelqu'un à une idée pour faire ca proprement ? :)
 
Mercÿte :jap:


Message édité par Jesus Army le 22-07-2004 à 16:26:13
Reply

Marsh Posté le 22-07-2004 à 16:26:03   

Reply

Marsh Posté le 22-07-2004 à 16:56:35    

Bon beh en fait en la redessinant avec le meme decallage après le passage au mode fenétré mes coordonnées rentre dans l'ordre... :)
 
Pour ceux que ca interesse, après etre passé en fullscreen je fais immédiatement movewindow comme ca pour masquer les éléments de contour de la fenetre :

Code :
  1. MoveWindow(hWindow, 0, 0, SCREEN_WIDTH - NB_PIX_BARRE_GAUCHE, SCREEN_HEIGHT - NB_PIX_BARRE_HAUT, true);


 
Puis ensuite je fais pareil en ajoutant les valeur quand je repasse en fenétré, pour ne pas avoir d'éléments hors écran :

Code :
  1. MoveWindow(hWindow, 0, 0, SCREEN_WIDTH + NB_PIX_BARRE_GAUCHE, SCREEN_HEIGHT + NB_PIX_BARRE_HAUT, true);


 
Ya surement une version plus propre qui se contente de dire que l'on veut masquer tout ca, mais je n'ai pas trouvé et ca marche comme ca... Si jamais je tombe sur une methode magique je viendrais l'indiquer ici... :)

Reply

Marsh Posté le 22-07-2004 à 21:20:49    

ben tu peux dire quand tu crées ta fenetre de ne pas mettre de border non ? tu ne mets pas le flag WS_BORDER (de tête ça doit être quelquechose comme ça...). ensuite tu redimmensionne tout bêtement ta fenetre à la taille de la résolution de l'écran.

Reply

Marsh Posté le 22-07-2004 à 21:41:47    

c'est à peu près ce que fait le lien donné :

Code :
  1. // now save the old positions of the main and child windows
  2. GetWindowRect(&m_mainRect);
  3. // remove the caption of the mainWnd:
  4. LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
  5. style&=~WS_CAPTION;
  6. ::SetWindowLong(m_hWnd,GWL_STYLE,style);
  7. int screenx=GetSystemMetrics(SM_CXSCREEN);
  8. int screeny=GetSystemMetrics(SM_CYSCREEN);
  9. // resize:
  10. SetWindowPos(NULL,-4,-4,screenx+8,screeny+8,SWP_NOZORDER);
  11. style=::GetWindowLong(pChild->m_hWnd,GWL_STYLE);
  12. m_bChildMax=(style & WS_MAXIMIZE)?true:false;
  13. // note here: m_bMainMax is not needed since m_hWnd only
  14. // changed its caption...
  15. // and maximize the child window
  16. // it will remove its caption, too.
  17. pChild->ShowWindow(SW_SHOWMAXIMIZED);


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-07-2004 à 10:11:53    

Ah vi en effet ca marche très bien en enlevant le cadre avec ce ptit bou d'code : :jap:
 

Code :
  1. LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
  2.    style&=~WS_CAPTION;
  3.    ::SetWindowLong(m_hWnd,GWL_STYLE,style);


 
Par contre faut que je lui dise de le remettre pour le retour en fenétré maintenant... :D :ange:

Reply

Marsh Posté le 23-07-2004 à 10:16:02    

c'est la même chose avec |= au lieu de &=~


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-07-2004 à 10:37:34    

Ouky merci, j'etais pas trop familier avec ces opérateur, et j'etais justement en train de chercher l'inverse, mais tu m'a apporté la réponse sur un plateau... :jap: :jap:
 
Zuste une question : :ange:
 

Code :
  1. style&=~WS_CAPTION;
  2. //Qui est equivalent à :
  3. style = style & ( ~ WS_CAPTION)


sert à enlever WS_CAPTION du style et

Code :
  1. style|=WS_CAPTION;
  2. //Qui equivaut à :
  3. style = style | (WS_CAPTION)


 
sert à le rajouter c'est ca ? :)
 
Mais dans le premier cas le "&" indique que style est egal à style auquel on ajoute "moins" WS_CAPTION donc on l'enlève ? Je raconte n'importe quoi ? :ange:

Reply

Marsh Posté le 23-07-2004 à 10:58:33    

oui c'est bien ca. Revois les opérateurs booléens, c'est évident en fait

Reply

Marsh Posté le 06-08-2004 à 12:57:54    

Bon beh finalement j'ai un ptit problème quand meme... :/
 
Quand je reviens en mode fenétré j'ai l'ecran qui est rogné en bas et à droite... Pourtant quand je donne les coordonnées de la fenetre, le point (0,0) correspond bien à celui tout en haut à gauche, mais quand je repasse la résolution de l'appli je dois rajouter manuellement la taille des bordures pour que ca ne soit pas rogné... :??:
 
Et je n'arrive pas à les obtenirs, alors du coup je les rentres manuellement mais ya des risques pour ceux qui ont bidouillé la taille de leurs bordures... :/
 
Après le repassage en fenétré je dois donc faire ca, et ce pourrait être plus propre parceque le nombre de pixel des bordures rajoutées comme ca au pif c'est un peu bof tout de meme... :/
 

Code :
  1. //Recupère le style de la fenetre et en rajoute le cadre (caption)
  2.  LONG style=::GetWindowLong(hWindow,GWL_STYLE);
  3.  style|=WS_CAPTION;
  4.  ::SetWindowLong(hWindow,GWL_STYLE,style);
  5.  //Deplacement de la fenetre dans le coin haut gauche (0,0)
  6.  MoveWindow(hWindow, 0, 0, SCREEN_WIDTH + 5, SCREEN_HEIGHT + 30, true);
  7.  _bFullScreen = false; // No longer in full screen mode


Si quelqu'un sait comment faire, car j'ai passé une bonne partie de la matiné là dessus et j'ai pas trouvé de solution qui marche plus propre que ca... :/
 
Pourtant j'ai meme essayé de recuperer le rectangle d'affichage de la fenetre avant le passage en plein ecran pour ensuite le redonner au repassage en fenétré, mais bizzarement il est bcp plus grand que la fenetre et du coup j'ai un énorme contour blanc en dessous et à droite qui apparait... :/
 
Si vous avez une idée, je suis preneur ! :)
 
Mercÿte. :jap:

Reply

Marsh Posté le 09-08-2004 à 09:31:53    

GetSystemMetrics ou plus simplement :

Code :
  1. RECT rect = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
  2. AdjustWindowRect( &rect, style, FALSE );
  3. MoveWindow( hWin, rect.left, rect.top, rect.right, rect.bottom, TRUE );


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 09:31:53   

Reply

Marsh Posté le 09-08-2004 à 10:15:03    

Merci pour la réponse. :jap: Mais je ne comprends toujours pas pourquoi, j'ai encore le meme problème de cette manière...
 
Et en plus avec cette methode le point (0,0) de ma fenetre est placé tout en haut à gauche de l'ecran, et la barre supérieure de la fenetre est carrément déssinée hors écran... :/ Bon si ce n'etait que ca je pourrais rajouter le meme nombre de pixel partout au MoveWindow et ca irait mais mon image est toujours rognée en bas et à droite... :(
 
Je ne comprends pas car pour le placement du movewindows les zones "haut" et "gauche" de la fenètre sont celles hors cadres, alors que les zones "bas" et "droite" semblent bel et bien claculées par rapport au point haut gauche de la fenetre cadre compris... :??: C'est quand meme etrange cette histoire... :( :(

Reply

Marsh Posté le 09-08-2004 à 11:33:44    

En fait j'ai du mal à te comprendre :) Ton histoire de rogné je pige pas.
Pour faire simple, MoveWindow accepte la taille totale de ta fenêtre, décorations incluses. On ne peut pas spécifier une taille client à la fenêtre = taille qu'on veut à l'intérieur. Donc on utilise AdjustWindowRect pour convertir uen taille client en taille de fenêtre. Mais c'est vrai que left et top peuvent être négatifs. Il suffit de faire :
    MoveWindow( hWin, 0, 0, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE );


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-08-2004 à 13:01:15    

Beh en fait, pour simplifier ce que je dis voici ce qui arrive : Quand je demarra mon appication en fenétré et que je spécifie la résolution, celle ci s'applique à la taille de la zone à l'intérieur des decorations extérieures. Et quand je reviens du mode plein ecran, c'est la fenetre incluant les decorations qui fait la taille de la résolution.
 
Or je pensais effectivement que quand tu m'avais passé la methode avec AdjustWindowRect (après avoir été regarder son action sur msdn) que celle ci rajouterais automatiquement la taille des decos aux propriétrés du Rectrangle et que donc il n'y aurait pas de problème, mais meme avec ca et bien j'obtiens le meme résultat... :/ (Fenetre totale qui fait la résolution passé et donc partie cliente trop petite... :/ En gros, que je fasse l'ajustement du rectangle ou pas ca me retrecie juste la taille de la partie rognée... :'()
 
*** edit ***
Je viens de tester et effectivement c'etait juste à cause des coordonnées negative, ca marche à merveille avec MoveWindow( hWin, 0, 0, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE ); :)
 
Merci mille fois. :jap: :jap:


Message édité par Jesus Army le 09-08-2004 à 13:02:43
Reply

Sujets relatifs:

Leave a Replay

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