Entwickler-Ecke

Multimedia / Grafik - Wie sehr große benutzerdefinierte Cursor erstellen?


uko - Fr 07.05.10 16:01
Titel: Wie sehr große benutzerdefinierte Cursor erstellen?
Hi,

ich such gerade nach einer Möglichkeit, einen beliebig großen Textcursor darzustellen. Hintergrund ist der: in meinem Programm kann man auf einem Canvas Text eingeben (mittels selbst gezeichneter Texteditoren). Wenn das Programm in diesem Modus ist, wird als Cursor crIBeam verwendet. Da der Benutzer die Fontgröße einstellen kann würde ich gerne den Cursor in der Größe des Fonts darstellen (nicht im Editor, sondern solange ich in diesem Modus über den Canvas mit der Maus rumbewege!). Also 40pt Font, sollte einen entsprechend großen Cursor haben.
Das hat nämlich dann den Vorteil, daß man sieht, wo sein Text genau plaziert wird.

Nur, wie kann man das machen? Ein extra transparentes Fenster mitlaufen zu lassen und den Cursor auf einen Punkt zu reduzieren geht aus Performancegründen nicht, da dann ständig der Hintergrund neu gezeichnet werden müßte.

Kann man den Standardcursor irgendwie dazu mißbrauchen? Oder gibt's da andere Methoden?


ps: wenn es besser passen sollte, dann bitte nach Windows API verschieben

Grüße,
Uli


ffgorcky - Fr 07.05.10 16:24

Entschuldigung - meinst Du
1.)den Cursor, der zur Texteingabe blinkt, oder
2.)meinst Du den Mauszeiger?
Wenn Du 1. meinst, dann gucke doch z.B. mal auf der Seite Extrem grosser Cursor - MCSEboard.de MCSE Forum [http://www.mcseboard.de/windows-forum-allgemein-83/extrem-grosser-cursor-85172.html].


uko - Fr 07.05.10 16:32

Ich meine den Mauszeiger, ersteres ist mit Carets erledigt.

Uli


Martok - Fr 07.05.10 16:41

Ich würde sagen, du Zeichnest dir ein passendes Icon (kann Delphi nicht nativ in der Größe->WinAPI) und lädst selbiges per LoadCursor, so wie man das allgemein für eigene Cursor macht.

Alternativ: Cursor ausblenden und direkt auf dem Ziel-Canvas per XOR malen, das kriegt man dann auch ohne alles neu zeichnen zu müssen wieder weg.


uko - Mo 10.05.10 14:57

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde sagen, du Zeichnest dir ein passendes Icon (kann Delphi nicht nativ in der Größe->WinAPI) und lädst selbiges per LoadCursor, so wie man das allgemein für eigene Cursor macht.

Ja, so hab ich's nun gemacht. Funktioniert prima, und nun hab ich auch die Speicherlecks weg :-) Ach ja, nicht wundern wegen dem IPicture unten: ich brauch es als solches um es dem Cursor eines InkOverlays zuweisen zu können.

Danke an alle,
Uli


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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
    // Daraus das Text-Cursoricon neu zeichnen
    bmpMask := TBitmap.Create;
    bmpColor := TBitmap.Create;
    try
      With bmpColor do
      begin
        Width  := 8;
        Height := Round5(dFontBaseline);
        Canvas.Brush.Color := clBlack;
        Canvas.FillRect(RECT(0,0,Width,Height));
        Canvas.Pen.Color := clBlack;
        Canvas.MoveTo(4,1);
        Canvas.LineTo(4, Height - 2);
        Canvas.MoveTo(1,0);
        Canvas.LineTo(3,0);
        Canvas.MoveTo(5,0);
        Canvas.LineTo(7,0);
        Canvas.MoveTo(1,Height - 1);
        Canvas.LineTo(3,Height - 1);
        Canvas.MoveTo(5,Height - 1);
        Canvas.LineTo(7,Height - 1);
      end;

      With bmpMask do
      begin
        Width  := 8;
        Height := Round5(dFontBaseline);
        Monochrome := true;
        Canvas.Brush.Color := clWhite;
        Canvas.FillRect(RECT(0,0,Width,Height));
        Canvas.Pen.Color := clBlack;
        Canvas.MoveTo(4,1);
        Canvas.LineTo(4,Height - 2);
        Canvas.MoveTo(1,0);
        Canvas.LineTo(3,0);
        Canvas.MoveTo(5,0);
        Canvas.LineTo(7,0);
        Canvas.MoveTo(1,Height - 1);
        Canvas.LineTo(3,Height - 1);
        Canvas.MoveTo(5,Height - 1);
        Canvas.LineTo(7,Height - 1);
      end;

      // Icon erstellen
      with IconInfo do
      begin
        fIcon := False; // kein Icon sondern Cursor
        xHotspot := 4;
        yHotspot := Round5(dFontBaseline) - 1;
        hbmMask := bmpMask.Handle;
        hbmColor := bmpColor.Handle;
      end;

      // Icon in IPicture laden
      lPictureDisp := nil;
      FCursorTextModePicture.Icon.Handle := CreateIconIndirect(iconInfo);  // FCursorTextModePicture: TPicture als private deklariert und im Create/Destroy erzeugt/gelöscht
      GetOlePicture(FCursorTextModePicture, lPictureDisp);

      // Und als selbiges Speichern
      FCursorTextMode := lPictureDisp as IPicture;
    finally
      bmpColor.Free;
      bmpMask.Free;
    end;