¡Buscamos un experto! ¡Quiero hacer una forma en forma de corazón usando C#!
1. Formularios personalizados, normalmente gráficos regulares, como círculos, elipses, etc.
Método: Reescribe el evento Form1_Paint (Form1 es el nombre del formulario. El caso más simple es el siguiente:
System.Drawing.Drawing2D.GraphicsPath forma = new System.Drawing). .Drawing2D.GraphicsPath();
forma.AddEllipse(0, 0, esta.Altura, este.Ancho);
esta.Región = nueva Región(forma); p>
p>
Es decir, las reglas para volver a dibujar el formulario.
2. Implementación usando imágenes de fondo
1.? Establezca la imagen de fondo del formulario, donde la imagen de fondo es un mapa de bits (imagen BMP) de menos de 24 bits (excluyendo 24). Y establezca el valor de TansparencyKey, que suele ser el color de fondo de su imagen de fondo, es decir, el color de fondo al crear una imagen irregular generalmente se establece en un color que no está en su imagen.
La desventaja de este enfoque es que la imagen de fondo debe ser de 16 bits o menos y debe mostrarse en el cliente. Si la configuración de profundidad de color del monitor es superior a 24 bits, las partes no transparentes del formulario causarán problemas de visualización independientemente de cómo esté configurada la propiedad TransparencyKey. Para evitar este problema, asegúrese de que la profundidad de color del monitor en el panel de control de Pantalla esté configurada en menos de 24 bits. Al desarrollar aplicaciones con tales capacidades de transparencia, tenga en cuenta que debe informar a sus usuarios sobre este problema.
Los pasos de implementación son los siguientes:
1. ?Cree una nueva aplicación de Windows
2. ?Seleccione el formulario, busque la propiedad BackgroundImage, haga clic para abrir una nueva ventana, seleccione el archivo de recursos de importación a continuación y seleccione su imagen BMP irregular
3. ?Busque la TansparencyKey del formulario y configúrela en el color de fondo de su imagen de fondo (como amarillo)
4. ?Busque el FormBorderStyle del formulario y configúrelo en ninguno, es decir, no muestre la barra de título
5. ?Ejecutar
lt;!--[endif]--gt;
2.? Los mismos gráficos que la imagen de fondo, pero cargados dinámicamente, atravesando el mapa de bits para lograr una forma irregular. . El principio es este: escriba un método en el evento de carga del formulario para cambiar el área de dibujo del formulario.
Los pasos de implementación son los siguientes:
1. ?Crear aplicación winform
2. ?Busque el evento Load del formulario y haga doble clic para editar
3. ?Método de escritura, el código principal es el siguiente:
Código
clase?BitmapRegion
{
public?BitmapRegion()
{?}
///?lt;summarygt;?
///?Crear?y?aplicar?la?región?en?la? control suministrado
///?Crear un control que admita áreas de mapa de bits (actualmente botones y formularios)
///?lt;/summarygt;?
///?lt;param?name="control"gt;El?objeto?Control?a?aplicar?la?región?acontrollt;/paramgt;?
///?lt; ?name="bitmap"gt;El?objeto?Bitmap?para?crear?la?región?desdeBitmaplt;/paramgt;?
public?static?void?CreateControlRegion(Control?control ,?Bitmap? bitmap)
{
//?Return?if?control?and?bitmap?are?null
//Determinar si el control existe y bitmap
if?(control?==?null?||?bitmap?==?null)
return;
//?Establecer ?nuestro?control ''s?size?to?be?the?same?as?the?bitmap
//Establece el tamaño del control al tamaño del mapa de bits
control.Width =?bitmap? .Width;
control.Height?=?bitmap.Height;
//?Compruebe?si?estamos?tratando?con?Form?aquí?
//Cuando el control es un formulario
if?(control?is?System.Windows.Forms.Form)
{
// ?Transmitir?a?un?objeto?Form?
//Forzar formar
Form?form?=?(Form)control;
///? Establezca?el?tamaño?de?nuestro?formulario?para que?sea?un?poco?más grande?que?el?mapa de bits?sólo?
//?en?caso?el?formulario? ¿el?estilo?del?borde?no?establecido?en?ninguno?en?el?primer?lugar?
//Cuando el borde del FORMULARIO, FormBorderStyle no es NINGUNO, el tamaño del FORMULARIO debe establecerse Ligeramente más grande que el tamaño del mapa de bits
form.Width?=?control.Width;
form.Height?=?control.Height;
/ /?No? ¿frontera?
//
Sin borde
form.FormBorderStyle?=?FormBorderStyle.None;
//?Establecer?bitmap?como?la?imagen de fondo?
// Establecer el mapa de bits como imagen de fondo del formulario
form.BackgroundImage?=?bitmap;
//?Calcular?la?ruta?gráfica?basada?en?el?mapa de bits? ?
//Calcular los límites de las partes opacas del mapa de bits
GraphicsPath?graphicsPath?=?CalculateControlGraphicsPath(bitmap);
//?Apply? new ?region?
//Aplicar nueva región
form.Region?=?new?Region(graphicsPath);
}
//?Comprobar?¿si?estamos?tratando?con?¿Botón?aquí?
//Cuando el control es un botón
¿else?if?(¿el control?es ? System.Windows.Forms.Button)
{
//?Cast?to?a?button?object?
//Cast?to? botón
¿Botón?botón?=?(Botón)control;
//?Do?not?show?button?text?
//No botón de visualización ?text
botón.Text?=?"";
//?¿Cambiar?cursor?a?mano?cuando?sobre?botón?
/ /Cambiar el estilo del ?cursor
botón.Cursor?=?Cursors.Hand;
//?Set?background?image?of?button?
//Establecer la imagen de fondo del botón
button.BackgroundImage?=?bitmap;
//?Calcular?la?ruta?gráfica?basada?en?el ?bitmap?supplied?
//Calcular el límite de la parte opaca del mapa de bits
GraphicsPath?graphicsPath?=?CalculateControlGraphicsPath(bitmap);
/ /?Aplicar?nueva?región ?
//Aplicar nueva región
botón.Región?=?nueva?Región(graphicsPath);
} p>
}
///?lt;summarygt;?
///?Calcular?la?trayectoria?gráfica?que?representa?la?figura?en ?el?mapa de bits?
///?excluyendo?el?color?transparente?¿cuál?es?el?píxel?superior?izquierdo?
///?// No incluido en el mapa de bits de cálculo.
El borde de la parte transparente
///?lt;/summarygt;?
///?lt;param?name="bitmap"gt;El?Bitmap?objeto ?para ?calcular?nuestra?ruta?gráfica?de?lt;/paramgt;?
///?lt;returnsgt;¿Ruta?gráfica?calculada?/returnsgt;?
privada ?static ?GraphicsPath?CalculateControlGraphicsPath(Bitmap?bitmap)
{
//?Create?GraphicsPath?for?our?bitmap?cálculo?
// ¿Crear? GraphicsPath
GraphicsPath?graphicsPath?=?new?GraphicsPath();
//?¿Usar?el?píxel?superior?izquierdo?como?nuestro?color?transparente? p>
//Utiliza el color de la esquina superior izquierda como nuestro color transparente
Color?colorTransparent?=?bitmap.GetPixel(0,?0);
// ?Esto?es?para?almacenar?el?valor?de?columna?dónde?un?píxel?opaco?se?encuentra?primero.?
//?Este?valor?determinará? ?¿dónde?empezamos?escaneo?en busca?de?píxeles?opacos?
//X del primer punto encontrado
int?colOpaquePixel?=?0;
//?¿Pasar?por?todas?las?filas?(¿eje Y?)?
//?Pasar por todas las filas (dirección Y)
para?(int ?fila ?=?0;?fila?lt;?bitmap.Height;?fila )
{
//?Restablecer?valor?
/ /Restablecer conjunto
colOpaquePixel?=?0;
//?¿Ir?a través de?todas?columnas?(¿Eje X?)?
//Todos calendarios parciales Columna (dirección X)
for?(int?col?=?0;?col?lt;?bitmap.Width;?col)
{
//?Si?este?es?un?píxel?opaco,?márquelo?y?busque?¿alguno más?que esté detrás?
//Si es un punto que no requiere procesamiento de transparencia Luego marque y luego continúe con el calendario parcial
if?(bitmap.GetPixel(col,?row)?=?colorTransparent)
{
//?Opaque?pixel?found,?mark?current?position
//Registrar actual
colOpaquePixel?=?col;
/ /?Crear?otra?variable?para?establecer?la?moneda?
t?pixel?position?
//Crea una nueva variable para registrar el punto actual
int?colNext?=?col;
//?Iniciando ?desde el píxel?opaco?encontrado?actual,?busque?más?píxeles?opacos?
//?arrastre?detrás,?hasta?que?encuentre?un?píxel?transparente?o?mínimo ?ancho ?se?alcanzado?
///Empiece desde el punto opaco encontrado y continúe buscando puntos opacos hasta encontrar o alcanzar el ancho de la imagen?
for?(colNext ?=? colOpaquePixel;?colNext?lt;?bitmap.Width;?colNext )
if?(bitmap.GetPixel(colNext,?row)?==?colorTransparent)
romper;
//?¿Formar?un?rectángulo?para?la?línea?de?píxeles?opacos?encontrados?y?agregarlo?a?nuestra?ruta?gráfica?
/ /será opaco ¿Agregar puntos a los gráficos?path
graphicsPath.AddRectangle(new?Rectangle(colOpaquePixel,?row,?colNext?-?colOpaquePixel,?1));
/ /?¿No? ¿Necesitas?escanear?la?línea?de?píxeles?opacos?que?recién?encontrados?
col?=?colNext;
}
}
}
//?¿Retorno?¿calculado?¿ruta?gráfica?
retorno?ruta?gráfica;
} p>
}
4. ?Ejecutar lt;!--[endif]--gt;