• Viernes 1 de Noviembre de 2024, 13:34

Autor Tema:  Iluminacion De Los Objetos En El Panel  (Leído 1431 veces)

Julio34

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Iluminacion De Los Objetos En El Panel
« en: Jueves 13 de Julio de 2006, 11:25 »
0
BUenas,

Tengo que hacer un programa que haga lo siguiente: Cuando se señala una imagen concreta, el resto del panel se oscurece, viendose la imagen señalada resaltada respecto al resto de objetos.

Debido a que tengo que trabajar sobre un panel, la propiedad opacity que tienen los formularios no sirve, ahora estoy probando insertando una imagen negra encima de todo el panel excepto en el objeto y jugando con la classe ColorMatrix, pero no acaba de ser correcto del todo parece ser por culpa de los textboxes i cosillas asi.

Alguien por aquí se ha enfrentado alguna vez con este tipo de situación?

Gracias de antemano!!!!

Julio34

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Iluminacion De Los Objetos En El Panel
« Respuesta #1 en: Martes 25 de Julio de 2006, 12:39 »
0
Buenas, resolvi este problema hace un tiempo. El truco es hacer una captura de pantalla y despues pintarle encima  varias imagenes negras con la opacidad reducida. De esta manera se puede resaltar cualquier zona del formulario especificando coordenadas. Aun asi no estoy muy seguro si esta solucion es la mas eficiente o si se podria mejorar. Por ahora pongo el codigo, lo que hago a grandes rasgos es combinar la clase Colormatrix con las clases de USER32 de windows



IntPtr dc1 = USER32.GetWindowDC(this.Handle);
Graphics g1 = Graphics.FromHdc(dc1);
Bitmap original = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
         
         

float[][] ptsArray ={ new float[] {1, 0, 0, 0, 0},
      new float[] {0, 1, 0, 0, 0},
      new float[] {0, 0, 1, 0, 0},
      new float[] {0, 0, 0, opacity, 0},
      new float[] {0, 0, 0, 0, 1}};
ColorMatrix clrMatrix = new ColorMatrix( ptsArray );
ImageAttributes imgAttributes = new ImageAttributes();
imgAttributes.SetColorMatrix( clrMatrix,
            ColorMatrixFlag.Default, ColorAdjustType.Bitmap );
Image negre = Image.FromFile("C:\\Documents and Settings\\jarnalot\\Mis documentos\\Mis imágenes\\backie.bmp");
g1.DrawImage(negre, new Rectangle(0,0,this.Width-(this.Width - CoorX),this.Height-(this.Height-CoorY)), 0, 0, this.Width-(this.Width - CoorX), this.Height,GraphicsUnit.Pixel, imgAttributes);
g1.DrawImage(negre, new Rectangle(0,CoorY,this.Width-(this.Width - CoorX),PosY), 0, 0, CoorX, CoorY,GraphicsUnit.Pixel, imgAttributes);
g1.DrawImage(negre, new Rectangle(0,CoorY + PosY,this.Width-(this.Width - CoorX),this.Height-(CoorY+PosY)), 0, 0, CoorX, CoorY,GraphicsUnit.Pixel, imgAttributes);
g1.DrawImage(negre, new Rectangle(CoorX,0,this.Width,this.Height-(this.Height-CoorY)), 0, 0, CoorX, CoorY,GraphicsUnit.Pixel, imgAttributes);
g1.DrawImage(negre, new Rectangle(CoorX+PosX,CoorY,this.Width,PosY), 0, 0, CoorX, CoorY,GraphicsUnit.Pixel, imgAttributes);
g1.DrawImage(negre, new Rectangle(CoorX,CoorY + PosY,this.Width,this.Height-(CoorY+PosY)), 0, 0, CoorX, CoorY,GraphicsUnit.Pixel, imgAttributes);

Si alguien cree que se puede hacer mejor que me lo diga porfa!!

saludos

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Iluminacion De Los Objetos En El Panel
« Respuesta #2 en: Miércoles 26 de Julio de 2006, 05:41 »
0
Me parece una buena solución , gracias por compartirla.

