Как сохранить текущий используемый курсор в поток (ресурс или файл)? - PullRequest
3 голосов
/ 04 августа 2011

Кто-нибудь знает, как сохранить курсор (в настоящее время используемый моим приложением, даже если он пользовательский или анимированный) в поток или файл, чтобы я мог отправить его по сети на другой компьютер, где загружается мое приложение и использовать это? Просто я хочу клонировать курсор с удаленного компьютера.

Как я обнаружил в этой статье , большинство функций значков можно использовать и для курсоров, но я не могу найти простой пример для перевода. Вот один пример использования COM, но я не уверен, что интерфейс IPicture можно использовать и для курсоров. Здесь , например, это обсуждение сохранения изображения в файл * .cur, но я не могу найти ничего подходящего для сохранения и загрузки курсоров в поток, ресурс или что-то, что я смогу отправить по сети и загрузить на целевой компьютер.

P.S. функции SaveCursorToFile нет, как вы могли бы ожидать .

Спасибо за любые предложения

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

Я думаю, что DrawIconEx может помочь в этом.С его помощью вы можете просто нарисовать все изображение курсора на определенном холсте.Также есть возможность нарисовать указанный кадр анимированного курсора, передав его индекс в параметр istepIfAniCur.В следующем примере показано, как сохранить текущий курсор в потоке (Button1Click), загрузить его обратно и отобразить (Button2Click).

Другой вопрос: как определить, является ли курсор анимированным .

var
  Stream: TMemoryStream;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Stream := TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Stream.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Picture: TPicture;
  CursorInfo: TCursorInfo;
begin
  Picture := TPicture.Create;

  CursorInfo.cbSize := SizeOf(CursorInfo);
  GetCursorInfo(CursorInfo);

  Picture.Bitmap.Transparent := True;
  Picture.Bitmap.Width := GetSystemMetrics(SM_CXCURSOR);
  Picture.Bitmap.Height := GetSystemMetrics(SM_CYCURSOR);

  DrawIconEx(
              Picture.Bitmap.Canvas.Handle, // handle to the target canvas
                                         0, // left coordinate
                                         0, // top coordinate
                        CursorInfo.hCursor, // handle to the current cursor
                                         0, // width, 0 for autosize
                                         0, // height, 0 for autosize
                                         0, // animated cursor frame index
                                         0, // flicker-free brush handle
                                  DI_NORMAL // flag for drawing image and mask
            );

  Picture.Bitmap.SaveToStream(Stream);
  Picture.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Picture: TPicture;
begin
  Stream.Position := 0;

  Picture := TPicture.Create;
  Picture.Bitmap.Transparent := True;
  Picture.Bitmap.Width := GetSystemMetrics(SM_CXCURSOR);
  Picture.Bitmap.Height := GetSystemMetrics(SM_CYCURSOR);
  Picture.Bitmap.LoadFromStream(Stream);

  SetBkMode(Canvas.Handle, TRANSPARENT);
  Canvas.FillRect(Rect(0, 0, 32, 32));
  Canvas.Draw(0, 0, Picture.Graphic);

  Picture.Free;
end;
2 голосов
/ 04 августа 2011

Посмотрите здесь: IconsToFile.pas .

Это также сохраняет (статические) курсоры. Может быть проверен с:

hIconToFile('C:\Temp\Demo.cur', GetCursor, BitC32);

Работает. Возможно, вам придется настроить скорость передачи данных, хотя. Я думаю, что у него будут проблемы с анимированными курсорами, но может быть достаточно, чтобы вы начали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...