Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Eigene Cursor im Formular

Begonnen von Doming, Mai 26, 2025, 12:38:15

⏪ vorheriges - nächstes ⏩

Doming

Hallo,

ich habe eine Datenbank, welches beim Aufruf eines bestimmten Formulars eine Reihe von Berechnungen durchführt, um alle Daten zusammenzustellen. Mit DoCmd.Hourglass(True) vor dem Aufruf und DoCmd.Hourglass(False) beim Öffnen des Formulars bekomme ich zumindest die ,,Sanduhr". Als kleinen Gag dachte ich mir, da ein selbstkreiertes Zeiger.cur anzuzeigen. Ja, ich weiß, Luxusproblem...
Offenbar gestattet es Access offiziell nur, zwischen den 6 Default-Zeiger herumzuwechseln, allerdings habe ich hier folgenden Code gefunden:
Option Compare Database
Option Explicit

 
 ' Declarations for API Functions
Private Declare PtrSafe Function LoadCursorFromFile Lib "user32" _
Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Private Declare PtrSafe Function SetClassLong Lib "user32" _
Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function LoadCursor Lib "user32" _
Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
 
 ' Declare Windows API Constants for Windows System cursors
Const GCW_HCURSOR = (-12)
Const IDC_APPSTARTING As Long = 32650&
Const IDC_ARROW As Long = 32512&
Const IDC_HAND As Long = 32649
Const IDC_HELP As Long = 32651
Const IDC_IBEAM As Long = 32513&
Const IDC_ICON As Long = 32641&
Const IDC_WAIT As Long = 32514&
Const IDC_UPARROW As Long = 32516&
Const IDC_SIZEWE As Long = 32644&
Const IDC_SIZENWSE As Long = 32642&
Const IDC_SIZENS As Long = 32645&
Const IDC_SIZENESW As Long = 32643&
Const IDC_SIZEALL As Long = 32646&
Const IDC_SIZE As Long = 32640&
Const IDC_NO As Long = 32648&
 
 ' Declare handles for cursor
Private Const GCL_HCURSOR = (-12)
Private hOldCursor As Long
Private hNewCursor As Long
 
Private Sub Form_Load()
     'Load cursor
     'Comment out code not required:
     'Load system cursor
    hNewCursor = LoadCursor(ByVal 0&, IDC_HAND)
     'Load cursor from file
    hNewCursor = LoadCursorFromFile("c:\test\b1.ani")
     'Load animated cursor from file
 '   hNewCursor = LoadCursorFromFile(CurrentProject.Path & "\APPSTART.ani")
    hOldCursor = SetClassLong(Me.hwnd, GCL_HCURSOR, hNewCursor)
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
     'Unload cursor
    hOldCursor = SetClassLong(hwnd, GCL_HCURSOR, hOldCursor)
End Sub

Leider bewirkt der bei mir gar nichts. Liegt es an meiner Anpassung (PTRSafe)?

Gruß
 Doming
 

Bitsqueezer

#1
Hallo,

bei der Anpassung an 64Bit mußt Du immer darauf achten, was an Parametern ebenfalls umgewandelt werden muß.
Es gibt Parameter, die weiterhin "Long" bleiben, es gibt aber auch solche, die als "LongPtr" (64Bit) deklariert werden müssen, das betrifft i.d.R. alle Parameter, die mit kleinem "h" anfangen, weil es meistens "Handles" sind, also Adresspointer zu irgendwas, und die müssen in jedem Fall LongPtr sein. Es gibt aber eben auch solche, die keine Adressen darstellen, die müssen weiterhin "Long" sein.
Daher mußt Du Dir für jede API-Funktion die Deklaration unter 64Bit heraussuchen.
Das betrifft natürlich auch die Deklaration von Variablen in VBA, nicht nur die API-Parameter. Siehe Deine "Private"-Deklarationen.

Außerdem müßte natürlich Deine "ani"/"cur"-Datei auch verwendbar sein.

Hier habe ich einen Editor für die Cursor-Dateien gefunden, scheint wohl Freeware/Shareware zu sein:
http://www.rw-designer.com/cursor-maker

Gruß

Christian