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).