CLR: .Net / Mono / Boo / Otros CLR > C#
Iluminacion De Los Objetos En El Panel
(1/1)
Julio34:
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:
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:
Me parece una buena solución , gracias por compartirla.
Me pregunto si no sera un poco lenta? :rolleyes:
Julio34:
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 --- public void Oscurecer(int amplada, int llargada, int CoorX, int CoorY, float brightness){//PASO 1//Hacemos una captura de pantalla inicial para poder trabajar con ella IntPtr pCapturaPantalla = DLLs.GetWindowDC(ctrl.Handle);graficoCapturaPantalla = Graphics.FromHdc(pCapturaPantalla); //Creamos un bitmap para poder pegar la captura de imagen bRecipientePant = new Bitmap(ctrl.Width, ctrl.Height);Graphics graficoRecipientePant = Graphics.FromImage(bRecipientePant);pCapturaPantalla = graficoCapturaPantalla.GetHdc();IntPtr pRecipientePant = graficoRecipientePant.GetHdc(); //Pegamos la captura de pantalla en el bitmap DLLs.BitBlt(pRecipientePant, 0, 0, ctrl.Width, ctrl.Height, pCapturaPantalla, 0, 0, 13369376); graficoCapturaPantalla.ReleaseHdc(pCapturaPantalla);graficoRecipientePant.ReleaseHdc(pRecipientePant); //PASO 2//Creamos un nuevo Bitmap de tamaño reducido para copiar //solo un fragmento de la captura de pantalla inicial Bitmap bFragmento = new Bitmap(amplada,llargada);Graphics graficoFragmento = Graphics.FromImage(bFragmento);IntPtr pFragmento = graficoFragmento.GetHdc(); //Pegamos el fragmento especificado de la captura de pantalla inicial en el bitmap DLLs.BitBlt(pFragmento, 0, 0, amplada, llargada, pCapturaPantalla, CoorX, CoorY, 13369376);graficoFragmento.ReleaseHdc(pFragmento); //PASO 3//Oscurecemos el bitmap que contiene la captura de pantalla inicial 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, 1, 0}, new float[] {brightness, brightness, brightness, 1, 1}}; ColorMatrix clrMatrix = new ColorMatrix( ptsArray ); ImageAttributes imgAttributes = new ImageAttributes(); imgAttributes.SetColorMatrix( clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap );graficoCapturaPantalla.DrawImage(bRecipientePant, new Rectangle(0, 0, ctrl.Width, ctrl.Height), 0, 0, ctrl.Width, ctrl.Height,GraphicsUnit.Pixel, imgAttributes); //PASO 4//Pegamos el fragmento en la captura de pantalla inicial, la cual ya esta oscurecida DLLs.BitBlt(pCapturaPantalla, CoorX, CoorY, amplada, llargada, pFragmento, 0, 0, 13369376);}
JuanK:
Muy bien, eso era lo que esperaba!!!
Gracias por compartirlo!! :smartass:
Buen trabajo!!!
Navegación
Ir a la versión completa