AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TextOut Font zuweisung
Thema durchsuchen
Ansicht
Themen-Optionen

TextOut Font zuweisung

Ein Thema von EWeiss · begonnen am 29. Mai 2008 · letzter Beitrag vom 30. Mai 2008
Antwort Antwort
Seite 2 von 2     12   
EWeiss
(Gast)

n/a Beiträge
 
#11

Re: TextOut Font zuweisung

  Alt 29. Mai 2008, 19:49
Zitat von Luckie:
Oh, sorry, habe ich überlesen.
Jetzt muss ich aber mal heheheheh

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 00:01
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
Miniaturansicht angehängter Grafiken
normal_146.jpg   f2_134.jpg   f1_196.jpg  
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 01:46
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 02:44
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
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#15

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 11:10
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
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#16

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 12:06
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 12:44
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

Re: TextOut Font zuweisung

  Alt 30. Mai 2008, 13:53
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz