Problem mit DC



  • Hi.

    ich habe eine freie Labelkomponente die man um 360° drehen kann, leider zeichnet diese nicht nur auf der TForm sondern auch auf dem Desktop (winXP/CBuilder5) 😮

    Ich denke mal das DC := GetDC(0); ist dafür verantwortlich, weil 0 der Desktop ist, aber was muss ich dann dort eintragen damit es nicht mehr parallel auf dem Desktop dargestellt wird?

    Quelle: http://www.micrel.cz/delphi/download/jblabel3d.zip

    StrPCopy(cStr,aTxt);
      DC := GetDC(0);
      hSavFont := SelectObject(DC,Font.Handle);
      {$IFDEF WIN32}
      GetTextExtentPoint32(DC,cStr,Length(aTxt),Size);
      {$ELSE}
      GetTextExtentPoint(DC,cStr,Length(aTxt),Size);
      {$ENDIF}
      SelectObject  (DC,hSavFont);
      ReleaseDC(0,DC);
    

    Kann mir da jemand weiterhelfen?



  • Hallo

    Im Builder haben die von TControl abgeleiteten Klassen die Eigenschaft Handle, die das notwendige WinAPI-Handle zurückgibt.

    bis bald
    akari



  • Wenn ich es in DC := GetDC(Handle); abändere und Komponenten compiliere, meint er Fehler: Unbekannter Bezeichner Handle. 😞



  • Habs mit GetDC(Application.Handle) probiert und er compiliert es Fehlerfrei, aber die Anzeige auf dem Desktop ist trotzdem immernoch.



  • Hallo

    Okay Handle wird erst bei TWinControl eingeführt, TLabel ist aber nur von TControl abgeleitet. Das heißt du hast so einfach keinen einfluß auf das Zeichenverhalten von TLabel. Du müßtest von TLabel ableiten und die Zeichenmethode überschrieben oder gleich eine neue Komponente erstellen und alles selber machen.

    bis bald
    akari



  • Also zeichnet tut er es ja selbst, da die 360° Funktion enthalten ist. 😕

    TLabel3D = class(TCustomLabel)
    
    {==========================================================================}
    procedure TLabel3D.DrawAngleText(aCanvas:TCanvas;aRect:tRect;aAngle:Integer;aTxt:String);
    {==========================================================================}
    { Draw text with FontIndirect (angle -> escapement)                        }
    {--------------------------------------------------------------------------}
    var LFont             : TLogFont;
        hOldFont, hNewFont: HFont;
    begin
      CalcTextPos(aRect,aAngle,aTxt); // Code aus Post #1
    
      GetObject(aCanvas.Font.Handle,SizeOf(LFont),Addr(LFont));
      LFont.lfEscapement := aAngle*10;
      hNewFont := CreateFontIndirect(LFont);
      hOldFont := SelectObject(aCanvas.Handle,hNewFont);
    
      aCanvas.TextOut(aRect.Left,aRect.Top,aTxt);
    
      hNewFont := SelectObject(aCanvas.Handle,hOldFont);
      DeleteObject(hNewFont);
    end;
    


  • Hallo

    Du kannst natürlich auch einfach die Handle-Eigenschaft des Canvas-Objektes nehmen. 😃

    bis bald
    akari



  • Das eine gute Idee nur dann passiert was ganz komisches, statt oben links ist es dann unten links über der Taskleiste die Schrift und in der TForm ist die Schrift garnicht mehr, sondern Löcher und die Form "wackelt" gehe ich im Programm wohin wo nicht diese Label sind ist alles normal. 😮



  • Delphi schrieb:

    Habs mit GetDC(Application.Handle) probiert und er compiliert es Fehlerfrei, aber die Anzeige auf dem Desktop ist trotzdem immernoch.

    Ist auch Quatsch, da das Application-Fenster ein maximiertes "durchsichtiges" Fenster ist. Versuch mal mit GetDC(Parent.Handle).


Anmelden zum Antworten