■ 비트맵으로 커서 만들기 예제

----------------------------------------------------------------------------------------------------

using System.Drawing;

using System.Windows.Forms;

 

...

 

private CheckBox checkBox;

 

...

 

Bitmap bitmap = CursorHelper.GetBitmap(this.checkBox);

 

Cursor cursor = CursorHelper.GetCursor(bitmap, 0, 0);

----------------------------------------------------------------------------------------------------

 

■ 비트맵으로 커서 만들기

----------------------------------------------------------------------------------------------------

using System;

using System.Runtime.InteropServices;

using System.Drawing;

using System.Windows.Forms;

 

/// <summary>

/// 커서 헬퍼

/// </summary>

public class CursorHelper

{

    //////////////////////////////////////////////////////////////////////////////////////////////////// Structure

    ////////////////////////////////////////////////////////////////////////////////////////// Private

 

    #region 아이콘 정보 - IconInfo

 

    /// <summary>

    /// 아이콘 정보

    /// </summary>

    private struct IconInfo

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region Field

 

        /// <summary>

        /// 아이콘 여부

        /// </summary>

        public bool IsIcon;

 

        /// <summary>

        /// 핫스팟 X

        /// </summary>

        public int HotSpotX;

 

        /// <summary>

        /// 핫스팟 Y

        /// </summary>

        public int HotSpotY;

 

        /// <summary>

        /// 마스크 비트맵 핸들

        /// </summary>

        public IntPtr MaskBitmapHandle;

 

        /// <summary>

        /// 색상 비트맵 핸들

        /// </summary>

        public IntPtr ColorBitmapHandle;

 

        #endregion

    }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Import

    ////////////////////////////////////////////////////////////////////////////////////////// Static

    //////////////////////////////////////////////////////////////////////////////// Public

 

    #region 아이콘 간접 생성하기 - CreateIconIndirect(iconInfo)

 

    /// <summary>

    /// 아이콘 간접 생성하기

    /// </summary>

    /// <param name="iconInfo">아이콘 정보</param>

    /// <returns>아이콘 핸들</returns>

    [DllImport("user32.dll")]

    private static extern IntPtr CreateIconIndirect(ref IconInfo iconInfo);

 

    #endregion

    #region 아이콘 정보 구하기 - GetIconInfo(iconHandle, iconInfo)

 

    /// <summary>

    /// 아이콘 정보 구하기

    /// </summary>

    /// <param name="iconHandle">아이콘 핸들</param>

    /// <param name="iconInfo">아이콘 정보</param>

    /// <returns>처리 결과</returns>

    [DllImport("user32.dll")]

    [return: MarshalAs(UnmanagedType.Bool)]

    private static extern bool GetIconInfo(IntPtr iconHandle, ref IconInfo iconInfo);

 

    #endregion

    #region 객체 삭제하기 - DeleteObject(handle)

 

    /// <summary>

    /// 객체 삭제하기

    /// </summary>

    /// <param name="handle">핸들</param>

    /// <returns>처리 결과</returns>

    [DllImport("gdi32.dll")]

    private static extern bool DeleteObject(IntPtr handle);

 

    #endregion

    #region 아이콘 제거하기 - DestroyIcon(iconHandle)

 

    /// <summary>

    /// 아이콘 제거하기

    /// </summary>

    /// <param name="iconHandle">아이콘 핸들</param>

    /// <returns>처리 결과</returns>

    [DllImport("user32.dll", CharSet = CharSet.Auto)]

    private static extern bool DestroyIcon(IntPtr iconHandle);

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method

    ////////////////////////////////////////////////////////////////////////////////////////// Static

    //////////////////////////////////////////////////////////////////////////////// Public

 

    #region 커서 구하기 - GetCursor(bitmap, hotSpotX, hotSpotY)

 

    /// <summary>

    /// 커서 구하기

    /// </summary>

    /// <param name="bitmap">비트맵</param>

    /// <param name="hotSpotX">핫스팟 X</param>

    /// <param name="hotSpotY">핫스팟 Y</param>

    /// <returns>커서</returns>

    public static Cursor GetCursor(Bitmap bitmap, int hotSpotX, int hotSpotY)

    {

        IntPtr   cursorHandle;

        IntPtr   iconHandle = bitmap.GetHicon();

        IconInfo iconInfo   = new IconInfo();

        

        GetIconInfo(iconHandle, ref iconInfo);

        

        iconInfo.HotSpotX = hotSpotX;

        iconInfo.HotSpotY = hotSpotY;

        iconInfo.IsIcon   = false;

        

        cursorHandle = CreateIconIndirect(ref iconInfo);

        

        if(iconInfo.ColorBitmapHandle != IntPtr.Zero)

        {

            DeleteObject(iconInfo.ColorBitmapHandle);

        }

        

        if(iconInfo.MaskBitmapHandle != IntPtr.Zero)

        {

            DeleteObject(iconInfo.MaskBitmapHandle);

        }

        

        if(iconHandle != IntPtr.Zero)

        {

            DestroyIcon(iconHandle);

        }

        

        return new Cursor(cursorHandle);

    }

 

    #endregion

    #region 비트맵 구하기 - GetBitmap(control)

 

    /// <summary>

    /// 비트맵 구하기

    /// </summary>

    /// <param name="control">컨트롤</param>

    /// <returns>비트맵</returns>

    public static Bitmap GetBitmap(Control control)

    {

        Bitmap bitmap = new Bitmap(control.Width, control.Height);

    

        control.DrawToBitmap(bitmap, new Rectangle(0, 0, control.Width, control.Height));

    

        return bitmap;

    }

 

    #endregion

}

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요