Wednesday, 2 September 2009

Implementación de un Canvas para modificar Objetos en Delphi parte VI

Veo que esto va para largo, y después de varios días ya voy por la sexta parte de éste tema que parece que no se va a acabar nunca. Bien, continuando con la misma temática de siempre, he tenido que dibujar diferentes líneas para diferenciar el concepto de enlace que quiero sobre las cajas. Más adelante veréis como lo utilizaré. En mi caso, necesito poder realizar un tipo de conexión que sea de tipo físico (enlace real de conexión, como conectar una manguera), y otro tipo de enlace más conceptual o mental (ésto va conectado a aquello por referencia). Pues bien, en ésta última versión, modifico los tipos de enlace y los diferencio porque unos van con línea continua y otros con línea alternada.

El problema que se plantea (como siempre!), es cómo dibujo ésta línea discontinua en el canvas???. La solución es bastante sencilla, ya que la propia API de windows nos permite crear nuestras pen personalizadas a la hora de dibujar.

Por lo tanto, podemos definir los saltos entre línea y la longitud de las líneas y pasarlas a la función ExtCreatePen para personalizar nuestro propio pen.

El resultado es el siguiente:

Luego, para crear la línea punteada, lo tenemos que hacer de la siguiente manera:

var
    userPenStyle: array[1..2] of Dword = (8, 8);

/////////////////////////////////////
    hand : cardinal;
    LogBrush: TLogBrush;
begin
    Image1.Canvas.Pen.Width := 1;
    Image1.Canvas.Pen.Color := color;
    Image1.Canvas.Brush.Style := bsSolid;

    LogBrush.lbStyle := BS_SOLID;
    logBrush.lbColor := Image1.Canvas.Pen.Color;
    hand := Image1.Canvas.Pen.Handle;
    Image1.Canvas.Pen.Handle := ExtCreatePen(PS_GEOMETRIC or PS_USERSTYLE,
                                  Image1.Canvas.Pen.Width,
                                  logBrush,
                                  Length(userPenStyle), @userPenStyle);

    //Dibujamos la línea

    Image1.Canvas.MoveTo(POrigen.x, POrigen.y);
    Image1.Canvas.LineTo(PDestino.x, PDestino.y);
    Image1.Canvas.Pen.Handle := hand;
    Image1.Canvas.Pen.Width := 1;
    Image1.Canvas.Pen.Color := color;
    Image1.Canvas.Brush.Style := bsSolid;

Aquí podréis descargar la última versión estable (beta) de ThundaxBoxManager v1.0.0 build 17. exe.

0 comments:

Post a Comment