WPF: рисование собственного курсора - нетривиальная задача - PullRequest
1 голос
/ 08 июля 2010

Мне нужно реализовать курсор с некоторыми очень специфическими особенностями:

  • он должен быть анимирован
    • , потому что через n секунд он автоматически щелкает - поэтому анимация является обратной связью дляпользователь, когда произойдет щелчок
  • , он должен привязаться к некоторым нашим элементам управления
  • он должен работать вне нашего приложения

до сих пор подходы:

  • рендеринг моего WPF-элемента управления в растровое изображение, создание структуры курсора из него и использование user32.dll / SetSystemCursor для его установки
    • PRO
    • курсор не имеет задержки после мыши, так как он является реальным курсором
    • CON
    • привязка довольно трудна, тем более что мыиметь абсолютные и относительные устройства ввода, и мне придется все время сбрасывать положение мыши или использовать user32.dll / ClipCursor (System.Windows.Forms.Cursor.Clip делает то же самое), но привязанный курсор всегда трясется вокруг привязанной позиции (пытаетсяубежать, получить перезагрузкуain ....)
    • код, который я использую, выдает странные исключения через некоторое случайное время, поэтому мой текущий код выглядит довольно нестабильным
  • рендеринг моего собственного курсора в максимизированном видесамый верхний, allowtransparent, windowstyle = none, невидимое окно и вручную переместите курсор после мыши (например, Canvas.SetLeft (cursor, MousePosition.X))
    • PRO
    • привязка может быть (легко) сделана
    • CON
    • , когда мышь щелкает и нажимает на курсор, курсор нажимается, а не окно за
    • мне не очень красиво опрашивать расположение мыши в фоновом цикле диспетчера

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

кто-нибудь знает кого-нибудь?

РЕДАКТИРОВАТЬ: какой-то примеристочник, чтобы показать проблемы ...:

example app & source, чтобы показать проблему с привязкой мыши к фиксированному положению: ClipIt.rar

пример приложения и источника, который выходит из строя по истечении случайного времени - установка самостоятельно нарисованного курсора: TryOwnCur.rar

можно найти под: http://sourcemonk.com/Cursor

1 Ответ

0 голосов
/ 08 июля 2010

благодаря http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a3cb7db6-5014-430f-a5c2-c9746b077d4f

я могу щелкнуть через свой нарисованный мной курсор, который следует за позицией мыши, установив стиль окна: нет, и allowtransparent, как я уже сделал, а затем

public const int WS_EX_TRANSPARENT = 0x00000020;
  public const int GWL_EXSTYLE = (-20);

  [DllImport("user32.dll")]
  public static extern int GetWindowLong(IntPtr hwnd,
  int index);

  [DllImport("user32.dll")]
  public static extern int SetWindowLong(IntPtr hwnd,
  int index, int newStyle);

  public static void makeTransparent(IntPtr hwnd) {
     int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
     SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
  }

и вызов makeTransparent из OnSourceInitialized ...

...