2009-02-15 37 views

回答

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 2009-02-15 21:34:29

0

this post on MSDN看看。似乎有一些可能的解決方案(使用P/Invoke),您應該可以複製粘貼和使用。

0

由於這是一個.NET的問題,而不是具體一個C#的問題,這裏是尼克的代碼部分VB.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