[TRUKéASTUCE] Faire de l'affichage plein écran en cocoa.

BruBru Membre
Pour faire de l'affichage en plein écran en cocoa sans passer par les apis CoreGraphics, il suffit de créer une fenêtre sans titre et sans bordure (NSBorderlessWindowMask), dont la taille est celle de l'écran principal.

L'exemple ci-dessous permet de mettre une vue (view) en plein écran :

<br />- (void)setFullScreen:(NSView *)view<br />{<br />    NSRect r;<br />    NSWindow *fw;<br />    r=[[NSScreen mainScreen] frame];<br />    fw=[[NSWindow alloc] initWithContentRect:r<br />            styleMask:NSBorderlessWindowMask<br />            backing:NSBackingStoreBuffered<br />            defer:YES<br />            screen:[NSScreen mainScreen]];<br />    [fw setLevel:NSScreenSaverWindowLevel];<br />    [fw setContentView:view];<br />    [fw orderFrontRegardless];<br />}<br />


(référence:NSWindow).

.

Réponses

  • muqaddarmuqaddar Administrateur
    06:12 modifié #2
    Trop cool cette astuce !
    J'ai envie de faire un prog juste pour qu'il y ait cette possibilité !
  • ClicCoolClicCool Membre
    06:12 modifié #3
    Tiens ? Salut Bru ;)

    Je savais bien qu'avec une fenêtre on pouvait le faire, il ne me manquait que le:
    [fw setLevel:NSScreenSaverWindowLevel];<br />
    


    C'est sur c'est un truc à  garder sous le coude ça :)
    Merci ++
  • 06:12 modifié #4
    Sans oublier

    CGDisplayCapture(kCGDirectMainDisplay);
    et
    CGDisplayRelease(kCGDirectMainDisplay);

    POur du "vrai" FS.

    Et un [(NSWindow*) setLevel:CGShieldingWindowLevel()] pour faire passer devant une fenêtre.

    Ansi que : http://developer.apple.com/technotes/tn2002/tn2062.html
  • ChachaChacha Membre
    06:12 modifié #5
    Salut,

    Je viens juste d'avoir besoin du code suivant, qui marche très bien :

    dans 1099676430:

    Pour faire de l'affichage en plein écran en cocoa sans passer par les apis CoreGraphics, il suffit de créer une fenêtre sans titre et sans bordure (NSBorderlessWindowMask), dont la taille est celle de l'écran principal.

    L'exemple ci-dessous permet de mettre une vue (view) en plein écran :

    <br />- (void)setFullScreen:(NSView *)view<br />{<br />    NSRect r;<br />    NSWindow *fw;<br />    r=[[NSScreen mainScreen] frame];<br />    fw=[[NSWindow alloc] initWithContentRect:r<br />            styleMask:NSBorderlessWindowMask<br />            backing:NSBackingStoreBuffered<br />            defer:YES<br />            screen:[NSScreen mainScreen]];<br />    [fw setLevel:NSScreenSaverWindowLevel];<br />    [fw setContentView:view];<br />    [fw orderFrontRegardless];<br />}<br />
    


    (référence:NSWindow).

    .


    Cependant, j'ai un souci. Je me suis servi de ce code pour faire passer une vue en plein écran. Mais quand j'appuie sur Echap, j'aimerais repasser en mode normal. Donc je release ma fullScreenWindow, je fais un makeKeyAndOrderFront sur l'ancienne fenêtre toute bête de mon MyDocument, je fais même un setLevel:NSNormalWindowLevel sur cette dernière, mais impossible de quitter le plein écran !
    Que faut-il faire ?

    +
    Chacha
  • cbrandtcbrandt Membre
    06:12 modifié #6
    orderOut avant le release ?
  • ChachaChacha Membre
    06:12 modifié #7
    dans 1110549003:

    orderOut avant le release ?

    Déjà  essayé (sans succès...) !
    Mais c'était forcément une bonne idée, puisqu'on l'a eue tous les deux
  • fouffouf Membre
    06:12 modifié #8
    Essaye un Pomme-W ??
    D'ailleurs, comment t'as fait pour régler le pb (enlever le premier plan)
  • ChachaChacha Membre
    06:12 modifié #9
    dans 1110553702:

    Essaye un Pomme-W ??
    D'ailleurs, comment t'as fait pour régler le pb (enlever le premier plan)

    Je pense que tu n'as pas compris le problème: grâce au code de Bru, on passe une NSView en plein écran. Le truc, c'est que je n'arrive pas à  quitter le mode plein écran et revenir à  des fenêtres normales.
  • fouffouf Membre
    06:12 modifié #10
    En effet, je n'avais pas compris. Autant pour moi.
  • BruBru Membre
    06:12 modifié #11
    dans 1110555460:

    Je pense que tu n'as pas compris le problème: grâce au code de Bru, on passe une NSView en plein écran. Le truc, c'est que je n'arrive pas à  quitter le mode plein écran et revenir à  des fenêtres normales.


    C'est étrange, car moi, orderOut: fonctionne correctement pour masquer la fenêtre.

    Voici le code que j'utilise pour passer du plein écran en normal et vice-versa :
    [tt]
    {
    NSView *v;
    if (pleinEcran)
    {
    v=[[fenPleinEcran contentView] retain];
    [fenPleinEcran orderOut:nil];
    [fenPleinEcran setContentView:nil];
    [fenPrincipale setContentView:v];
    [v release];
    [fenPrincipale orderFront:nil];
    [fenPleinEcran release];
    pleinEcran=NO;
    }
    else
    {
    v=[[fenPrincipale contentView] retain];
    [fenPrincipale orderOut:nil];
    [fenPrincipale setContentView:nil];
    [self setFullScreen:v];
    pleinEcran=YES;
    }
    }
    [/tt]

    Note que à  chaque fois que je reviens en affichage normale, je détruis la fenêtre (fenPleinEcran) qui a servi à  faire du plein écran.

    .
  • ChachaChacha Membre
    06:12 modifié #12
    dans 1110565043:

    C'est étrange, car moi, orderOut: fonctionne correctement pour masquer la fenêtre.


    C'est bon, j'ai compris !
    En fait, c'est que moi j'utilisais
    <br />CGDisplayCapture( kCGDirectMainDisplay )<br />
    

    alors que ce n'est apparemment pas la peine. Je n'ai pas inventé ce code, c'est un exemple que j'avais trouvé en fouinant.

    +
    Chacha
  • muqaddarmuqaddar Administrateur
    06:12 modifié #13
    Je viens de me servir de ce code pour passer une Qt movie en fullscreen et lycée de Versailles.
    En modifiant quelques trucs en plus.

    Merci encore Bruno !
    ;-)
  • BruBru Membre
    06:12 modifié #14
    Je te conseille d'insérer un :
    [fenetre_plein-ecrav setHidesOnDeactivate:YES];
    ce qui permet de masquer automatiquement la fenêtre en plein écran lorsqu'elle n'est plus au premier plan.

    Ainsi, si tu fais POMME-TAB, ça permet de faire ré-apparaà®tre le bureau, la barre des menus et les autres fenêtres.

    .
  • muqaddarmuqaddar Administrateur
    06:12 modifié #15
    OK, je prends note. Merci gars.
Connectez-vous ou Inscrivez-vous pour répondre.