Thanks to every one's input and code I found on the net, I've been able to 
come up with this so far.

http://i23.photobucket.com/albums/b358/remnar/ttexample.jpg

The only thing I need to do now is find a way to limit the width so it 
wraps. I came up with a algorithm to determine the amount of lines it would 
wrap to, but it's not perfect and maybe you can help me with it. I use the 
following code for my TtsxToggle and TtsxCommand controls and it works well 
except when the text is 1 line and small.

procedure TtsxToggle.DrawCaption;
var
  r: TRect;
  cy, op, p, l, tw: integer;
  str, str1, substr: string;
  strs: array of string;
begin
  with Canvas do begin
    Font:= Self.Font;
    Brush.Color:= Self.Color;
    Brush.Style:= bsClear;
    r:= RECT(5, 5, Width - 5, Height - 5);
    //calculate number of possible lines of text
    l:= 1;
    str1:= Caption;
    str:= '';
    substr:= #10#13;
    p:= Pos(substr, str1);
    op:= p;
    if (p > 0) then begin
      while (Pos(substr, str1) > 0) do begin
        str:= copy(str1, 1, Pos(substr, str1) - 1);
        str1:= copy(Caption, p + 1, Length(Caption));
        p:= p + Pos(substr, str1);
      end;
      l:= p div op + 1;
    end
    else begin
      substr:= ' ';
      str:= '';
      str1:= Caption;
      p:= Pos(substr, str1);
      if (p > 0) then try
        op:= 0;
        while (Pos(substr, str1) > 0) do begin
          op:= op + 1;
          SetLength(strs, op);
          strs[op - 1]:= copy(str1, 1, Pos(substr, str1) - 1);
          str1:= copy(Caption, p + 1, Length(Caption));
          p:= p + Pos(substr, str1);
        end;
        op:= op + 1;
        SetLength(strs, op);
        strs[op - 1]:= str1;
        tw:= 0;
        for p:= 0 to op - 1 do begin
          tw:= tw + TextWidth(strs[p]) + 2;
          if (tw > (r.Right - r.Left - 1)) then begin
            l:= l + 1;
            tw:= TextWidth(strs[p]) + 2;
          end;
        end;
        if (l > op) then
          l:= l - 1;
      finally
        strs:= nil;
      end;
    end;
    cy:= TextHeight(Caption) * l; // lines of text applied
    r.Top:= Height div 2 - cy div 2;
    if (not Enabled) then begin
      Font.Color:= RGB(245, 241, 244);
      r:= RECT(r.Left + 1, r.Top + 1, r.Right + 1, r.Bottom + 1);
    end;
    case Alignment of
      taLeftJustify:
        DrawText(Canvas.Handle, PChar(Caption), Length(Caption), r, DT_LEFT 
or DT_VCENTER or DT_WORDBREAK);
      taRightJustify:
        DrawText(Canvas.Handle, PChar(Caption), Length(Caption), r, DT_RIGHT 
or DT_VCENTER or DT_WORDBREAK);
      taCenter:
        DrawText(Canvas.Handle, PChar(Caption), Length(Caption), r, 
DT_CENTER or DT_VCENTER or DT_WORDBREAK);
    end;
    if (not Enabled) then begin
      Font.Color:= RGB(150, 107, 48);
      r:= RECT(r.Left - 1, r.Top - 1, r.Right - 1, r.Bottom - 1);
      case Alignment of
        taLeftJustify:
          DrawText(Canvas.Handle, PChar(Caption), Length(Caption), r, 
DT_LEFT or DT_VCENTER or DT_WORDBREAK);
        taRightJustify:
          DrawText(Canvas.Handle, PChar(Caption), Length(Caption), r, 
DT_RIGHT or DT_VCENTER or DT_WORDBREAK);
        taCenter:
          DrawText(Canvas.Handle, PChar(Caption), Length(Caption), r, 
DT_CENTER or DT_VCENTER or DT_WORDBREAK);
      end;
    end;
  end;
end;
__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi-talk

Reply via email to