Creación del extraño menú de DELPHI
Traductor: Li Junyu correo electrónico: [email protected], [email protected]
Menús personalizados, texto, líneas / Delphi 4, 5
Menú personalizado, texto, línea/Delphi 4, 5
Menús elegantes, etc.
Menús extraños, etc.
Menús personalizados, texto rotado y líneas especiales
Menús personalizados, texto rotado y líneas especiales
Antes de Delphi 4, era difícil personalizar un menú (agregar un mapa de bits, cambiar una fuente, etc.), porque el dibujo del propietario (es decir, un dibujo personalizado), aunque implementado por Windows, no estaba expuesto por la clase TMainMenu. Desde Delphi 4, Sin embargo, esta situación se ha rectificado y podemos salirnos con la nuestra con los menús.
Antes de Delphi 4, era difícil personalizar un menú (como agregar una imagen BMP, cambiar fuentes, etc.) porque el evento de dibujo del propietario (es decir, el evento de dibujo personalizado), aunque lo ejecuta Windows, no aparece en TMainMenu. clase desde Delphi 4,
Esta situación ha cambiado y ahora tenemos la posibilidad de personalizar los menús.
Este artículo destacará algunas técnicas que puede utilizar para personalizar la apariencia de los menús en sus aplicaciones Delphi. Discutiremos la ubicación del texto, el tamaño del menú, la asignación de fuentes y el uso de mapas de bits y formas para mejorar la apariencia de un menú. También incluye técnicas para crear texto rotado y líneas personalizadas. Todas las técnicas analizadas en este artículo se demuestran en Proyectos disponibles para descargar.
Este artículo se centrará en algunas técnicas que puede utilizar para personalizar la apariencia de los menús en sus aplicaciones DELPHI. Cubriremos la ubicación del texto, el tamaño del menú, la configuración de fuente y las mejoras con archivos BMP y controles SHAPE. Solo por diversión, esta publicación también incluirá un primer plano de las técnicas para rotar texto y líneas personalizadas. Todas las técnicas analizadas en este artículo se han depurado en archivos de proyecto y se pueden descargar en línea.
Fuentes y tamaños personalizados
Establecer fuente y tamaño
Para crear un menú personalizado, establezca la propiedad OwnerDraw del componente de menú -TMainMenu o TPopupMenu- en True y proporcione controladores de eventos para sus eventos OnDrawItem y OnMeasureItem. Por ejemplo, un controlador de eventos OnMeasureItem se declara así:
Para crear un menú personalizado, establezca la propiedad OwnerDraw del componente TmainMenu o TpopupMenu en TRUE y cree sus procedimientos de evento OnDrawItem y OnMeasureItem. Por ejemplo, un procedimiento de evento OnMeasureItem podría declararse de la siguiente manera:
procedimiento TForm1.Option1MeasureItem(Remitente: TObject;
ACanvas: TCanvas; var Ancho, Alto: Entero);
Establezca las variables Ancho y Alto para ajustar el tamaño del elemento del menú. El controlador de eventos OnDrawItem es donde se realiza todo el trabajo duro, es donde dibuja su menú y realiza cualquier configuración especial para dibujar la opción de menú con la fuente Times New Roman. , por ejemplo, deberías hacer algo como esto:
Establezca las variables Ancho y Alto del elemento del menú en el procedimiento de evento anterior en los tamaños apropiados. Todas las cosas principales se activan mediante el evento OnDrawItem; aquí es donde volverá a dibujar el menú y realizará cualquier configuración especial. Por ejemplo, para volver a dibujar un elemento de menú en fuente Times New Roman, haría lo siguiente:
procedimiento TForm1.Times1DrawItem(Remitente: TObject;
ACanvas: TCanvas; ARect: TRect Seleccionado: Booleano);
comenzar
ACanvas.Font.Name := 'Times New Roman';
ACanvas.TextOut(ARect.Izquierda+1, ARect.Top+1,
(Remitente como TMenuItem).Caption);
fin;
Sin embargo, este código es defectuoso, si se ejecuta, el título del menú se dibujará alineado con el borde izquierdo del menú. Por lo general, hay un espacio para colocar mapas de bits y marcas de verificación. debe calcular el espacio necesario para esta marca de verificación con un código como el que se muestra en la Figura 1. La Figura 2 muestra el menú resultante.
Sin embargo, este código es defectuoso. Si ejecuta este código, el título del elemento del menú se alineará a la izquierda del elemento del menú. Este no es el comportamiento predeterminado de Windows. Normalmente, hay un espacio en el lado izquierdo del menú para la imagen BMP y la selección. marca. Por lo tanto, debe usar código para calcular cuánto espacio se necesita para colocar la bandera de selección, como se muestra en la Figura 1. La Figura 2 muestra el menú en acción.
procedimiento TForm1.Times2DrawItem(Remitente: TObject;
ACanvas: TCanvas; ARect: TRect Seleccionado: Booleano);
var
dwCheck: Entero;
Título del menú: cadena;
comenzar
// Obtener las dimensiones de la marca de verificación.
Obtenga la cantidad de píxeles necesarios para el logotipo de selección
dwCheck := GetSystemMetrics(SM_CXMENUCHECK);
//Ajusta la posición izquierda.
Ajustar la posición izquierda
ARect.Left := ARect.Left + LoWord(dwCheck) + 1;
MenuCaption := (Remitente como TMenuItem).Caption;
// El nombre de la fuente es el título del menú.
ACanvas.Font.Name := 'Times New Roman';
// Dibuja el texto.
dibujar texto
DrawText(ACanvas.Handle, PChar(MenuCaption),
Longitud (MenuCaption), ARect, 0);
fin;
Figura 1: Este controlador de eventos OnDrawItem coloca correctamente el texto del elemento del menú.
[El traductor omitió todas las figuras, las mismas a continuación]
Figura 2: Un menú dibujado con fuentes personalizadas.
Si el texto es demasiado grande para dibujarlo en el menú, Windows lo cortará para que quepa. Por lo tanto, debe configurar el tamaño del elemento del menú para que se pueda dibujar todo el texto. Esta es la función del controlador de eventos OnMeasureItem que se muestra en la Figura 3. .
Si el texto es demasiado largo, Windows lo recortará automáticamente para que quepa. Por lo tanto, debe dimensionar el menú para que se pueda mostrar todo el texto. Lo mismo debería ocurrir en el evento OnMeasureItem, que se puede ver en la Figura 3.
procedimiento TForm1.Times2MeasureItem(Remitente: TObject;
ACanvas: TCanvas; var Ancho, Alto: Entero);
comenzar
ACanvas.Font.Name := 'Times New Roman';
ACanvas.Font.Style := [];
// El ancho es el espacio del menú check
Esta longitud es la longitud de la marca de selección del menú.
// más el ancho del texto del elemento.
Más la longitud del elemento del menú.
Ancho: = GetSystemMetrics (SM_CXMENUCHECK) +
ACanvas.TextWidth((Remitente como TMenuItem).Caption) + 2;
Altura := ACanvas.TextHeight(
(Remitente como TMenuItem).Caption) + 2;
fin;
Figura 3: Este controlador de eventos OnMeasureItem garantiza que un elemento encaje en su menú.
Formas personalizadas y mapas de bits
Configurar gráficos y mapas de bits
También es posible personalizar los elementos del menú incluyendo mapas de bits u otras formas. Para agregar un mapa de bits, simplemente asigne un archivo de mapa de bits a la propiedad TMenuItem.Bitmap, con el Inspector de objetos en tiempo de diseño o con código en tiempo de ejecución. como título de un elemento de menú, puede utilizar el controlador de eventos OnDrawItem que se muestra en la Figura 4. La Figura 5 muestra el resultado.
Es posible configurar menús con mapas de bits y otros gráficos. Para agregar un mapa de bits, simplemente asigne un archivo BMP a la propiedad Bitmap de TmenuItem en el Inspector de objetos en tiempo de diseño, o también es posible usar código en tiempo de ejecución. Para reemplazar el título del menú con un rectángulo coloreado, puede usar el evento OnDrawItem, como se muestra en la Figura 4. En la Figura 5 se muestran los resultados.
procedimiento TForm1.ColorDrawItem(Remitente: TObject;
ACanvas: TCanvas; ARect: TRect Seleccionado: Booleano);
var
dwCheck: Entero;
Color del menú: TColor;
comenzar
// Obtener las dimensiones de la marca de verificación.
dwCheck := GetSystemMetrics(SM_CXMENUCHECK);
ARect.Left := ARect.Left + LoWord(dwCheck);
// Convierte el título del elemento del menú a un color.
Convertir el título del elemento del menú a color
Color del menú :=
StringToColor((Remitente como TMenuItem).Caption);
// Cambia el color del pincel del lienzo.
Cambiar el color del pincel del lienzo.
ACanvas.Brush.Color := MenúColor;
// Dibuja el rectángulo. Si el elemento está seleccionado,
Dibuja un rectángulo si el elemento del menú está seleccionado
// dibuja un borde.
dibujar fronteras
si es seleccionado entonces
ACanvas.Pen.Style := psSolid
demás
ACanvas.Pen.Style := psClear;
ACanvas.Rectangle(ARect.Izquierda, ARect.Arriba,
ARect.Derecha, ARect.Abajo);
fin;
Figura 4: Uso del evento OnDrawItem para dibujar rectángulos de colores en elementos del menú.
Figura 5: Un menú que presenta rectángulos de colores como elementos.
Solo hay un inconveniente. Si está utilizando Delphi 5, debe configurar la propiedad AutoHotkeys del menú en maManual. Si la deja como predeterminada, maAutomatic, Delphi agregará un carácter comercial (&) al título, lo que romperá esto. código Otra solución es eliminar el signo comercial con la función StripHotKey.
El enfoque más popular es que si está utilizando Delphi 5, debe configurar la propiedad AutoHotkeys del menú en maManual. Si no hace esto y deja el valor predeterminado de maAutomatic, Delphi agregará automáticamente un signo comercial al título, lo que romperá el código. Otra solución es utilizar la función StripHotKey para eliminar el signo comercial.
Otra forma de utilizar los eventos OnDrawItem y OnMeasureItem es escribir texto verticalmente en un menú (como se muestra en la Figura 7. Para hacer esto, debe crear una fuente rotada. Esto solo es posible usando la función API de Windows CreateFont o CreateLogFont (consulte). (consulte el consejo sobre "Texto rotado" más adelante en este artículo). Luego debe dibujarlo en el controlador de eventos OnDrawItem. Este evento se activa cada vez que se dibuja un elemento de menú, por lo que si un menú tiene. 20 elementos, se dibujará 20 veces. Para hacerlo más rápido, el texto vertical se dibujará solo cuando se seleccione el elemento del menú (ya que solo hay un elemento de menú seleccionado a la vez). código, y la Figura 7 muestra el resultado en tiempo de ejecución.
Otro uso de los eventos OnDrawItem y OnMeasureItem es escribir texto vertical al lado del menú (como se muestra en la Figura 7). Para hacer esto, debes crear una fuente rotada. La única forma es utilizar la función CreateFont o CreateLogFont de la API de Windows (consulte la técnica de "texto rotado" más adelante en este artículo). Entonces debes volver a dibujarlo en el evento OnDrawItem. Este evento se ejecuta cuando se extrae el elemento del menú, por lo que si un menú tiene 20 elementos, se ejecutará 20 veces. Para hacerlo más rápido, el texto vertical se puede volver a dibujar cada vez que se selecciona un elemento del menú (aunque solo se selecciona un elemento del menú a la vez). La Figura 6 muestra cómo se ejecuta el código, mientras que la Figura 7 muestra los resultados.
procedimiento TForm1.VerticalDrawItem(Remitente: TObject;
ACanvas: TCanvas; ARect: TRect Seleccionado: Booleano);
var
si: TLogFont;
Fuente antigua: HFont;
clFore, clBack: LongInt;
Rectángulo: TRect;
dwCheck: Int largo;
Altura del menú: entero;
comenzar
dwCheck := GetSystemMetrics(SM_CXMENUCHECK);
// Esto se hará una vez, cuando se seleccione el elemento.
Esto se ejecutará cuando se seleccione el elemento del menú.
si está seleccionado entonces comience
// Crea una fuente rotada.
Crear una fuente rotada
FillChar(lf, TamañoDe(lf), 0);
lf.lfAltura := -14;
lf.lfEscapement := 900;
lf.lfOrientación := 900;
lf.lfPeso := Fw_Bold;
StrPCopy(lf.lfFaceName, 'Arial');
// Selecciona esta fuente para dibujar.
Seleccione esta fuente para dibujar
OldFont := SeleccionarObjeto(ACanvas.Handle,
CrearFontIndirect(lf));
// Cambia los colores de primer plano y de fondo.
Cambiar colores de primer plano y de fondo
clFore := SetTextColor(ACanvas.Handle, clSilver);
clBack := SetBkColor(ACanvas.Handle, clBlack);
// Obtener la altura del menú.
Obtener altura del menú
Altura del menú := (ARect.Abajo-ARect.Arriba) *
((Remitente como TMenuItem). Padre como TMenuItem). Count;
Rectang := Rect(-1, 0, dwCheck-1, MenuHeight);
// Dibuja el texto.
dibujar texto
ExtTextOut(ACanvas.Handle, -1, MenuHeight, Eto_Clipped,
@Rectang, 'Hecho en Borland', 15, cero);
// Vuelve al estado original.
Volver al estado original
EliminarObjeto(SelectObject(ACanvas.Handle, OldFont));
SetTextColor(ACanvas.Handle, clFore);
SetBkColor(ACanvas.Handle, clBack);
fin;
// Dibuja el texto real del menú.
Dibujar texto real del elemento del menú
ARect.Left := ARect.Left + LoWord(dwCheck) + 2;
DibujarTexto(ACanvas.Handle,
PChar((Remitente como TMenuItem).Caption),
Longitud((Remitente como TMenuItem).Caption), ARect, 0);
fin;
Figura 6: Uso de OnDrawItem para dibujar texto vertical en un menú.
Figura 7: Menú con texto vertical.
Un detalle complicado es saber dónde empezar a dibujar el texto. Debe comenzar en la parte inferior del último elemento del menú. Para obtener su posición, obtenemos la altura del elemento del menú, usando:
Deberías saber por dónde empezar a dibujar texto. Debería comenzar en la parte inferior del último elemento del menú. Para obtener esta posición, obtenemos la altura del elemento del menú de la siguiente manera:
ARect.arriba - ARect.abajo
y multiplíquelo por la cantidad de elementos del menú:
Y multiplicado por la cantidad de elementos del menú:
(((Remitente como TMenuItem). Padre como TMenuItem). Cuenta)
Texto girado
texto rotado
La API de Windows le permite dibujar texto en cualquier ángulo. Para hacer esto en Delphi, debe usar la función API CreateFont o CreateFontIndirect como se muestra en la Figura 8.
La API de Windows te permite dibujar texto en cualquier ángulo. Para hacer esto en Delphi, debe utilizar las dos funciones API CreateFont o CreateFontIndirect. La Figura 8 muestra cómo se declara CreateFont.
función CrearFuente(
nHeight, // Altura lógica de la fuente.
nWidth, // Ancho de carácter promedio lógico.
nEscapement, // Ángulo de escape.
nOrientation, // Ángulo de orientación de la línea base.
fnWeight: Integer; // Peso de fuente. La subpropiedad de peso de la fuente.
fdwItalic, // Indicador de atributo en cursiva. ¿Está en cursiva?
fdwUnderline, // Marca de atributo subrayado.
fdwStrikeOut, // Indicador de atributo tachado. Si se tacha el atributo.
fdwCharSet // Identificador del juego de caracteres.
fdwOutputPrecision, // Precisión de salida.
fdwClipPrecision, // Precisión de recorte.
fdwQuality, // Calidad de salida.
fdwPitchAndFamily: DWORD; // Tono y familia.
lpszFace: PChar // Puntero a la cadena del nombre del tipo de letra.
): HFONT; llamada estándar;
Figura 8: Declaración de Object Pascal para la función CreateFont API de Windows.
Si bien esta función tiene muchos parámetros, generalmente solo querrá cambiar uno o dos atributos del texto. En tales casos, debe usar la función CreateFontIndirect. Solo necesita un argumento: un registro de tipo TLogFont, como se muestra en la Figura. 9.
Aunque esta función tiene muchos parámetros, normalmente sólo necesitas cambiar una o dos propiedades del texto. En este caso, utilizaría la función CreateFontIndirect. Solo requiere un parámetro: un parámetro de tipo de registro de TlogFont, como se puede ver en la Figura 9.
tagLOGFONTA = registro empaquetado
lfAltura: Entero largo;
lfAncho: Entero largo;
lfEscapement: Entero largo;
lfOrientación: Entero largo;
lfPeso: Entero largo;
lfCursiva: Byte;
lfSubrayado: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfCalidad: Byte;
lfPitchAndFamily: Byte;
lfFaceName: matriz[0..LF_FACESIZE - 1] de AnsiChar;
fin;
TLogFontA = etiquetaLOGFONTA;
TLogFont = TLogFontA;
Figura 9: El registro TLogFont.
Al observar este registro, notará que sus miembros coinciden con los parámetros de la función CreateFont. La ventaja de usar esta combinación de función/registro es que puede completar los miembros del registro con una fuente conocida usando la función API GetObject y cambiar los miembros. desee y cree la nueva fuente.
Si observa más de cerca este tipo de registro, encontrará que sus miembros son muy similares a los parámetros de la función CreateFont. La ventaja de usar esta combinación de función/registro es que puede usar la función API GetObject para completar los valores de miembro de este registro con una fuente conocida y luego cambiar el valor de miembro que desea cambiar para generar una nueva fuente.
Para dibujar texto rotado, el único miembro que debe cambiar es lfEscapement, que establece el ángulo del texto en décimas de grados. Entonces, si desea que el texto se dibuje a 45 grados, debe configurar lfEscapement en 450.
Para dibujar texto rotado, el único miembro que necesita cambiar es lfEscapement, que establece el ángulo de la fuente en décimas de grado. Entonces, si quieres que el personaje gire 45 grados, debes configurar
El escape es 450.
Observe que hay indicadores para dibujar texto en cursiva, subrayado y tachado, pero no hay indicadores para dibujar texto en negrita. Esto se hace con el miembro lfWeight, un número entre 0 y 1000. 400 es texto normal, valores superiores a este. dibuja texto en negrita y los valores debajo dibujan texto claro.
Tenga en cuenta que hay bastantes marcadores para poner texto en cursiva, subrayar y resaltar, pero no hay marcadores para poner texto en negrita. Esto se debe a que en su lugar se utiliza el miembro lfWeight y el valor de este miembro está entre 0 y 1000. 400 es el valor normal, todo lo que esté por encima de esto está en negrita y todo lo que esté por debajo de esto es fino.
El código de la Figura 10 dibuja texto en ángulos que van desde 0 grados hasta 360 grados, a intervalos de 20 grados. Es el controlador de eventos OnPaint del formulario, por lo que el texto se vuelve a dibujar cada vez que se pinta el formulario.
El código de la Figura 10 dibuja caracteres cada 20 grados, de 0 a 360 grados. Esto se activa en el evento OnPaint del formulario, por lo que el texto se vuelve a dibujar cada vez que se pinta el formulario. El efecto se puede ver en la Figura 11.
procedimiento TForm1.FormPaint(Remitente: TObject);
var
Fuente antigua, Fuente nueva: hFont;
Fuente de registro: TLogFont;
yo: Entero;
comenzar
// Obtener el control de la fuente del lienzo.
Obtiene el identificador del objeto de fuente del formulario.
OldFont := Canvas.Font.Handle;
yo:= 0;
// Dibujo transparente.
Establecer propiedad de transparencia
SetBkMode(Canvas.Handle, Transparente);
// Llenar la estructura LogFont con información
Complete la estructura LogFont con información
// de la fuente actual.
de la fuente actual
GetObject(OldFont, Tamañode(LogFont), @LogFont);
// Los ángulos varían de 0 a 360.
de 0 a 360 grados
mientras i < 3600 comienzo
// Establece el escape en un nuevo ángulo.
Establecer la orientación del texto en un nuevo ángulo
LogFont.lfEscapement := i;
//Crear nueva fuente.
Crear nueva fuente
NuevaFuente := CreateFontIndirect(LogFont);
//Selecciona la fuente para dibujar.
Seleccionar fuentes para la salida
SeleccionarObjeto(Canvas.Handle, NewFont);
// Dibuja texto en el medio del formulario.
Texto de salida en el medio del formulario.
TextOut(Canvas.Handle, ClientWidth div 2,
ClientHeight div 2, 'Texto rotado', 21);
// Limpiar.
Claro
EliminarObjeto(SelectObject(Canvas.Handle, OldFont));
// Incrementa el ángulo en 20 grados.
incrementa cada 20 grados
Inc(yo, 200);
fin;
fin;
Figura 10: Código para dibujar texto girado en intervalos de 20 grados.
Figura 11: Texto girado 360 grados.
La fuente del formulario está configurada en Arial, una fuente TrueType. Este código funciona solo con fuentes TrueType; otros tipos de fuentes no admiten la rotación de texto. Para obtener la configuración de fuente actual y completar la estructura TLogFont, debe usar la función API GetObject. El código de la Figura 12 muestra cómo completar y mostrar la configuración de TLogFont para la fuente del formulario.
La fuente de este formulario está configurada en Arial, una fuente TrueType. Este código sólo funciona con fuentes TrueType; otras fuentes no admiten la rotación de texto. Para obtener la configuración de fuente actual y completar la estructura de TlogFont, debe utilizar la función API GetObject. En el código de la Figura 12 puede ver cómo completar y mostrar la configuración de TlogFont en el formulario.
procedimiento TForm1.Info1Click(Remitente: TObject);
var
Fuente de registro: TLogFont;
comenzar
// Llenar la estructura LogFont con información
Complete los valores de los miembros de la estructura LogFont
// de la fuente actual.
de la fuente actual
GetObject(Canvas.Font.Handle, Sizeof(LogFont), @LogFont);
// Muestra información de fuente.
Mostrar información de fuente
con LogFont hacer ShowMessage(
'lfAltura: ' + IntToStr(lfAltura) + #13 +
'lfAncho: ' + IntToStr(lfAncho) + #13 +
'lfEscapement: '+IntToStr(lfEscapement) + #13 +
'lfOrientación: ' + IntToStr(lfOrientación) + #13 +
'lfPeso: ' + IntToStr(lfPeso) + #13 +
'lfCursiva: ' + IntToStr(lfCursiva) + #13 +
'lfUnderline: ' + IntToStr(lfUnderline) + #13 +
'lfStrikeOut: ' + IntToStr(lfStrikeOut) + #13 +
'lfCharSet: ' + IntToStr(lfCharSet) + #13 +
'lfOutPrecision: ' + IntToStr(lfOutPrecision) + #13 +
'lfClipPrecision: ' + IntToStr(lfClipPrecision) + #13 +
'lfQuality: ' + IntToStr(lfQuality) + #13 +
'lfPitchAndFamily: '+IntToStr(lfPitchAndFamily) + #13 +
'lfFaceName: ' + cadena(lfFaceName));
fin;
Figura 12: Obtención y visualización de atributos de fuente.
Una vez que tenga la configuración en una estructura TLogFont, el único cambio que queda es configurar lfEscapement en el ángulo deseado y crear una nueva fuente con CreateFontIndirect. Antes de usar esta nueva fuente, se debe seleccionar con SelectObject. Otra forma es asignar el identificador. de esta nueva fuente al identificador de la fuente del lienzo, antes de dibujar el texto, después de dibujar el texto, se debe revertir este trabajo y eliminar la nueva fuente. no se elimina, habrá una pérdida de memoria y, si la rutina se ejecuta muchas veces, Windows (especialmente 95/98) se quedará sin recursos y fallará.
Una vez que haya configurado la estructura TlogFont, lo único que queda por hacer es cambiar el valor de lfEscapement al valor objetivo y usar CreateFontIndirect para generar una nueva fuente. Antes de usar esta nueva fuente, debe usar SelectObject para seleccionarla. Otro método es utilizar el identificador de este nuevo objeto de fuente en el identificador del objeto de fuente del lienzo del formulario antes de dibujar el texto. Una vez dibujado el texto, comienza el proceso; se debe seleccionar la fuente anterior y eliminar la nueva. Si no se elimina la nueva fuente, provocará una pérdida de memoria y -----si el programa se ejecuta varias veces------ Windows (especialmente 95/98) se quedará sin recursos y
chocar.
Líneas elegantes
lineas populares
Cuando dibuja líneas, los píxeles individuales generalmente no importan; simplemente establece el estilo de línea y Windows lo dibuja. A veces, sin embargo, necesita hacer algo especial y dibujar un estilo de línea que no proporciona Windows. utilizando una función API de Windows denominada LineDDA, definida en la Figura 13.
Cuando dibuja líneas, los píxeles individuales generalmente no son importantes; simplemente establece el tipo de línea y Windows deberá dibujarla. A veces, sin embargo, desea crear algunos tipos de líneas especiales que Windows no proporciona. Esto se puede lograr utilizando una función API llamada LineDDA, cuya definición se puede ver en la Figura 13.
función LíneaDDA(
nXStart, // coordenada x del punto inicial de la línea.
Punto inicial de la coordenada X
nYStart, // coordenada y del punto inicial de la línea.
Punto de partida de la coordenada Y
nXEnd, // coordenada x del punto final de la línea.
Punto final de la coordenada X
YEnd: Entero; // coordenada y del punto final de la línea.
Punto final de la coordenada Y
// Dirección de la función de devolución de llamada definida por la aplicación.
La dirección de la función de devolución de llamada definida por la aplicación.
lpLineFunc: TFNLineDDAProc;
lpData: LPARAM // Dirección de datos definidos por la aplicación.
Dirección de datos definidos por la aplicación
): BOOL; llamada estándar;
Figura 13: Declaración de objeto Pascal para la función API de Windows, LineDDA.
Los primeros cuatro parámetros son los puntos inicial y final de la línea. El quinto parámetro es una función de devolución de llamada que se llamará cada vez que se debe dibujar un píxel. El último parámetro es un parámetro de usuario que será. pasado a la función de devolución de llamada Puede pasar cualquier número entero o puntero a la función, porque es un LParam (en Win32, se traduce a Longint. La función de devolución de llamada debe tomar la forma que se muestra aquí:
Los primeros cuatro parámetros son los puntos inicial y final de la línea. El quinto parámetro es una función de devolución de llamada que se llamará cada vez que se dibuje un píxel. Puedes escribir sobre tu proceso de dibujo aquí. El último parámetro está definido por el usuario y se puede pasar a la función de devolución de llamada. Puede pasar cualquier número entero o puntero a esta función porque es
Un tipo Lparam (en WIN32, se interpreta como un tipo Longint). Esta función de devolución de llamada debe utilizar un formulario como el siguiente:
procedimiento CallBackDDA(x, y: entero;
Parámetro de usuario: LParam);
donde xey son las coordenadas del punto dibujado y UserParam es un parámetro que se pasa a la función. Esta función debe declararse como stdcall. La rutina de la Figura 14 dibuja una línea de mapas de bits y la Figura 15 muestra el resultado.
Aquí X e Y son los puntos de coordenadas que se dibujan y UserParam es un parámetro. Esta función debe subdefinirse como stdcall. El programa de la Figura 14 traza una línea BMP y la Figura 15 muestra los resultados.
tipo
TForm1 = clase(TForm)
ListaImagen1: TImageList;
procedimiento FormPaint(Remitente: TObject);
procedimiento FormResize(Remitente: TObject);
fin;
var
Formulario1: TForm1;
procedimiento CallDDA(x, y: entero; formulario: TForm1);
implementación
{ $R *.DFM }
procedimiento CallDDA(x, y: Entero; Forma: TForm1);
comenzar
si x mod 13 = 0 entonces
Form.ImageList1.Draw(Form.Canvas, x, y, 0);
fin;
procedimiento TForm1.FormPaint(Remitente: TObject);
comenzar
LineDDA(0, 0, Ancho de cliente, Altura de cliente,
@CallDDA, Entero(Yo));
fin;
procedimiento TForm1.FormResize(Remitente: TObject);
comenzar
Invalidar;
fin;
Figura 14: Código para dibujar una línea de mapas de bits.
Figura 15: Ventana con una línea personalizada.
Esta rutina maneja el evento OnPaint del formulario, llamando a LineDDA, por lo que cada vez que se debe pintar el formulario vuelve a dibujar la línea. Otro evento que se maneja es OnResize, que invalida el área cliente del formulario, por lo que se debe volver a dibujar la línea cuando alguien cambia su. tamaño La función de devolución de llamada de LineDDA, CallDDA, es muy simple. En cada decimotercer punto que se llama, dibuja el mapa de bits almacenado en ImageList. Se pasa Self como último parámetro. la función de devolución de llamada, para que pueda acceder a los datos de la instancia.
Este programa maneja el evento OnPaint del formulario, llamando a LineDDA, por lo que volverá a dibujar la línea cada vez que se pinte el formulario. Otro evento es OnResize, que invalida el área de cliente del formulario por lo que las líneas se volverán a dibujar cuando alguien cambie su tamaño. La función de devolución de llamada LineDDA y CallDDA son muy simples. Siempre que se llame 13 veces, dibujará el mapa de bits almacenado en ImageList. Quizás hayas notado que SELF se pasa como último parámetro a la función de devolución de llamada, para que pueda acceder a los datos del programa.
Conclusión
en conclusión
Desde que el dibujo del propietario fue expuesto en TMainMenu en Delphi 4, ha habido muchas maneras de aumentar sus menús. Usando las técnicas que hemos discutido aquí, puede mejorar fácilmente los menús de su aplicación Delphi con texto, mapas de bits y colores personalizados.
Ahora que el dibujo del propietario apareció en TmainMenu de Delphi 4, puede tener muchas formas de ampliar la funcionalidad de su menú. Utilizando las técnicas que analizamos anteriormente, puede mejorar fácilmente la funcionalidad del menú de su aplicación DELPHI con texto, mapas de bits y colores personalizados.