첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

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

using System.Drawing;
using System.Windows.Forms;

...

private CheckBox checkBox;

...

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

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

 

728x90

 

▶ 비트맵으로 커서 만들기

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
}
728x90
그리드형(광고전용)
Posted by icodebroker
,