Tworzę kursor w środowisku wykonawczym z zasobu obrazu. HotSpot nowego kursora jest zawsze ustawiony na 16x16 (obraz 32x32). Czy można zmienić HotSpot w czasie wykonywania lub czy będę musiał utworzyć pliki .cur?Zmień kursor HotSpot w WinForm/.NET
8
A
Odpowiedz
22
Na pewno można. Oto moje funkcje narzędziowe, edytuj według własnego uznania :)
public struct IconInfo
{
public bool fIcon;
public int xHotspot;
public int yHotspot;
public IntPtr hbmMask;
public IntPtr hbmColor;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
[DllImport("user32.dll")]
public static extern IntPtr CreateIconIndirect(ref IconInfo icon);
/// <summary>
/// Create a cursor from a bitmap without resizing and with the specified
/// hot spot
/// </summary>
public static Cursor CreateCursorNoResize(Bitmap bmp, int xHotSpot, int yHotSpot)
{
IntPtr ptr = bmp.GetHicon();
IconInfo tmp = new IconInfo();
GetIconInfo(ptr, ref tmp);
tmp.xHotspot = xHotSpot;
tmp.yHotspot = yHotSpot;
tmp.fIcon = false;
ptr = CreateIconIndirect(ref tmp);
return new Cursor(ptr);
}
/// <summary>
/// Create a 32x32 cursor from a bitmap, with the hot spot in the middle
/// </summary>
public static Cursor CreateCursor(Bitmap bmp)
{
int xHotSpot = 16;
int yHotSpot = 16;
IntPtr ptr = ((Bitmap)ResizeImage(bmp, 32, 32)).GetHicon();
IconInfo tmp = new IconInfo();
GetIconInfo(ptr, ref tmp);
tmp.xHotspot = xHotSpot;
tmp.yHotspot = yHotSpot;
tmp.fIcon = false;
ptr = CreateIconIndirect(ref tmp);
return new Cursor(ptr);
}
0
Zobacz this post on MSDN. Wydaje się, że istnieje kilka możliwych rozwiązań (za pomocą P/Invoke), które powinieneś móc kopiować i wklejać.
0
Ponieważ jest to pytanie .NET, a nie konkretnie pytanie C#, tutaj jest konwersja VB.NET części kodu Nicka (aby uratować innym kłopot).
Module IconUtility
Structure IconInfo
Public fIcon As Boolean
Public xHotspot As Integer
Public yHotspot As Integer
Public hbmMask As IntPtr
Public hbmColor As IntPtr
End Structure
Private Declare Function GetIconInfo Lib "user32.dll" (hIcon As IntPtr, ByRef pIconInfo As IconInfo) As Boolean
Private Declare Function CreateIconIndirect Lib "user32.dll" (ByRef icon As IconInfo) As IntPtr
' Create a cursor from a bitmap without resizing and with the specified hot spot
Public Function CreateCursorNoResize(bmp As System.Drawing.Bitmap, xHotSpot As Integer, yHotSpot As Integer) As Cursor
Dim ptr As IntPtr = bmp.GetHicon
Dim tmp As IconInfo = New IconInfo()
GetIconInfo(ptr, tmp)
tmp.xHotspot = xHotSpot
tmp.yHotspot = yHotSpot
tmp.fIcon = False
ptr = CreateIconIndirect(tmp)
Return New Cursor(ptr)
End Function
End Module
Powiązane problemy
- 1. Zmień HTML wprowadzania tekstu kursor symbol "bloku"
- 2. Zmień kursor tekstowy/daszka w Visual Studio 2010
- 3. Multipleksowany hotspot w Androidzie
- 4. Hotspot w pętli for
- 5. Android 2.3 wifi hotspot API
- 6. Android: Programowo Włącz hotspot WiFi
- 7. Różnica między JVM i HotSpot?
- 8. Domyślny kursor w WPF?
- 9. Ustaw kursor w Highcharts
- 10. Niestandardowy kursor w WPF?
- 11. Kursor pętli w Oracle
- 12. Python pyodbc kursor vs kursor bazy danych
- 13. Zmień cytaty w cudzysłowach w Vim
- 14. Kursor Android w językach RTL
- 15. Jak zamknąć kursor w MongoKit
- 16. Android kursor tekstowy w EditText
- 17. Wydajność IcedTea 6 vs Sun's HotSpot 6
- 18. THREE.js SphereGeometry Panorama hotspot za pomocą DOMElements
- 19. Android Wi-Fi AP hotspot - bez internetu
- 20. Jak radzić sobie z org.apache.tomcat.util.threads.TaskQueue.take() hotspot?
- 21. Obsługa multiemisji w systemie Android w trybie Hotspot/Tethering
- 22. druk Java hotspot JIT kod montaż
- 23. usunąć kursor z EditText
- 24. JavaScript Hover kursor Pointer
- 25. Warunkowo zdefiniuj kursor
- 26. Jak pozwolić maszynie wirtualnej HotSpot być w trybie debugowania?
- 27. Idiom zamykający kursor
- 28. jquery: usunąć kursor wskaźnika?
- 29. css kursor url pozycjonowanie
- 30. Zmień nazwę w Xcode
Pięknie wykonana. – smack0007
Och, stary, spędziłem kilka bezowocnych godzin zmieniając bity w pliku .ico, próbując zrobić kolorowy .cur z właściwym hotspotem - teraz mogę po prostu użyć początkowych pngs. Co za ulga. – Usurer