Me pregunto si no sera un poco lenta? :rolleyes:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Julio34

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Iluminacion De Los Objetos En El Panel
« Respuesta #3 en: Jueves 3 de Agosto de 2006, 09:10 »
0
Hola,

Efectivamente esta solución era demasiado lenta y, en consecuencia, inviable.

Al final conseguí hacerlo de manera correcta, hay que trabajar con capturas de pantalla unicamente.

El codigo es el siguiente, saludos!
Código: Text
  1.  
  2. public void Oscurecer(int amplada, int llargada, int CoorX, int CoorY, float brightness)
  3. {
  4. //PASO 1
  5. //Hacemos una captura de pantalla inicial para poder trabajar con ella
  6.  
  7. IntPtr pCapturaPantalla = DLLs.GetWindowDC(ctrl.Handle);
  8. graficoCapturaPantalla = Graphics.FromHdc(pCapturaPantalla);
  9.  
  10. //Creamos un bitmap para poder pegar la captura de imagen
  11.  
  12. bRecipientePant = new Bitmap(ctrl.Width, ctrl.Height);
  13. Graphics graficoRecipientePant = Graphics.FromImage(bRecipientePant);
  14. pCapturaPantalla = graficoCapturaPantalla.GetHdc();
  15. IntPtr pRecipientePant = graficoRecipientePant.GetHdc();
  16.    
  17. //Pegamos la captura de pantalla en el bitmap
  18.  
  19. DLLs.BitBlt(pRecipientePant, 0, 0, ctrl.Width, ctrl.Height, pCapturaPantalla, 0, 0, 13369376);        
  20. graficoCapturaPantalla.ReleaseHdc(pCapturaPantalla);
  21. graficoRecipientePant.ReleaseHdc(pRecipientePant);
  22.    
  23. //PASO 2
  24. //Creamos un nuevo Bitmap de tamaño reducido para copiar
  25. //solo un fragmento de la captura de pantalla inicial
  26.    
  27. Bitmap bFragmento = new Bitmap(amplada,llargada);
  28. Graphics graficoFragmento = Graphics.FromImage(bFragmento);
  29. IntPtr pFragmento = graficoFragmento.GetHdc();
  30.  
  31. //Pegamos el fragmento especificado de la captura de pantalla inicial en el bitmap
  32.  
  33. DLLs.BitBlt(pFragmento, 0, 0, amplada, llargada, pCapturaPantalla, CoorX, CoorY, 13369376);
  34. graficoFragmento.ReleaseHdc(pFragmento);
  35.              
  36. //PASO 3
  37. //Oscurecemos el bitmap que contiene la captura de pantalla inicial
  38.    
  39. float[][] ptsArray ={ new float[] {1, 0, 0, 0, 0},
  40.   new float[] {0, 1, 0, 0, 0},          new float[] {0, 0, 1, 0, 0},
  41.   new float[] {0, 0, 0, 1, 0},
  42.   new float[] {brightness, brightness, brightness, 1, 1}};
  43.   ColorMatrix clrMatrix = new ColorMatrix( ptsArray );
  44.   ImageAttributes imgAttributes = new ImageAttributes();
  45.     imgAttributes.SetColorMatrix( clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap );
  46. graficoCapturaPantalla.DrawImage(bRecipientePant, new Rectangle(0, 0, ctrl.Width, ctrl.Height), 0, 0, ctrl.Width, ctrl.Height,GraphicsUnit.Pixel, imgAttributes);
  47.      
  48. //PASO 4
  49. //Pegamos el fragmento en la captura de pantalla inicial, la cual ya esta oscurecida
  50.    
  51. DLLs.BitBlt(pCapturaPantalla, CoorX, CoorY, amplada, llargada, pFragmento, 0, 0, 13369376);
  52. }
  53.  

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Iluminacion De Los Objetos En El Panel
« Respuesta #4 en: Jueves 3 de Agosto de 2006, 21:00 »
0
Muy bien, eso era lo que esperaba!!!

Gracias por compartirlo!! :smartass:


Buen trabajo!!!
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io