Page 1 of 1

¿Evitar sustitución de color en BTNBMP? *SOLUCIONADO*

PostPosted: Fri Jul 18, 2014 10:48 am
by AngelSalom
Buenas amigos, tengo necesidad de usar imágenes en botones y pretendo usar BTNBMP.
Con este simple ejemplo :

Code: Select all  Expand view
#include "fivewin.ch"

Function Main()
Local oDlg, oBtn

   DEFINE DIALOG oDlg

   @ 3, 5 BTNBMP oBtn SIZE 80, 48 FILE "bdbar.BMP" ACTION MsgInfo ('Hola')

   ACTIVATE DIALOG oDlg CENTERED

return nil


... se me sustituye todo el color azul del botón por el color de fondo del botón o diálogo. ¿Cómo se puede evitar esto?
La imagen sólo tiene dos colores, azul y blanco.

El botón
Image

El resultado
Image

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Fri Jul 18, 2014 1:10 pm
by karinha
En realidad, esta BITMAP está dañado.

Intercambiado por otro BMP, ejemplo: EMAIL.BMP y funcionó correctamente.

Saludos.

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Fri Jul 18, 2014 1:25 pm
by AngelSalom
No entiendo lo de que está dañado .... incluso lo he editado con el PAINT. ¿Tiene que tener algún formato especial?

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Fri Jul 18, 2014 1:29 pm
by AngelSalom
Si pinto el pixel 0,0 de otro color distinto al azul funciona correctamente.
He estado observando el método que pinta el botón y al parecer toma el color de fondo de la posición 0,0

Code: Select all  Expand view
nZeroZeroClr = GetPixel( ::hDC, 0, 0 )

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Fri Jul 18, 2014 1:42 pm
by karinha
Modifiqué las propriedads del mismo con el IRFANVIEW.EXE y no funciona mismo asi, está todo con mal formato.

También no comprendo que pasa.

http://www.irfanview.com/

saludos.

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Sat Jul 19, 2014 3:35 am
by Antonio Linares
El color del pixel en 0, 0 se usa para saber cual es el color transparente.

Con que le cambies el color a ese pixel (como has hecho) es suficiente para que se vea bien.

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Sat Jul 19, 2014 6:53 pm
by AngelSalom
Me parece muy curioso ... ¿no hay forma de solucionar esto sin tener que modificar las imágenes?

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Sun Jul 20, 2014 2:00 am
by Antonio Linares
Angel,

Está técnica la aprendí de Borland, quien tambien lo hacía igual. Para no modificar las imágenes, entonces tendrás que modificar la función de pintado.

O prueba a hacer esto: Añade esté código al final del primer PRG de tu aplicación:

Code: Select all  Expand view
#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>

HB_FUNC( GETPIXEL )
{
   hb_retnl( RGB( 255, 0, 0 ) ); // forzamos a que devuelva Rojo (Red, Green and Blue)
}

#pragma ENDDUMP
 

Re: ¿Evitar sustitución de color en BTNBMP?

PostPosted: Sun Jul 20, 2014 8:21 am
by cnavarro
Hace algún tiempo me encontré con el mismo problema con algunos BMPs y PNGs que tenían un aspecto parecido al tuyo
Como no soy ningún experto en imágenes, y después de dedicar mucho tiempo a cambiar imágenes e intentar ver qué pasaba, pensé que el problema eran los BMPs que yo tenía.
Probé cambiando el nivel Alpha, la transparencia, etc, sin conseguir ningún resultado
Insisto en que no soy ningún experto en el uso de imágenes, es más, me considero bastante torpe en este aspecto
Encontré una solución que a mí me funcionó aunque tuve que cambiar la clase
Hice lo siguiente (por si te parece bien)
1.- Creé una DATA nueva en la clase BTNBMP
Code: Select all  Expand view

DATA   nZeroZeroClr INIT Nil
 


2.- En el método Paint , en todas las llamadas a la function DrawTransBmp, añadí esa DATA como parámetro final (creo que son 4 llamadas a esa funcion)
Por ejemplo
Code: Select all  Expand view

.../...
            else
               DrawTransBmp( ::hDC, hBmp, oBmpRect:nTop, oBmpRect:nLeft + 2, oBmpRect:nWidth, oBmpRect:nHeight, ::nZeroZeroClr )
            endif

.../...
 


3.- Modifiqué esa function DrawTransBmp para que aceptara ese parámetro
Code: Select all  Expand view

static function DrawTransBmp( hDC, hBmp, nRow, nCol, nWidth, nHeight, nZeroZeroClr )

   local hDCMem, hBmpOld, nOldClr //, nZeroZeroClr

   DEFAULT nWidth := nBmpWidth( hBmp ), nHeight := nBmpWidth( hBmp ), nZeroZeroClr := Nil

   hDCMem = CreateCompatibleDC( hDC )

   // we can not get nZeroZeroClr from hDC is possible hDC are locked by other SelectObject
   // An application cannot select a bitmap into more than one device context at a time.
   hBmpOld      = SelectObject( hDCMem, hBmp )
   
   if nZeroZeroClr = Nil
      nZeroZeroClr = GetPixel( hDCMem, 0, 0 )
   endif

.../...


 


4.- En la definicion de mis botones, si tengo algun problema hacía lo siguiente
Code: Select all  Expand view

   @ 3, 5 BTNBMP oBtn SIZE 132, 52 FILE "bdbar.bmp" NOBORDER ACTION oDlg:End() //MsgInfo ('Hola')
   oBtn:nZeroZeroClr  := -1

 

Et voilá

Pero, si me preguntas por qué ocurre con algunos BMPs? (No tengo ni idea, lo dejé por imposible)

Re: ¿Evitar sustitución de color en BTNBMP? *SOLUCIONADO *

PostPosted: Mon Jul 21, 2014 7:04 am
by AngelSalom
Gracias amigos, con el ajuste que sugiere Antonio se acabó el problema.
Saludos,

Re: ¿Evitar sustitución de color en BTNBMP? *SOLUCIONADO*

PostPosted: Mon Jul 21, 2014 12:50 pm
by Antonio Linares
Angel,

Me alegro de que te haya servido.

De todas formas recuerda que si en tu aplicación se usase la función GetPixel() no funcionaría correctamente :-)