![]() |
Cursor aus BITMAP-Ressourcenname laden
Morgen.
Ich habe eine BITMAP Ressource, die über den Ressourcennamen angesprochen wird. Wie kriege ich die jetzt als Mauscursor? LoadCursor geht schonmal nicht. |
Re: Cursor aus BITMAP-Ressourcenname laden
du kommst nicht drumherum die Bitmap in einen richtigen Cursor zu wandeln. Eine Bitmap ist nur ein Bild, ein Cursor hingegen besitzt noch eigenschaften für die Mausposition etc.
|
Re: Cursor aus BITMAP-Ressourcenname laden
Ich wäre dir durchaus dankbar, wenn du mir noch sagen würdest, wie ich das mache. ;)
EDIT: Zur Laufzeit meine ich. |
Re: Cursor aus BITMAP-Ressourcenname laden
Moin Manuel,
warum speicherst Du das nicht gleich als Cursor? |
Re: Cursor aus BITMAP-Ressourcenname laden
Weil die Quelle als Bitmap vorliegt. Ich verwende das Bitmap als Glyph für einen SpeedButton. Und wenn man draufklickt, soll das Glyph als Cursor angezeigt werden.
|
Re: Cursor aus BITMAP-Ressourcenname laden
|
Re: Cursor aus BITMAP-Ressourcenname laden
Habs mit CreateIconIndirect probiert. Aber das erzeugt komischerweise kein gültiges Icon. Ich kanns nicht per icon.handle:=Screen.Cursors[$0101]; laden und per icon.SaveToFile(); abspeichern. Gibt eine Exception "Ungültiges Icon" Aber dieser Cursor ist eindeutig gesetzt und hat auch ein Handle.
|
Re: Cursor aus BITMAP-Ressourcenname laden
Zitat:
Delphi-Quellcode:
Aller dings ist die Resource kein Bitmap sondern ein Cursor....
procedure TfrmInfo.FormCreate(Sender: TObject);
var Cur: HCursor; begin Cur := LoadImage(hInstance, MAKEINTRESOURCE(1), IMAGE_CURSOR, 0, 0, 0); Screen.Cursors[1] := Cur; DeleteObject(Cur); Cursor := 1; Button1.Cursor := Cursor; StaticText1.Cursor := Cursor; //... end; oder soll es dyn. erstellt werden ? |
Re: Cursor aus BITMAP-Ressourcenname laden
Es soll dynamisch erstellt werden. Aus einem Bitmap.
|
Re: Cursor aus BITMAP-Ressourcenname laden
Dann so:
Delphi-Quellcode:
// ...
implementation const crMyCursor = 1; var IconInfo : TIconInfo; procedure TForm1.Button1Click(Sender: TObject) ; var bmpMask : TBitmap; bmpColor : TBitmap; begin bmpMask := TBitmap.Create; bmpColor := TBitmap.Create; //ein Bitmap auf die einfache Art erstellen ;-) bmpColor.LoadFromFile('..\TestMapCur.bmp'); bmpMask.LoadFromFile('..\TestMaskCur.bmp'); IconInfo.fIcon := False; // kein Icon sondern Cursor IconInfo.xHotspot := 5; IconInfo.yHotspot := 5; IconInfo.hbmMask := bmpMask.Handle; IconInfo.hbmColor := bmpColor.Handle; Screen.Cursors[crMyCursor] := CreateIconIndirect(iconInfo) ; Screen.Cursor := crMyCursor; Button1.Cursor := 1; bmpMask.Free; bmpColor.Free; end; |
Re: Cursor aus BITMAP-Ressourcenname laden
Was mache ich, wenn ich keine Maske brauche? Muss ich dann einfach das Ding nicht laden oder wie?
|
Re: Cursor aus BITMAP-Ressourcenname laden
Also ich kann den Cursor prima in eine Datei speichern, aber ihn mit Screen.Cursor:=id; oder SetCursor(Screen.Cursors[id]); zu setzen, klappt einfach nicht. Es bleibt weiterhin bei dem Default-Cursor.
|
Re: Cursor aus BITMAP-Ressourcenname laden
*push*
|
Re: Cursor aus BITMAP-Ressourcenname laden
Zitat:
Zitat:
Delphi-Quellcode:
implementation
{$R *.dfm} const crMyCursor = 1; var IconInfo : TIconInfo; procedure TForm1.Button1Click(Sender: TObject) ; var bmpMask, bmpColor : TBitmap; i: Integer; begin bmpMask := TBitmap.Create; bmpColor := TBitmap.Create; With bmpColor do begin Width := 31; Height := 31; Canvas.Brush.Color := clWhite; Canvas.Pen.Color := clRed; Canvas.Ellipse(0,0,Width,Height); end; With bmpMask do begin Width := 31; Height := 31; Canvas.Brush.Color := clBlack; Canvas.FillRect(RECT(0,0,Width,Height)); end; // oder per Datei (oder auch aus der Resource) laden // bmpColor.LoadFromFile('..\TestMapCur.bmp'); // bmpMask.LoadFromFile('..\TestMaskCur.bmp'); // Icon erstellen With IconInfo do begin fIcon := False; // kein Icon sondern Cursor xHotspot := 16; yHotspot := 16; hbmMask := bmpMask.Handle; hbmColor := bmpColor.Handle; end; // Cursor in Cursorliste speichern Screen.Cursors[crMyCursor] := CreateIconIndirect(iconInfo) ; // Bitmaps freigeben bmpMask.Free; bmpColor.Free; // Cursor allen Elementen auf der Form zuweisen Screen.Cursor := crMyCursor; for i := 0 to Form1.ControlCount -1 do Form1.Controls[i].Cursor := crMyCursor; end; end. |
Re: Cursor aus BITMAP-Ressourcenname laden
Guten Tag,
vorerst: Tut mir ja leid, dass ich den alten Thread auskrame, aber ich ich komm einfach nicht drauf woran das Problem hier liegt. also: Den Cursor zu laden und anzuzeigen funktioniert schonmal nach dem obigen prinzip. Jetzt wollte ich aber alle Pixel, die auf die Farbe 'clFuchsia' gestellt sind transparent haben. Zuerst so getestet: (siehe Post #14)
Delphi-Quellcode:
Funktioniert einwandfrei. (Alle 'clWhite'-Pixel werden transparent dargestellt werden)
begin
With bmpColor do begin Width := 31; Height := 31; Canvas.Brush.Color := clWhite; Canvas.Pen.Color := clRed; Canvas.Ellipse(0,0,Width,Height); end; With bmpMask do begin Width := 31; Height := 31; Canvas.Brush.Color := clBlack; Canvas.FillRect(RECT(0,0,Width,Height)); end; end; Jetzt habe ich mir den Code ein wenig umgeformt und alle 'clFuchsia'-Pixel in 'clWhite' umgewandelt:
Delphi-Quellcode:
So anstatt die Weißen Stellen jetzt transparent anzuzeigen, werden diese jetzt ganz plötzlich umgekehrt transparent dargestellt. (zB: Schwarz <-> Weiß) :gruebel:
begin
bmpColor.LoadFromFile(FileName); for i := 0 to bmpColor.Width - 1 do for j := 0 to bmpColor.Height - 1 do case bmpColor.Canvas.Pixels[i,j] of clWhite: bmpColor.Canvas.Pixels[i,j] := clWhite-1; //Damit nicht ungewollte Stellen transparent werden clFuchsia: bmpColor.Canvas.Pixels[i,j] := clWhite; //Soll transparent werden end; With bmpMask do begin Width := bmpColor.Width; Height := bmpColor.Height; Canvas.Brush.Color := clBlack; Canvas.FillRect(RECT(0,0,Width,Height)); end; end; Ich kenne mich noch nicht wirklich mit Masken aus und habe auch kein passendes Tutorial gefunden. :duck: Kann mir bitte einer helfen das hinzubekommen? (zumindestens kurz erklären warum das so ist?) Dankeschön schonmal im Vorraus. Edit: hmm, ok anscheinend gibt es irgendwelche Farbkombinationen, von denen ich nichts weiß... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz