2014-01-28 3 views
0

У меня есть элемент управления, который имеет свойство Cursor типа System.Windows.Forms.Cursor. Вот пример того, что я пытаюсь сделать:Windows Forms Copy Cursor Reference

if (someCondition) 
{ 
    oldCursor = myControl.Cursor; 
    myControl.Cursor = Cursors.Hand; 
} 
else 
{ 
    myControl.Cursor = oldCursor; 
} 

Я вошел в код, используя контрольные точки, и я вижу, что логика верна. Однако, когда свойство управления Cursor возвращается к oldCursor, внешний вид курсора остается тем же (например, Cursors.Hand).

Я заметил метод CopyHandle() в классе Cursor, и мне интересно, нужно ли как-то использовать его в моей операции копирования.

Может ли кто-нибудь дать представление о том, как скопировать ссылку Cursor?

+0

Существует немыслимая причина, по которой это не будет работать из предоставленной информации, Winforms гарантирует, что курсор на экране будет обновлен, когда мышь в данный момент находится на этом элементе управления. Вы недостаточно объяснили, что еще происходит? Проверьте myControl.IsHandleCreated с помощью отладчика. –

ответ

0

Используя ссылку на чистом Cursor объект ДЕЙСТВИТЕЛЬНО фактически работают. Я, должно быть, делал что-то еще неправильно. Я переключился на свой оригинальный метод (с небольшим количеством рефакторинга), и теперь все работает плавно.

В любом случае, спасибо за помощь, ребята.

0

Cursor Вы пытаетесь захватить ресурс Win32 в памяти. Вам нужно его Handle как вы подозреваете:

private IntPtr _prevCursor; 

public MyClass() 
{ 
    myControl.Cursor = Cursor.Default; 
    _prevCursor = myControl.Cursor.Handle; 
} 

public SomeMethod() 
{ 
    if (someCondition) 
    { 
     _prevCursor = myControl.Cursor.Handle; 
     myControl.Cursor = Cursors.Hand; 
    } 
    else 
    { 
     myControl.Cursor = new Cursor(_prevCursor); 
    } 
} 
+0

Я реализовал это, но он работает только некоторое время. Я не могу понять, почему ... Я также попытался использовать метод CopyHandle() вместо того, чтобы просто использовать Handle, и это работает. Курсор - это правильное изображение, но оно слишком мало. Может быть, проблема в том, что мой первоначальный курсор - это настраиваемый курсор? –

+0

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

-1

Вам может понадобиться вызвать Application.DoEvents() после изменения курсора, чтобы получить его, чтобы отобразить Изменение

+0

' DoEvents() 'злой. И не поможет, кстати. См. [This] (http://stackoverflow.com/questions/11352301/how-to-use-doevents-without-being-evil), если вы мне не верите. – DonBoitnott