Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 10.03.19 07:33 
Hallo Forum

Problemstellung:
Ein Text, welcher mit der Funktion DrawText() zentriert auf eine Leinwand gezeichnet wird, soll um den Mittelpunkt herum rotiert werden.
Wie und womit könnte man es umsetzen?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 277
Erhaltene Danke: 5

Win 98, Win Xp, Win 10
C# (VS 2017)
BeitragVerfasst: Di 12.03.19 17:05 
Hallo,

wenn du den Text schon per GDI renderst, muss die Drehung mit Delphi gemacht werden?

Rotating lines of text

Ansonsten wird doch üblicherweise auf eine Bitmap oder ein Rectangle/Panel etc gezeichnet und dann gedreht.
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.03.19 13:44 
Guten Tag Chiyoko,

das setzen des Feldes LOGFONT.lfEscapement trägt dazu bei, dass sich der Text entlang seines Ursprungs (linke obere Ecke) rotiert.
Delphi handhabt es auch so mit der Eigenschaft Font.Orientation. Dieser Effekt ist nicht gewünscht.

Wo ich darüber nachdenke: Die Textbreite entspricht auf einem rechtwinkligen Dreieck der Hypotenuse, der Winkel zur Ankatete ist bekannt, das ist der Rotationswinkel. Man braucht nur noch die Ankatete herauszufinden, sie zu halbieren, die resultierende Gegenkatete zu ermitteln, die dann den Abstand ausmacht, um den ich den Text nach rechts verschieben muss, nachdem der Text rotiert wurde.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 277
Erhaltene Danke: 5

Win 98, Win Xp, Win 10
C# (VS 2017)
BeitragVerfasst: Mi 13.03.19 14:04 
Und wenn du den Formatparameter DT_CENTER setzt, anstatt wilde Berechnungen anzugehen?
Kann den Code momentan nicht testen, daher nur Hinweise.
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.03.19 14:09 
Müsste ich testen. Wenn es sich so verhält wie z.B. beim Setzen von TLabel.Alignment := taCenter;
dann rotiert es immer noch nicht um den Mittelpunkt herum.

Nachtrag

Selbst bei zentrierter Textausrichtung (DT_CENTER) dreht sich der Text um den Ursprung.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 514
Erhaltene Danke: 206

W7
Delphi 6 pro
BeitragVerfasst: Fr 15.03.19 17:43 
Moin Frühlingsrolle,
habe eine Demo gefunden: Kochbuch Delphi6 von Doberenz.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure DC_TextOut(x,y,winkel,groesse:integer;txt:string);
var hfont, fontold : integer;
    dc             : hdc;
    fontname       : string;

begin
     if length(txt)= 0 then exit;
     dc := Screen.ActiveForm.Canvas.handle;
     SetBkMode(dc,transparent);
     fontname := Screen.ActiveForm.Canvas.font.name;
     hfont   := CreateFont(-groesse,0,winkel*10,0,fw_normal,0,0,0,1,4,$10,2,4,PChar(fontname));
     fontold := SelectObject(dc,hfont);
     TextOut(dc,x,y,PChar(txt),length(txt));
     SelectObject(dc, fontold);
     DeleteObject(hfont);
end;

procedure TForm1.FormResize(Sender: TObject);
var i,n,x,y : integer;
begin
    refresh;
    n := 60;
    i := 0;
    x := clientwidth div 2;
    y := clientheight div 2;
    while i < 500 do begin
        If n > 10 Then Dec(n,2Else If n > 2 Then dec(n);
        DC_textout(x, y, i, n, '         rotierender Text');
        Inc(i,15);
    end;
end;


Mußt Du mal testen.
Gruß Fiete

_________________
Fietes Gesetz: use your brain (THINK)
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 15.03.19 18:16 
Danke für's Mitdenken, Fiete!

Wenn man sich das Beispiel nur mal durchliest, so unterscheidet es sich zum vorherigen Ansatz lediglich darin, dass es CreateFont() statt CreateFontIndirect() aufruft.
Im Paint-Ereignis wird der Text(anfang) mittig platziert und wieder nur um den Ursprung herum rotiert.
Anders gesagt, der Text dreht sich wie ein Zeiger in einem Uhrwerk, was er nach meinen Anforderungen nicht soll.
Wenn ich das gewollt hätte, müsste ich nur .Font.Orientation := Winkel * 10; setzen.

delphi_rotation
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 277
Erhaltene Danke: 5

Win 98, Win Xp, Win 10
C# (VS 2017)
BeitragVerfasst: Gestern um 09:21 
In C# reicht es aus, die Transformationsmatrix zu ändern.
Da auch andere Sprachen auf s selbe System zugreifen, sollte es bei Delphi ja was ähnliches geben.

Graphics.RotateTransform() / TranslateTransform()