Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Drag & Drop: DragCursor mit Bitmap statt Standard-Cursor (https://www.delphipraxis.net/130824-drag-drop-dragcursor-mit-bitmap-statt-standard-cursor.html)

Helmi 13. Mär 2009 19:54


Drag & Drop: DragCursor mit Bitmap statt Standard-Cursor
 
Hallo,

ich habeine ShellListView und einige Images.
Von der ShellListView ziehe ich mittels Drag & Drop Bitmaps auf die Images.

Während des Ziehens wird der DragCursor angezeigt.
Nun würd ich gerne, a la Windows Vista, das Bitmap als Cursor-Bild anzeigen lassen?

Wie könnt ich das realisieren?

Hawkeye219 13. Mär 2009 20:20

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Hallo Helmi,

hier ist etwas zum Lesen: klick

Gruß Hawkeye

quendolineDD 13. Mär 2009 20:25

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Vielleicht nicht ganz seine Frage.
Delphi-Quellcode:
var
  hCurs : THandle;
  bmp : TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile(PICTURE_FILE_NAME);
  hCurs := LoadImage(0, //Handle to Application - NULL when using stand-alone
                     PChar(PICTURE_FILE_NAME), //0-terminated String
                     IMAGE_BITMAP, //type
                     bmp.Width, //size of bmp
                     bmp.Height, //size of bmp
                     LR_LOADFROMFILE); //flag
  SetCursor(hCurs);
  bmp.Free;
end;
Dabei solltest du das Icon dessen welches du gerade Drag&Drops't als bmp zwischenspeichern - im Arbeitsspeicher oder kurz als Datei obwohl 1.-eres besser ist.
Schau dir dazu noch folgende Funktion aus der MSDN an. Da gibts auch andere Parameter, falls du es als Icon speicherst.

Code ist nicht getestet!

Helmi 13. Mär 2009 21:41

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Danke für den Code.

Nur wie verarbeite ich den jetzt am Besten, damit ich als Cursor das Bitmap seh?

Ein OnStartDrag gibts ja leider nicht, wo ich den Cursor definieren und laden könnte.

quendolineDD 13. Mär 2009 23:12

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Sicher, die muss es geben. Sind ja schließlich von TControl.
OnStartDrag und OnDragDrop sind bei mir in D7 vorhanden.

Hab noch schnell eine bessere Variante geschrieben:
Delphi-Quellcode:
type
  PSHFILEINFO = ^SHFILEINFO;
  SHFILEINFO = record
    hIcon : HICON;
    iIcon : Integer;
    dwAttributes : DWORD;
    szDisplayName : array[0..255] of PChar;
    szTypeName : array[0..79] of PChar;
  end;

const
  SHGFI_ICON = $100;
  SHGFI_SMALLICON = $1;

function SHGetFileInfo(pszPath : PChar; dwFileAttributes : DWORD; psfi : PSHFILEINFO; cbFileInfo : DWORD; uFlags : DWORD) : PDWORD; external 'shell32.dll' name 'SHGetFileInfo';

procedure TForm1.ShellTreeView1StartDrag(Sender: TObject;
  var DragObject: TDragObject);
var
  lpPath : PChar;
  sfi    : SHFILEINFO;
begin
  lpPath := PChar((Sender as TShellTreeView).Path);
  SHGetFileInfo(lpPath,
                0,
                @sfi,
                SizeOf(SHFILEINFO),
                SHGFI_ICON or SHGFI_SMALLICON);
  SetCursor(sfi.hIcon);
  DestroyIcon(sfi.hIcon);
end;
Sag mir bitte ob die bei dir geht :)

Helmi 14. Mär 2009 17:23

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Hallo,

ich hab jetzt den Code wie folgt eingebaut:

Delphi-Quellcode:
procedure TSymboleForm.ShellListView_TastenbilderStartDrag(Sender: TObject;
  var DragObject: TDragObject);
var
  Zeile : Integer;
  lpPath: PChar;
  sfi  : SHFILEINFO;

begin
  Zeile  := ShellListView_Tastenbilder.Selected.Index;

  lpPath := PChar(ShellListView_Tastenbilder.Folders[Zeile].PathName);

  SHGetFileInfo(lpPath, 0, sfi, SizeOf(SHFILEINFO), SHGFI_ICON or SHGFI_SMALLICON);
  SetCursor(sfi.hIcon);
  DestroyIcon(sfi.hIcon);
end;
Nur leider seh ich das Bild nicht als Cursor. Dafür seh ich nur einen Halteverbot-Cursor

quendolineDD 14. Mär 2009 17:43

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Aber eine AV bekommst du nicht?
sfi muss außerdem als Pointer übergeben werden, das da dein Compiler nicht meckert?
Kann gerade nicht schauen, hab hier auf der Maschine kein Delphi installiert ...

Helmi 14. Mär 2009 17:52

Re: Drag & Drop: DragCursor mit Bitmap statt Standard-Cu
 
Zitat:

Zitat von quendolineDD
Aber eine AV bekommst du nicht?
sfi muss außerdem als Pointer übergeben werden, das da dein Compiler nicht meckert?
Kann gerade nicht schauen, hab hier auf der Maschine kein Delphi installiert ...

Er meckert wenn sfi als Pointer übergeben wird...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 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