2009-02-15 11 views
8

में कर्सर हॉटस्पॉट बदलें, मैं छवि संसाधन से रनटाइम पर एक कर्सर बना रहा हूं। नए कर्सर का हॉटस्पॉट हमेशा 16x16 (32x32 छवि) पर सेट होता है। क्या रनटाइम पर हॉटस्पॉट को बदलना संभव है या क्या मुझे .cur फाइलें बनाने की आवश्यकता होगी?WinForms/.NET

उत्तर

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); 
    } 
+1

खूबसूरती से काम किया। – smack0007

+0

ओह, मैन, मैंने कुछ फलहीन घंटे बिताए हैं। आईसीओ फ़ाइल में एक रंगीन .cur बनाने की कोशिश कर रहा है। उचित हॉटस्पॉट के साथ - अब मैं केवल शुरुआती पीएनजी का उपयोग कर सकता हूं। जान में जान आई। – Usurer

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