title: C++ Semi-Transparent Window SDL
body: <p>I wish to have a semi-transparent SDL background (nothing to do with sub-surfaces or images), such that instead of having a black background it is actually transparent, but the other things I draw are not.  My current code is a slightly modified copy of Code::Blocks' SDL project, similar to how various applications have rounded borders or odd shapes besides rectangles.</p>
  
  <pre><code>#ifdef __cplusplus
      #include &lt;cstdlib&gt;
  #else
      #include &lt;stdlib.h&gt;
  #endif
  #ifdef __APPLE__
  #include &lt;SDL/SDL.h&gt;
  #else
  #include &lt;SDL.h&gt;
  #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 ) &lt; 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-&gt;w - bmp-&gt;w) / 2;
      dstrect.y = (screen-&gt;h - bmp-&gt;h) / 2;
  
      // program main loop
      bool done = false;
      while (!done)
      {
          // message processing loop
          SDL_Event event;
          while (SDL_PollEvent(&amp;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-&gt;format, 0, 0, 0));
  
          // draw bitmap
          SDL_BlitSurface(bmp, 0, screen, &amp;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;
  }
  </code></pre>