Cómo hacer formas irregulares

Todas las experiencias en la creación de formas irregulares - -

Muchas personas están interesadas en crear formas con formas extrañas. Personas entusiastas continúan compartiendo sus descubrimientos con nosotros. Hoy voy a resumir los métodos que conozco. Espero que esto ayude.

En términos generales, desea crear formas irregulares. Necesitamos utilizar la API de Win32: SetwindowRgn. Puede encontrar esta API en el navegador API. La función de esta API es "cortar" el formulario en una forma específica. La siguiente es una explicación de la declaración de API:

Función de declaración SetWindowRgn Lib "user32" (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

It Tiene tres parámetros.

El primer parámetro (hWnd) se usa para especificar el identificador del objeto a cortar, como marco de imagen, etc. Generalmente usamos el atributo hWnd del formulario

; El segundo parámetro (hRgb) especifica la forma del corte, es decir, la característica geométrica especificada. Este parámetro también debe ser proporcionado por la descripción de la función API correspondiente. Estas API le permiten crear el área (forma) deseada. Estas API luego devolverán un valor.

El tercer valor (bRedraw) es una variable booleana que normalmente se establece en Verdadero.

Parece que SetWindowsRgn por sí solo no es suficiente. También tenemos que crear una zona. Para crear una región, puede utilizar las siguientes aplicaciones:

CreateRectRgn: crea una región rectangular cuyos parámetros son las coordenadas de las esquinas superior izquierda e inferior derecha del rectángulo. Pero como el formulario por defecto es un rectángulo, no debemos usarlo;

CreateRoundRectRgn: crea un área rectangular redondeada, cuyos parámetros son las coordenadas de la esquina superior izquierda y la esquina inferior derecha, y el diámetro del esquina redondeada Cuando el diámetro de la esquina redondeada Cuando está cerca o excede la longitud del rectángulo, aparecerá como un círculo o elipse;

CreateEllipticRgn: crea un área rectangular elíptica, los parámetros son. las coordenadas de los vértices de la esquina superior izquierda y de la esquina inferior izquierda del rectángulo de restricción de elipse;

Así que ahora podemos crear una forma relativamente simple. Por ejemplo, creamos una tabla elíptica con el siguiente código:

Opción Explícita

'Reputación de la Api Win32

Función de declaración privada CreateEllipticRgn Lib "gdi32" Alias ​​​​" CreateEllipticRgn" (ByVal X1 mientras, ByVal Y1 mientras, ByVal , ByVal bRedraw como booleano) Mientras

Private Sub Form_Load()

Resultado atenuado como largo 'indicado como save "Show

Me.Show

p>

Result = CreateEllipticRgn(0, 0, 300, 200) 'Crea una región y guarda su identificador en la variable Hwnd, Result, True 'Corta la forma según la región creada anteriormente

End Sub

Pero definitivamente dirás: ¡Quiero crear una forma humanoide o de otra forma irregular! ¡Sí, lo anterior! El método sólo puede crear formas geométricas simples.

Para crear formas más complejas, aún necesitamos usar la API SetWindowRgb para "recortar" el formulario. Pero necesitamos utilizar otras aplicaciones para crear "zonas" complejas. En general, utilizaremos las siguientes aplicaciones, que juntas crearán áreas de formas complejas. En base a esto, podemos usar SetWindowRgb para recortar el formulario.

CreatePolygonRgn: Se utiliza para crear regiones conectando puntos

CombineRgn: Se utiliza para realizar operaciones en dos regiones. Por ejemplo, fusionar dos áreas o restar dos áreas, intersecar, etc.

A continuación presentaremos estas dos aplicaciones en detalle:

CreatePolygonRgb

Declarar la función CreatePolygonRgn Lib "gdi32" alias "CreatePolygonRgn" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long

Parámetro 1 (lpPoint): Variable de tipo POINTAPI. POINTAPI es una estructura utilizada para describir coordenadas de puntos. Puede encontrarlo en el navegador API. Aquí necesitamos una matriz y usaremos el primer elemento de este genérico como parámetro.

Parámetro dos (nCount): el número de vértices en el área. Por ejemplo, una región triangular tiene tres vértices. Deberíamos determinar el tamaño de la matriz utilizada en el parámetro anterior en función de este parámetro;

Parámetro tres (nPolyFillMode): Especifique el modo de relleno del área: Especifique el modo de relleno del área. Hay dos constantes que podemos usar como parámetros: disponibles en el navegador Api.

CombineRgb

Declarar función CombineRgn Lib "gdi32" alias "CombineRgn" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long

Parámetro uno (hDestRgn): identificador del área de destino;

Parámetro dos (hSrcRgn1): identificador del área de origen;

Parámetro tres (hScrRgn2): identificador de la región de origen. Parámetro tres (hScrRgn2): el identificador del área de origen dos.

Parámetro cuatro (nCombineMode): modo de combinación. Podemos usar estas constantes en el navegador Api como parámetros:

RGN_AND

Crea la intersección de dos regiones fusionadas.

RGN=_COPY

Crea una copia de la región identificada por hrgnSrc1.

RGN_DIFF

Fusiona las partes de hrgnSrc1 que no pertenecen a hrgnSrc2.

RGN_OR

Crea la unión de dos regiones fusionadas.

RGN_XOR

Crea la unión de dos regiones fusionadas, excluyendo las regiones superpuestas.

Bien, así es como creamos el área con forma de reloj de arena.

Opción explícita

'Declarar API Win32

Función de declaración privada CreatePolygonRgn Lib "gdi32" (lpPoint como POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) Mientras

Función de declaración privada CreateEllipticRgn Lib "gdi32" (ByVal X1 mientras, ByVal Y1 mientras, ByVal X2 mientras, ByVal Y2 mientras) Mientras

Función de declaración privada SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Tipo privado POINTAPI

x As Long

y mientras

Tipo final

Private Sub Form_Load()

'Declarar variables

Resultado atenuado mientras

Dim Points(5) As POINTAPI

'Cambiar tamaño de ventana

Conmigo

.Width = 5000

.Height = 10000

Terminar con

'Almacena las coordenadas del vértice del área en variables

Puntos(0).x = 0

Puntos (0).y = 0

Puntos(1).x = 300

Puntos(1).y = 0

Puntos(2). = 175

Puntos (2).y = 300

Puntos(3).x = 300

Puntos(3).y = 600

p>

Puntos(4).x = 0

Puntos(4).y = 600

Puntos(5).x = 125

Puntos (5).y = 300

'Crear área

Resultado = CreatePolygonRgn(Puntos(0), 6, 1)

'"Recortar" cuerpo de la ventana

SetWindowRgn Me.hwnd, Result, True

End Sub

Además, también debemos prestar atención a Win32 Api:DeleteObject. Creamos una zona usando la API. No es visible, pero es un objeto. Si no lo eliminamos, existirá en el sistema y consumirá recursos del sistema, por lo que debemos eliminarlo cuando no lo estemos usando. Esta API tiene solo un parámetro, que especifica el identificador del objeto que se va a eliminar.