Mauszeiger wird falsch angezeigt
-
Hallo,
die Erstellung der HBITMAP in der Struktur ICONINFO ist etwas aufwändiger.
Und wie ich finde, ist es einfacher, sich einen (grösseren) farbigen Cursor gleich aus einer TBitmap zu erzeugen.Beispiel:
*.h
private: Graphics::TBitmap* bmp; Graphics::TBitmap* bmpMask; Graphics::TBitmap* bmpColor; void __fastcall CreateCursorFromBmp(HCURSOR &hCur, Graphics::TBitmap *bmp); HCURSOR hBigCursor; public: __fastcall TForm1(TComponent* Owner); __fastcall ~TForm1(void);
*.cpp
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { bmp = new Graphics::TBitmap; bmp->LoadFromFile("cursor2.bmp"); bmpMask = new Graphics::TBitmap; bmpColor = new Graphics::TBitmap; CreateCursorFromBmp(hBigCursor, bmp ); } //--------------------------------------------------------------------------- __fastcall TForm1::~TForm1(void) { delete bmp; delete bmpMask; delete bmpColor; DeleteObject(hBigCursor); } //--------------------------------------------------------------------------- void __fastcall TForm1::CreateCursorFromBmp(HCURSOR &hCur, Graphics::TBitmap *bmp) { int wi = bmp->Width; int hi = bmp->Height; bmpMask->Width = wi; bmpMask->Height = hi; bmpColor->Width = wi; bmpColor->Height = hi; bmpMask->PixelFormat = bmp->PixelFormat; bmpColor->PixelFormat = bmp->PixelFormat; TRect rect = Rect(0, 0, wi, hi); bmpMask->Canvas->CopyMode = cmNotSrcCopy; // alt cmMergePaint; bmpMask->Canvas->CopyRect(rect, bmp->Canvas, rect); bmpColor->Canvas->CopyMode = cmSrcInvert; bmpColor->Canvas->CopyRect(rect, bmp->Canvas, rect); // --- begin edit ---- bmpColor->Canvas->CopyMode = cmDstInvert; bmpColor->Canvas->CopyRect(rect, bmpColor->Canvas, rect); // --- end edit ---- ICONINFO iconinf; iconinf.fIcon = false; iconinf.xHotspot = 0; iconinf.yHotspot = 0; iconinf.hbmMask = bmpMask->Handle; iconinf.hbmColor = bmpColor->Handle; hCur = CreateIconIndirect(&iconinf); } //--------------------------------------------------------------------------- // Beispiel void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { ::SetCursor( hBigCursor ); }
Weisse Farben im Bitmap sind im Cursor transparent.
Vielleicht gibt dir das ne Anregung oder du machst es gleich somfg
kpeteredit: Code ergänzt/geändert
-
weiß bedeutet transparent und alles was nicht 255,255,255 entspricht, ist sichtbar? Oder ist das noch eine Abstufung dann, also grau = halbtransparent? Auf jeden Fall schonmal danke für den Code, werde ich mir heute nachmittag mal genauer anschauen.
greetz KN4CK3R
-
KN4CK3R schrieb:
weiß bedeutet transparent und alles was nicht 255,255,255 entspricht, ist sichtbar?
Ja, zumindest mit obiger Funktion.
Ansonsten einfach mal experimentieren. Eventuell bekommt jemand eine andere TransparentColor festgelegt
Das Ergebnis bitte hierher posten...mfg
kpeter
-
Microsoft macht das ganze ein wenig anders (sicher der Teil den Canvas übernimmt) und mit Alpha von 0-100
http://support.microsoft.com/kb/318876
Edit: gerade mal deine Funktion an meine Bedürfnisse angepasst und es funktioniert fast so wie es soll, danke. Problem ist jetzt noch, dass der eigentlich gelbe Rahmen nur über weißen Hintergrund gelb ist. Wenn ich mit der Maus über ein Bild gehe, dann wird das gelbe schwachblau?!
greetz KN4CK3R
-
So,
zugegeben hab ich auch nur auf weissem Untergrund getestet...
Nu sollte es aber gehen, habe die Funktion leicht ergänzt:
Zeile 39 anderer CopyMode.
Damit ist TransparentColor jetzt schwarz. Zu beachten beim anlegen der Bitmap.In Zeilen 47/48 invertiert sich das bmpColor nochmal.
mfg
kpeter
-
wunderbar, jetzt passts genau. Gibt es irgendwo zu den einzelnen CopyModes eine Beschreibung? In der Borland-Hilfe steht bei mir dazu nichts.
greetz KN4CK3R
-
Unter Graphics.TCopyMode (BCB2009) solltest du aber fündig werden...
ed/
Hier ist auch der Link zu embarcadero
-
BCB2006 gibts das scheinbar noch nicht, da steht nur das in der Hilfe:
Beschreibung
Mit der Eigenschaft CopyMode können Sie beeinflussen, wie Grafiken auf der Zeichenfläche gezeichnet werden. CopyMode wird verwendet, wenn ein Bild mit der Methode CopyRect von einer anderen Zeichenfläche kopiert wird. Auch TBitmap-Objekte bedienen sich dieser Eigenschaft, wenn sie sich selbst auf einer Zeichenfläche zeichnen.Mit CopyMode lassen sich beim Erzeugen eines Bildes eine Vielzahl von Effekten erzielen. Durch das Kombinieren von mehreren Bildern mit unterschiedlichen CopyModes können Sie Spezialeffekte erzielen, indem Sie beispielsweise Bilder mischen oder Teile eines Bitmaps transparent anzeigen.
Die Onlinehilfe scheint da aktueller zu sein.
greetz KN4CK3R
-
Nee,
diese Auflistung steht schon in der bcb3.hlp, BCB Version 3. Die ist vom 1998...
Mit der Online-Version hast du natürlich recht.edit: Hast du den Code aus deinem MS-Link getestet?
mfg
kpeter
-
ja getestet hab ich den, funktioniert auch, allerdings war ich zu unfähig den an mein Problem richtig anzupassen.
Auch hab ich ein wenig mit dem Transparenzwert herumgespielt, allerdings war mir das 9F nicht ganz schlüssig und ich kam auf keinen Wert der komplette Transparenz dargestellt hätte.Auf die Gefahr hin, dass ich gesteinigt werde. Meine BCB2006 Hilfe hat kein Thema zu TCopyMode. Unter Graphics wird kein TCopyMode aufgeführt und den Text von TBitmap->TCopyMode hab ich schon gepostet. Auch wenn ich nach cmNotSrcCopy suchen lasse, wird das Wort nicht gefunden.
greetz KN4CK3R
-
KN4CK3R schrieb:
ja getestet hab ich den, funktioniert auch...
Ist vielleicht mal was für einen neuen Thread.
mfg
kpeter