Page 1 of 1

msgsplash alpha bitmap

Posted: Thu Jul 16, 2009 8:00 pm
by DiGregorio
Antonio, extraño no?

Estuve trabajando la funcion msgsplash() con un bitmap alpha channel, y consegui un posible error que no se si solo me sucede a mi:

Cuando esta en la pantalla el bitmap los "n" segundos que determines en la funcion, si pasas el mouse por encima de la imagen cuando esta aparece al iniciar el programa, esta imagen se va desvaneciendo y va apareciendo lo que estaba detras del bitmap.

Nota Importante: no lo hace si detras de la imagen tenemos solo el escritorio de Windows, solo lo hace si detras de la imagen tenemos programas abiertos, como por ejemplo si tenemos un dialogo de MI PC abierto y desde alli ejecutamos nuestro programa con el msgsplash la imagen aparece sin problemas y se ve muy bien, pero si pasamos el mouse encima de ella, se va desvaneciendo y van apareciendo las imagens del dialogo de MIPC, mientras que si tenemos un acceso directo en el escritorio de Windows y ejecutamos el programa, la imagen bitmap aparece directamente sobre el escritorio de Windows y al pasar el mouse la imagen pertenece intacta.

Image

Utilizo Windows Vista Ultimate

Gracias.

Re: msgsplash alpha bitmap

Posted: Thu Aug 11, 2011 12:20 pm
by MGA
Domenico,

Estou com o mesmo problema, conseguiu alguma solução para o problema ?

Muito obrigado

Re: msgsplash alpha bitmap

Posted: Thu Aug 11, 2011 6:51 pm
by Antonio Linares
Domenico,

Hemos probado a modificar la función MsgSplash() de esta forma, pero el efecto parece seguir ocurriendo pues son eventos de repintado que envia la ventana en donde se mueve el ratón:

Code: Select all

function MsgSplash( cBmpFile, nSeconds, bAction )

   local oBmp, hDC, hBmpBack, nStartAt, hWnd
   local nTop, nLeft, nBottom, nRight, nWidth, nHeight

   DEFAULT nSeconds := 5

   if Empty ( cBmpFile )
      if bAction != nil
         Eval( bAction )
      endif
      return nil
   endif

   if "." $ cBmpFile
      DEFINE IMAGE obmp FILENAME cBmpFile
   else
      DEFINE IMAGE obmp RESOURCE cBmpFile
   endif

   nWidth   = nBmpWidth( oBmp:hBitmap )
   nHeight  = nBmpHeight( oBmp:hBitmap )
   nLeft    = ( GetSysMetrics( 0 ) / 2 ) - nWidth / 2
   nTop     = ( GetSysMetrics( 1 ) / 2 ) - nHeight / 2
   nRight   = nLeft + nWidth - 1
   nBottom  = nTop + nHeight - 1
   hWnd     = GetDesktopWindow()

   hBmpBack = FWSaveScreen( hWnd, nTop, nLeft, nBottom, nRight )

   SetCapture( hWnd )
   ShowCursor( .f. )
   if oBmp:HasAlpha()
      ABPaint( hDC := GetWindowDC( hWnd ), nLeft, nTop, oBmp:hBitmap )
   else
      DrawBitmap( hDC := GetWindowDC( hWnd ), oBmp:hBitmap, nTop, nLeft )
   endif
   ReleaseDC( hWnd, hDC )
   if bAction == nil
      Sleep( nSeconds * 1000 )
   else
      nStartAt := Seconds()
      Eval( bAction, oBmp )
      if ( nSeconds -= ( Seconds() - nStartAt ) ) > 0
         Sleep( nSeconds * 1000 )
      endif
   endif
   FWRestScreen( hWnd, hBmpBack, nTop, nLeft, nBottom, nRight )
   DeleteObject( hBmpBack )

   oBmp:End()
   ReleaseCapture()
   ShowCursor( .t. )

return nil