Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TextOut Font zuweisung (https://www.delphipraxis.net/114698-textout-font-zuweisung.html)

EWeiss 29. Mai 2008 19:49

Re: TextOut Font zuweisung
 
Zitat:

Zitat von Luckie
Oh, sorry, habe ich überlesen.

Jetzt muss ich aber mal heheheheh :wall:

gruss Emil

EWeiss 30. Mai 2008 00:01

Re: TextOut Font zuweisung
 
Liste der Anhänge anzeigen (Anzahl: 3)
Habe noch ein seltsames problem
Meine Funktion

Delphi-Quellcode:
procedure GetInfo;
var
  r, r2    : Trect;
  StrPos  : String;

begin
  if SoInfo.Title <> '' then
  begin
    r := Rect(5, VisInfo^.h -15, VisInfo^.w-100, VisInfo^.h);
    DrawText(VisInfo^.VisDC, PChar(SoInfo.Title),
             Length(SoInfo.Title), r, DT_BOTTOM or DT_END_ELLIPSIS);

    StrPos := GetSongPosStr(SoInfo.Pos);
    StrPos := StrPos + '' + GetSongPosStr(1000 * SoInfo.Len);

    r2 := Rect(VisInfo^.w-96, VisInfo^.h -15, VisInfo^.w, VisInfo^.h);
    DrawText(VisInfo^.VisDC, PChar(StrPos),
             Length(StrPos), r2, DT_BOTTOM or DT_END_ELLIPSIS);

  end;

end;
Diese zeichnet jetzt den Titel und die Zeit Informationen auf das DC
Es ist aber nicht alles in Ordnung der Text wird verändert .. Bilder im Anhang

Delphi-Quellcode:
      SetBkMode(VisInfo^.VisDC, TRANSPARENT);
      //SetBkColor(VisInfo^.VisDC, rgb(0,0,0));
      SetTextColor(VisInfo^.VisDC, RGB(255,255,255));
      Font := CreateFont(8, 0, 0, 0, 0, 0, 0, 0,
                         ANSI_CHARSET,
                         OUT_DEFAULT_PRECIS,
                         CLIP_DEFAULT_PRECIS,
                         DEFAULT_QUALITY,
                         DEFAULT_PITCH, 'MS Sans Serif');

      OldFont := SelectObject(VisInfo^.VisDC, Font);
Das ist aber nur bei SetBkMode TRANSPARENT
Ist der hintergrund schwarz tritt das problem nicht auf.
Kann ich aber nicht lassen da es beschi... aus sieht.

Was gibt es da für eine möglichkeit um das zu unterbinden ?

gruss Emil

Muetze1 30. Mai 2008 01:46

Re: TextOut Font zuweisung
 
Grob vermutet: Du malst den neuen Text an neuer Position (scrollen/neue Chars) und da der Transparent ist und der Hintergrund noch nicht neu gezeichnet wurde, malt er das ganze daneben bzw. darüber.

Ergo: Hintergrund vor der Ausgabe des neuen Textes an der Stelle zeichnen.

EWeiss 30. Mai 2008 02:44

Re: TextOut Font zuweisung
 
Zitat:

Zitat von Muetze1
Grob vermutet: Du malst den neuen Text an neuer Position (scrollen/neue Chars) und da der Transparent ist und der Hintergrund noch nicht neu gezeichnet wurde, malt er das ganze daneben bzw. darüber.

Ergo: Hintergrund vor der Ausgabe des neuen Textes an der Stelle zeichnen.

Eigentlich nicht.
Der Text ist immer an einer festen position und wird nicht verändert.

Die Intitialisierung

Delphi-Quellcode:
SetBkMode(VisInfo^.VisDC, TRANSPARENT);
SetTextColor(VisInfo^.VisDC, RGB(255,255,255));
Font := CreateFont(8, 0, 0, 0, 0, 0, 0, 0,
                   ANSI_CHARSET,
                   OUT_DEFAULT_PRECIS,
                   CLIP_DEFAULT_PRECIS,
                   DEFAULT_QUALITY,
                   DEFAULT_PITCH, 'MS Sans Serif');

OldFont := SelectObject(VisInfo^.VisDC, Font);
wird dann gemacht wenn ein neues Plugin gestartet wird
der Font vorher gelöscht wenn das alte Plugin frei gegeben wird.

Die infos werden in der Render Funktion aufgerufen
Delphi-Quellcode:
GetInfo;

if (not BitBlt(canvas, VisInfo^.x, VisInfo^.y, VisInfo^.w, VisInfo^.h, VisInfo^.VisDC, 0,
  0, SRCCOPY)) then
begin
  VisInfo^.Rendering := False;

  BassFuncs^.SetError(BASS_ERROR_DEVICE);
  Exit;
end;
und danach direkt auf das DC kopiert
Da ändert sich nichts was den Text angeht die reihenfolge bleibt sich gleich.
Es sieht aber so aus das es nur dann auftritt wenn OpenGl Plugins gestartet wurden.
Kann es sein das diese TextOut oder die Transparenz zerstört ?
Wenn ja wie kann ich das beheben.

gruss Emil

littleDave 30. Mai 2008 11:10

Re: TextOut Font zuweisung
 
Ich glaube, das Problem liegt daran, dass du mit der Windows GDI auf ein Fensterhandle zeichen willst, dass von OpenGL benutzt wird. Solch ein "Mix" ist überhaupt nicht zu empfehlen, da dadurch genau solche Fehler entstehen können. Wenn du Text auf ein OpenGL-Fenster zeichnen willst, solltest du das auch mit OpenGL machen. Dazu hast du zwei Möglichkeiten.
  • Bitmap-Fonts: die einzelnen Buchstaben werden in einer Textur gespeichert. Beim rendern zeichnest du dann einfach ein Quad und übergibst die Texturkoordinaten des gewünschten Buchstaben. Diese Methode ist sehr schnell und hat sogar den Vorteil, dass du alle Schriftarten benutzen kannst - egal ob sie auf dem Zielrechner vorhanden sind oder nicht - da du sie ja in ein Bitmap speicherst. Nachteil ist leider der etwas größere Aufwand bei der Erstellung und der Verwaltung der Fonts. Außerdem musst du bei dieser Methode Funktionen wie das Zeichnen oder das Auslesen der Schriftlänge komplett selbst schreiben.
    Hier ein Tool, mit dem sich Bitmap-Fonts erstellen und benutzen lassen: Nitrogen Font Studio: FontStudio - Fonts erstellen Beispielprogramm zur Benutzung
  • Windows-Fonts: diese Methode hat relativ identisch zur Windows-Methode. Du erstellst in OpenGL eine Display-Liste, in der die einzelnen Linien jedes Buchstabens gespeichert werden. Dafür gibt es sogar unter Windows bereits eine Funktion, die dir das abnimmt. Mit dieser Methode kannst du soger recht einfach dreidimensionale Schrift verwenden. Der Nachteil dieser Methode ist, dass es relativ zu den Bitmap-Fonts langsamer ist (aber immer noch schneller als die Windows-GDI).
    Hier ein Beispiel, wie du das umsetzen könntest: wglUseFontOutlines
Grüße
Dave

SirThornberry 30. Mai 2008 12:06

Re: TextOut Font zuweisung
 
wenn du nicht auf die VCL verzichten musst geht es auch so:
Delphi-Quellcode:
var
  lCanvas: TCanvas;
begin
  lCanvas := TCanvas.Create();
  try
    lCanvas.Handle := Your_HDC;
    try
      lCanvas.Font.Name := 'irgendwas';
      lCanvas.Font.Color := irgendeine;
      [...]
    finally
      lCanvas.Handle := 0;
    end;
  finally
    lCanvas.Free;
  end;

EWeiss 30. Mai 2008 12:44

Re: TextOut Font zuweisung
 
Zitat:

Zitat von SirThornberry
wenn du nicht auf die VCL verzichten musst geht es auch so:
Delphi-Quellcode:
var
  lCanvas: TCanvas;
begin
  lCanvas := TCanvas.Create();
  try
    lCanvas.Handle := Your_HDC;
    try
      lCanvas.Font.Name := 'irgendwas';
      lCanvas.Font.Color := irgendeine;
      [...]
    finally
      lCanvas.Handle := 0;
    end;
  finally
    lCanvas.Free;
  end;

Danke werde es mal versuchen bevor ich auf OpenGl zugehe.

@littleDave
Mit den Bitmapfonts mache ich ja schon in vis_BassVis stellt kein problem dar halt nicht unicode fähig.

Die andere variante müßte ich testen denn auch da würden 2 verschiedene Welten aufeinander treffen.
Weiss nicht ob sich BitBlt und OpenGl vertragen, werde es mal testen sollte die andere Methode nicht funktionieren.

gruss Emil

EWeiss 30. Mai 2008 13:53

Re: TextOut Font zuweisung
 
Habe es jetzt mal nach TCanvas umgestellt..
Selbe problem hmmmm....

Im Render Event
Delphi-Quellcode:
if SoInfo.Title <> '' then
  BassSoVis1.DrawSongName(VisCanvas);

if (not BitBlt(canvas, VisInfo^.x, VisInfo^.y, VisInfo^.w, VisInfo^.h, VisInfo^.VisDC, 0,
  0, SRCCOPY)) then
begin
  VisInfo^.Rendering := False;

  BassFuncs^.SetError(BASS_ERROR_DEVICE);
  Exit;
end;
Delphi-Quellcode:
procedure OutlinedDrawText(Canvas: TCanvas;
                          r: TRect;
                          const Text: string;
                          OutlineColor: TColor);

var
  OldBrushStyle: TBrushStyle;
  OldFontColor : TColor;

begin
   with Canvas do
   begin
      Lock;
      OldFontColor := Font.Color;
      Font.Color := OutlineColor;
      OldBrushStyle := Brush.Style;
      Brush.Style := bsClear;
      Font.Color := OldFontColor;
      DrawText(Canvas.Handle, PChar(Text),
             Length(SoInfo.Title), r, DT_BOTTOM or DT_END_ELLIPSIS);
      Brush.Style := OldBrushStyle;
      Unlock;
   end;
end;


procedure TBASSSoniqueVis.DrawSongName(Canvas : TCanvas);
var
  Text: String;
  r  : TRect;

begin
   with Canvas do
   begin
      Lock;
      Text := SoInfo.Title;
      Font.Size := 10;
      Font.Name := 'Arial';
      canvas.Brush.Style := bsClear;
      Font.Color := clWhite;
      r := Rect(5, VisInfo^.h -15, VisInfo^.w-100, VisInfo^.h);
      OutlinedDrawText(Canvas, r, Text, clBlack);
      Unlock;
  end;

end;
Was machen ??
Geht auch hier nichts ohne auf OpenGl umzusteigen ?

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz