AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi crHandPoint durch den Windows-Handcursor ersetzen!
Thema durchsuchen
Ansicht
Themen-Optionen

crHandPoint durch den Windows-Handcursor ersetzen!

Ein Thema von blackdrake · begonnen am 28. Aug 2008
Antwort Antwort
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

crHandPoint durch den Windows-Handcursor ersetzen!

  Alt 28. Aug 2008, 13:07
Hallo.

Viele Nutzer ärgern sich über nicht eingehaltene Design-Standards bei Windows Anwendungen. Es gibt bei Delphi viele Eigenentwicklungen in der VCL, die jedoch aufgründen der Kompatibilität und Unabhängig auch teilweise von Vorteil sind. Mich ärgert jedoch häufig der hässliche Hand-Mauszeiger crHandPoint von Borland (besonders wegen den Ärmeln). Dieser passt nicht in den Stil von Windows und lässt dem Benutzer keinen Freiraum für eigene Windows-Styles. Hat der Benutzer statt der weißen Hand einen völlig anderen Zeiger definiert, ist es sogar noch gravierender. Folgende Unit löst das Problem durch simples Einbinden.

Code der einzubindenen Unit

Delphi-Quellcode:
unit HandCursor;

{
* WINDOWS HAND CURSOR UNIT FOR DELPHI BY DANIEL MARSCHALL
* (C)Copyright 2008 - 2009 ViaThinkSoft [ [url]www.viathinksoft.de[/url] ]
*
* Requirements: Windows 95/NT and Delphi 3
* Revision: 2009-09-06
}


{$WARNINGS OFF}

{$IFNDEF VER80} // Delphi 1.0
{$IFNDEF VER90} // Delphi 2.0
{$IFNDEF VER93} // C++ Builder 1.0
{$IFNDEF VER100} // Delphi 3.0
{$IFNDEF VER110} // C++ Builder 3.0
{$DEFINE DELPHI_4_UP}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}

interface

implementation

uses
  Windows { HCURSOR, LoadCursor, IDC_HAND },
  Controls { crHandPoint },
  Forms { Screen };

// IDC_HAND is existing in Windows.pas since Delphi 4

{$IFNDEF DELPHI_4_UP}
const
  IDC_HAND = MakeIntResource(32649);
{$ENDIF}

var
  hCur: HCURSOR;

{$R Hand.res}

initialization
  hCur := LoadCursor(0, IDC_HAND);
  if hCur > 0 then
  begin
    Screen.Cursors[crHandPoint] := hCur;
  end
  else
  begin
    hCur := LoadCursor(HInstance, 'HAND');
    if hCur > 0 then
    begin
      Screen.Cursors[crHandPoint] := hCur;
    end;
  end;
end.
Ich hoffe, ich konnte für diese Angelegenheit eine nahezu perfekte Musterlösung erstellen.

Ich würde mich freuen, wenn mir noch jemand bestätigen könnte, ob es mit C++ Builder 2, 3, 4 oder Lazarus (welche Versionen?) auch funktioniert. Ich habe die Vermutung, dass es bei C++ Builder 2 keinen crHandPoint als Cursor gibt (so wie bei Delphi 2). Außerdem würde ich gerne bestätigt bekommen, dass IDC_HAND erst in C++ Builder 4 hinzugekommen ist (in C++ Builder 3 also nicht existiert).

Vielen Dank an omata für den Test in Delphi 4!

Kompatibilität

Windows: Getestet unter Windows 95 bis ME
Windows NT: Getestet unter Windows 2000 bis Vista (NT unbekannt)

Delphi: Getestet unter Delphi 3 .. 2009; Delphi 2 ist garantiert ausgeschlossen.
C++ Builder: Keine Tests vorliegen. Wahrscheinlich funktioniert es für C++ Builder 3 .. 2009.
Lazarus: Keine Tests vorliegen

Herleitung

Zunächst einmal würde folgender Code im OnCreate Ereignis alle crHandPoint mit dem Windows-Handzeiger ersetzen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.Cursors[crHandPoint] := LoadCursor(0, IDC_HAND);
end;
Dieser Code hat aber den großen Nachteil, dass er auf Windows 95 und NT nicht arbeitet, da es dort noch kein IDC_HAND gibt. Eine "Fallback"-Lösung, die automatisch auf einen anderen Cursor zurückgreift wäre hier angebracht.

Dieser Code überprüft zusätzlich, ob der Cursor IDC_HAND verfügbar ist. Bei Windows 95 und NT bleibt der Handzeiger von Borland erhalten (Fallback):

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  hCur: HCURSOR;
begin
  hCur := LoadCursor(0, IDC_HAND);
  if hCur > 0 then Screen.Cursors[crHandPoint] := hCur;
end;
Nun ein etwas erweiterter Code, der es auch erlaubt, unter Windows 95/NT beim Fehlschlag von IDC_HAND einen Windows-Handzeiger per Ressource einzubinden. Auch hier ist ein Fallback vorgesehen, wenn der Ressource etwas seltsames passiert sein sollte (z.B. Einbinden vergessen):

Delphi-Quellcode:
{$R Hand.res}

procedure TForm1.FormCreate(Sender: TObject);
var
  hCur: HCURSOR;
begin
  hCur := LoadCursor(0, IDC_HAND);
  if hCur > 0 then
  begin
    Screen.Cursors[crHandPoint] := hCur;
  end
  else
  begin
    hCur := LoadCursor(HInstance, 'HAND');
    if hCur > 0 then
    begin
      Screen.Cursors[crHandPoint] := hCur;
    end;
  end;
end;
Anmerkung: Die beigelegte Hand.res muss im Suchpfad des Compilers sein!

Jetzt muss das ganze nur noch in eine eigene Unit gepackt werden, die dann einfach nur noch eingebunden werden muss. Außerdem setze ich Compilerdirektiven, um die höchst mögliche Codecompatibilität zu erreichen.

Download der Unit und der Ressourcendatei:

http://www.viathinksoft.de/?page=pro...ownload&id=157

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz