2011-07-24 4 views
2

Je souhaite avoir un fond SDL semi-transparent (rien à voir avec des sous-surfaces ou images), de sorte que au lieu d'avoir un fond noir, il est en fait transparent, mais les autres choses que je dessiner ne sont pas. Mon code actuel est une copie légèrement modifiée du projet de SDL de Code :: Blocks, similaire à la façon dont diverses applications ont arrondi des bordures ou des formes bizarres en dehors des rectangles.C++ fenêtre semi-transparente SDL

#ifdef __cplusplus 
    #include <cstdlib> 
#else 
    #include <stdlib.h> 
#endif 
#ifdef __APPLE__ 
#include <SDL/SDL.h> 
#else 
#include <SDL.h> 
#endif 

int main (int argc, char** argv) 
{ 
    putenv("SDL_VIDEO_WINDOW_POS"); 
    putenv("SDL_VIDEO_CENTERED=1"); 

    // initialize SDL video 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     printf("Unable to init SDL: %s\n", SDL_GetError()); 
     return 1; 
    } 

    // make sure SDL cleans up before exit 
    atexit(SDL_Quit); 

    // create a new window 
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16, 
              SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_NOFRAME); 
    if (!screen) 
    { 
     printf("Unable to set 640x480 video: %s\n", SDL_GetError()); 
     return 1; 
    } 

    // load an image 
    SDL_Surface* bmp = SDL_LoadBMP("cb.bmp"); 
    if (!bmp) 
    { 
     printf("Unable to load bitmap: %s\n", SDL_GetError()); 
     return 1; 
    } 

    // centre the bitmap on screen 
    SDL_Rect dstrect; 
    dstrect.x = (screen->w - bmp->w)/2; 
    dstrect.y = (screen->h - bmp->h)/2; 

    // program main loop 
    bool done = false; 
    while (!done) 
    { 
     // message processing loop 
     SDL_Event event; 
     while (SDL_PollEvent(&event)) 
     { 
      // check for messages 
      switch (event.type) 
      { 
       // exit if the window is closed 
      case SDL_QUIT: 
       done = true; 
       break; 

       // check for keypresses 
      case SDL_KEYDOWN: 
       { 
        // exit if ESCAPE is pressed 
        if (event.key.keysym.sym == SDLK_ESCAPE) 
         done = true; 
        break; 
       } 
      } // end switch 
     } // end of message processing 

     // DRAWING STARTS HERE 

     // clear screen 
     SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); 

     // draw bitmap 
     SDL_BlitSurface(bmp, 0, screen, &dstrect); 

     // DRAWING ENDS HERE 

     // finally, update the screen :) 
     SDL_Flip(screen); 
    } // end main loop 

    // free loaded bitmap 
    SDL_FreeSurface(bmp); 

    // all is well ;) 
    printf("Exited cleanly\n"); 
    return 0; 
} 

Répondre

2

Je pense que ce que vous essayez de faire est en fait une fenêtre en forme de (parties de la fenêtre sont transparents en fonction d'un masque que vous fournissez). Il semble qu'il n'y a aucun moyen de le faire avec SDL 1.2, mais il est une fonction SDL_SetWindowShape juste pour cela dans SDL 1.3 pour lequel vous pouvez trouver un aperçu préversion here mais ce n'est pas même dans je suggère bêta pourtant si attendre jusqu'à ce qu'il soit officiellement libéré :)

1

this est un lien vers un article assez soigné sur le développement d'une application plus ancienne pour Mac OS 9, qui ne supportait pas non plus les fenêtres en forme. Il est en fait un article propre en général sur le développement de logiciels.

Mais l'idée semble assez intelligent, et je me demande si vous pourriez être en mesure de le faire fonctionner ici aussi. Au lieu d'essayer de faire un fond transparent, ils prennent en fait un écran-shot du droit d'ordinateur où leur fenêtre va aller et ensuite utiliser cet écran pour leur prise de vue arrière-plan. Lorsque l'utilisateur fait glisser la fenêtre sur l'écran, il continue à mettre à jour l'arrière-plan avec de nouvelles captures d'écran. Je pense que cela pourrait être plus compliqué que ce que vous espériez, mais c'est certainement une idée intéressante.

Questions connexes