में कर्सर हॉटस्पॉट बदलें, मैं छवि संसाधन से रनटाइम पर एक कर्सर बना रहा हूं। नए कर्सर का हॉटस्पॉट हमेशा 16x16 (32x32 छवि) पर सेट होता है। क्या रनटाइम पर हॉटस्पॉट को बदलना संभव है या क्या मुझे .cur फाइलें बनाने की आवश्यकता होगी?WinForms/.NET
8
A
उत्तर
22
आप निश्चित रूप से कर सकते हैं। यहाँ मेरी उपयोगिता काम करता है, संपादित करें आप मनचाहे ढंग से :)
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
this post on MSDN पर एक नजर डालें कर रहे हैं। ऐसा लगता है कि कुछ संभावित समाधान (पी/Invoke का उपयोग कर) है जो आपको कॉपी-पेस्ट और उपयोग करने में सक्षम होना चाहिए।
0
चूंकि यह एक .NET प्रश्न है और विशेष रूप से एक सी # प्रश्न नहीं है, यहां निक के कोड (दूसरों को परेशानी बचाने के लिए) का एक वीबीएनईटी रूपांतरण है।
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
खूबसूरती से काम किया। – smack0007
ओह, मैन, मैंने कुछ फलहीन घंटे बिताए हैं। आईसीओ फ़ाइल में एक रंगीन .cur बनाने की कोशिश कर रहा है। उचित हॉटस्पॉट के साथ - अब मैं केवल शुरुआती पीएनजी का उपयोग कर सकता हूं। जान में जान आई। – Usurer