![]() |
Handcursorgrafik
Hallo ihr lieben!
Ich bin heute auf ein Designproblem gestoßen. Und zwar sieht der crHandPoint-Cursor von Delphi einfach nur scheußlich aus und ändert sich auch nicht wie alle anderen nach dem Systemstandard ( ich hab gestylte cursors, also merk ich das auch immens). Wie kann ich das ändern? Muss ich da über eigene Cursorbilder ausweichen? Wenn ja, wich mach ich das? |
Re: Handcursorgrafik
|
Re: Handcursorgrafik
Kroko, danke für die schnelle antwort.
Aber die Antwort auf die erste Frage befriedigt mich iwie nicht so wirklich... Und einen eigenen Cursor zu benutzen muss doch wohl nicht sein, oder?? |
Re: Handcursorgrafik
im Oi siehst Du unter Cursor alle standardmäßigen "Delphi"&"Windoofs"-Cursor, alles andere musst Du selber einbringen!
|
Re: Handcursorgrafik
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe diese Lösung (es ist die, die Kroko erwähnt hat), vor Jahren in der DP entdeckt und meines Wissens hatte ich die cursor.res auch von hier. Ich hoffe, es ist erlaubt, diese anzuhängen.
Delphi-Quellcode:
// ...
{$R cursors.res} //Normale Hand als Cursor {$R *.dfm} // ...
Delphi-Quellcode:
Die Resourcendatei ist im Anhang. Falls es nicht erlaubt sein sollte, diese anzuhängen, sagt mir bitte bescheid. Ich bin mir aber ziemlich sicher, dass ich diese nicht selbst erzeugt, sondern - wie gesagt - aus der DP habe.
// OnCreate
//Handcursor einstellen (normale Hand) Screen.Cursors[crHandPoint] := LoadCursor(HInstance, 'HAND'); Ein schönes Wochenende wünscht Matze |
Re: Handcursorgrafik
Hach, danke Matze, es funkt ^^
|
Re: Handcursorgrafik
Hallo.
Entschuldigt bitte, dass ich das Thema wieder hochhole. Ich habe das selbe Problem, möchte jedoch den Hand-Cursor NICHT "hard-coden". Wenn sich der Benutzer entschließt, in der Systemsteuerung unter "Maus" -> "Zeiger" -> "Verknüpfungsauswahl" z.B. einen Hundehaufen als Hand-Zeiger einzustellen, dann ist es ja irgendwie unpassend, wenn die Standardhand in der Delphi-Applikation erscheint. Außerdem hat Vista ja z.B. auch bei etwas genauerem Hinschauen einen etwas anderen Handcursor. Ich habe schon lange gesucht, aber nie einen Codeteil gefunden, der es erlaubt, den richtigen Hand-Cursor von Windows zu beziehen. Dafür muss es doch eine API-Funktion geben, oder nicht? Und wenn es keine API-Funktion geben sollte, müsste man doch trotzdem über die Registry und den Dateipfad an den aktuell gültigen Handcursor kommen. In Visual Basic 6 musste man hierfür folgendes machen:
Code:
(Ich weiß hier aber nicht genau, ob das auch eine Art harte Kodierung ist)
Private Sub Link1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lHandle As Long lHandle = LoadCursor(0, HandCursor) If (lHandle > 0) Then SetCursor lHandle End Sub Gruß blackdrake |
Re: Handcursorgrafik
Damit wird der HandCursor des Systems geladen.
|
Re: Handcursorgrafik
Der VB-Code erzeugt also tatsächlich den aktuell ausgewählten Handcursor? Kann man diese Funktionalität dann in Delphi übertragen?
// Edit: Altes Visual Basic 6 Projekt ausgegraben und mit modifizierten Hand-Cursor getestet: Es funktioniert tatsächlich. Aber wie macht man das in Delphi? :glaskugel: |
Re: Handcursorgrafik
Ich habe jetzt schon so viel probiert, aber irgendwie funktioniert das nicht ganz...
Delphi-Quellcode:
IDC_ARROW scheint nach meinen Recherchen der echte Windows-Handzeiger zu sein. Aber der Code funktioniert nicht.
const
crWindowsHand = 30; // 0..22 belegt // [url]http://www.delphi-library.de/viewtopic.php?p=258[/url] procedure TForm1.Button1Click(Sender: TObject); begin Screen.Cursors[crWindowsHand] := LoadCursor(HInstance, 'IDC_ARROW'); form1.Cursor := crWindowsHand; end; Gruß blackdrake |
Re: Handcursorgrafik
Liste der Anhänge anzeigen (Anzahl: 1)
habe das hier gefunden:
// crHandPoint is slightly different from IDC_HAND // Derived from postings to borland.public.cppbuilder.winapi and // borland.public.delphi.winapi by CC Chong and MrBaseball34 on // 18-19 Dec 2000 // Comments from CC Chong: // "Yes IDC_HAND is the hidden resource of Windows. On Win98 and above (or since // ActiveDesktop Update in IE4, if I'm not mistaken) Windows has the IDC_HAND // cursor built in to the system." // "But it is not the same as Delphi's crHandPoint. Delphi doesn't use Windows' // IDC_HAND. crHandPoint is Delphi's own inclusion in it's Controls.res (found // in your Delphi\lib)." // // "Delphi copies crHandPoint into your exe during linking.: // // Below, crHandpoint has a black "wrist band" that is not present with IDC_HAND.
Delphi-Quellcode:
so funzt es prima unter WinXP SP3
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; const // Declare the cursor constant that contains the resource identifier // of the system Hand cursor. IDC_HAND = MakeIntResource(32649); // Declare the cursor constant for our own use. Constant value must // not conflict with any existing Delphi cursor constant. NIDC_HAND = 32649; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // oder on FormCreate Screen.Cursors[NIDC_HAND] := LoadCursor(0, IDC_HAND); Screen.Cursor := NIDC_HAND end; end. |
Re: Handcursorgrafik
Hallo.
Vielen Dank für den Code! Ich hatte meine Recherchen bereits über Tage partiell verteilt, aber nie etwas passendes gefunden. Hier der vereinfachte Code:
Delphi-Quellcode:
(Huch? TCursor kompatibel mit Integer Cardinal? :o )
const
crWindowsHand = 32649; IDC_HAND = MakeIntResource(crWindowsHand); procedure TForm1.FormCreate(Sender: TObject); begin Screen.Cursors[crWindowsHand] := LoadCursor(0, IDC_HAND); end; procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Cursor := crWindowsHand; end; Ich werde noch prüfen, wie das Verhalten bei Windows 95 sein wird (ich möchte keine Exceptions haben). Eventuell müsste ich prüfen, ob das LoadCursor fehlschlägt (wie?) und dann auf crHandPoint zurückspringen. Wenn ich ein Ergebnis habe, werde ich es hier und in der CodeLib posten. Gruß blackdrake |
Re: Handcursorgrafik
So müsste es nun eigentlich funktionieren. Ich teste es morgen auf meinem 95-Testpc
Delphi-Quellcode:
Mich ärgert, dass ich crWindowsHand nun als Variable machen musste. Andernfalls hätte ich nicht auf crHandPoint zurückspringen können (da Konstanten unveränderbar sind). Oder gibt es eine elegantere Lösung?
const
NIDC_HAND = 32649; IDC_HAND = MakeIntResource(NIDC_HAND); var crWindowsHand: TCursor; procedure TForm1.FormCreate(Sender: TObject); begin Screen.Cursors[NIDC_HAND] := LoadCursor(0, IDC_HAND); if Screen.Cursors[NIDC_HAND] = NULL then begin crWindowsHand := crHandPoint; end else begin crWindowsHand := NIDC_HAND; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Cursor := crWindowsHand; end; Gruß blackdrake |
Re: Handcursorgrafik
könnte man nicht einfach den crHandPoint überschreiben?
|
Re: Handcursorgrafik
crHandPoint ist eine Konstante. Eigentlich sollte mein crWindowsHand, das crHandPoint substituieren soll, auch eine Konstante sein, ansonsten kann ja jeder das Teil verändern und damit ungültig machen. :|
|
Re: Handcursorgrafik
Sowohl
Delphi-Quellcode:
als auch
if Screen.Cursors[NIDC_HAND] = NULL then
Delphi-Quellcode:
sind unter Windows 95 (kein IDC_HAND) unwahr. (Erwartet: wahr)
if Screen.Cursors[NIDC_HAND] = 0 then
Zumindestens kommt keine Exception o.ä., sondern der Zeiger bleibt normal. Ich würde eben gerne eine Fallback-Methode haben, die bei Nicht-Verfügbarkeit von IDC_HAND auf crHandPoint umspringt (möglichst ohne crWindowsHand als Variable zu haben, sofern das überhaupt möglich ist) Hat jemand eine Idee? (Anmerkung: In der Onlinehilfe steht, dass LoadCursor im Fehlerfall NULL ausgeben sollte... Irgendwie stimmt das aber hier nicht ganz. Gruß blackdrake // Edit: Ich habe eine Lösung gefunden (die sogar ganz banal ist). Und das mit dem crHandPoint überschreiben ging irgendwie tatsächlich, wenn auch die Konstante unverändert blieb :wink: Weiteres habe ich hier ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 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 by Thomas Breitkreuz