Bitmapa jako kursor

0

Ostatnio znalazłem taki kod programu który przerabiał mi bitmapę na kursor

interface

const
   crMyCursor = 1;
var
   iconInfo : TIconInfo;

implementation

procedure TForm1.Button1Click(Sender: TObject) ;
var
   bmpMask : TBitmap;
   bmpColor : TBitmap;
begin
   bmpMask := TBitmap.Create;
   bmpColor := TBitmap.Create;

   bmpMask.LoadFromFile('CircleMask.bmp') ;
   bmpColor.LoadFromFile('Circle.bmp') ;

   with iconInfo do
   begin
     fIcon := false;
     xHotspot := 15;
     yHotspot := 15;
     hbmMask := bmpMask.Handle;
     hbmColor := bmpColor.Handle;
   end;

   Screen.Cursors[crMyCursor] := CreateIconIndirect(iconInfo) ;

   Screen.Cursor := crMyCursor;

   bmpMask.Free;
   bmpColor.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject) ;
begin
   DestroyIcon(Screen.Cursors[crMyCursor]) ;
end;

Kod ten działa w obrębie formy, a czy da się go przerobić tak aby działał również poza nią na całym pulpicie i innych oknach??

0

Przenieś tworzenie przed Applicatrion.Run, zas usuwanie - po.

0

Coś chyba pokręciłem, albo co bo mi nie działa. Mam takie coś:

program Project1;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  Unit1 in 'Unit1.pas' {Form1};

const
   crMyCursor = 1;
var
   iconInfo : TIconInfo;
   bmpMask : TBitmap;
   bmpColor : TBitmap;

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  bmpMask := TBitmap.Create;
   bmpColor := TBitmap.Create;

   bmpMask.LoadFromFile('CircleMask.bmp') ;
   bmpColor.LoadFromFile('Circle.bmp') ;

   with iconInfo do
   begin
     fIcon := false;
     xHotspot := 15;
     yHotspot := 15;
     hbmMask := bmpMask.Handle;
     hbmColor := bmpColor.Handle;
   end;

   Screen.Cursors[crMyCursor] := CreateIconIndirect(iconInfo) ;
 
   Screen.Cursor := crMyCursor;
 
   bmpMask.Free;
   bmpColor.Free;
  Application.Run;
  DestroyIcon(Screen.Cursors[crMyCursor]) ;
end.
0

A jak przenieść "screen" z formy na desktop??

0

A co to w ogóle znaczy "przenieść Screen z Formy na Desktop"...?

0

chodzi mi o to, że jak daję screen.cursor to mi zmienia kursor tylko w obrębie formy i myślałem, że może da się ustawić jakoś screen aby cursor był na desktopie, a nie formie

0
toryk napisał(a)

myślałem, że może da się ustawić jakoś screen aby cursor był na desktopie, a nie formie

W dalszym ciągu nie mam pojęcia o czym piszesz; Chcesz zmienić kursor żeby był ustawiony nie tylko na Twojej formie ale także na pulpicie/innych oknach? Oczywiście, że się da, jednak jest to równoznaczne ze zmianą kursora w całym systemie;

toryk napisał(a)

może da się ustawić jakoś screen aby cursor był na desktopie, a nie formie

No to chcesz go ustawić w systemie, ale żeby nie był widoczny na Twojej formie? Pisz po ludzku, bo nic z tego nie można zrozumieć...

0
furious programming napisał(a):

Oczywiście, że się da, jednak jest to równoznaczne ze zmianą kursora w całym systemie;

Znalazłem coś takiego SetSystemCursor(LoadCursor(0, IDC_Help*),OCR_NORMAL); Po IDC_Help* prosi o wyrażenie pod które próbowałem wstawić ścieżkę do kursora *.cur, ale wyświetlił mi błąd - jak mam go tu zadeklarować??

0

eee... dobra, chyba wiem co źle było - dałem teraz SetSystemCursor(LoadCursor(0, 'C:\Windows\Cursors\aero_pen.cur'),OCR_NORMAL), ale mimo tego, że program się kompiluje nadal nie zmienia mi się kursor

0

Może najpierw sprawdź co zwraca funkcja SetSystemCursor - jeśli False to znaczy, że operacja zmiany kursora nie powiodła się; Poza tym zmieniasz jedynie kursor normalnej strzałki (Arrow) - reszta pozostaje bez zmian;

W sieci jest dość materiałów, z których można się także dowiedzieć, że przydatne moży być powiadomienie systemu o dokonanej zmianie przez dodanie poniższej linii:

SystemParametersInfo(SPI_SETCURSORS, 0, nil, 0);

I raczej też sprawdź co zwraca ta funkcja, bo nie wiadomo czy operacja się powiedzie; Dzięki funkcji SystemParametersInfo możesz dokonywać wielu zmian w zachowaniu systemu;

Poza tym jeśli chcesz by nowy kursor był używany do zakończenia działania Twojej aplikacji, a po jej zamknięciu miał powrócić stary - musisz podczas działania programu przechować uchwyt starego kursora, po czym przywrócić go przy zamukaniu programu; Oba uchwyty do kursorów starego i własnego na koniec zwolnij;

Obowiązkowe lektury: SetSystemCursor, SystemParametersInfo;

1 użytkowników online, w tym zalogowanych: 0, gości: 1