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

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

Postby AngelSalom » Fri Jul 18, 2014 10:48 am

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
Last edited by AngelSalom on Mon Jul 21, 2014 7:05 am, edited 1 time in total.
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
User avatar
AngelSalom
 
Posts: 708
Joined: Fri Oct 07, 2005 7:38 am
Location: Benicarló (Castellón ) - España

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

Postby karinha » Fri Jul 18, 2014 1:10 pm

En realidad, esta BITMAP está dañado.

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

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

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

Postby AngelSalom » Fri Jul 18, 2014 1:25 pm

No entiendo lo de que está dañado .... incluso lo he editado con el PAINT. ¿Tiene que tener algún formato especial?
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
User avatar
AngelSalom
 
Posts: 708
Joined: Fri Oct 07, 2005 7:38 am
Location: Benicarló (Castellón ) - España

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

Postby AngelSalom » Fri Jul 18, 2014 1:29 pm

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 )
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
User avatar
AngelSalom
 
Posts: 708
Joined: Fri Oct 07, 2005 7:38 am
Location: Benicarló (Castellón ) - España

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

Postby karinha » Fri Jul 18, 2014 1:42 pm

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.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

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

Postby Antonio Linares » Sat Jul 19, 2014 3:35 am

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby AngelSalom » Sat Jul 19, 2014 6:53 pm

Me parece muy curioso ... ¿no hay forma de solucionar esto sin tener que modificar las imágenes?
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
User avatar
AngelSalom
 
Posts: 708
Joined: Fri Oct 07, 2005 7:38 am
Location: Benicarló (Castellón ) - España

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

Postby Antonio Linares » Sun Jul 20, 2014 2:00 am

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
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby cnavarro » Sun Jul 20, 2014 8:21 am

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)
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

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

Postby AngelSalom » Mon Jul 21, 2014 7:04 am

Gracias amigos, con el ajuste que sugiere Antonio se acabó el problema.
Saludos,
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
User avatar
AngelSalom
 
Posts: 708
Joined: Fri Oct 07, 2005 7:38 am
Location: Benicarló (Castellón ) - España

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

Postby Antonio Linares » Mon Jul 21, 2014 12:50 pm

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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 65 guests