현재 회사 진행 중인 프로젝트 중에 Rectangle 영역의 색상을

반전 시키는 기능이 있습니다.

 

ControlPaint Class의 static 메서드인

FillReversibleRectangle을 사용하여 반전 효과를 얻었지만.........

 

아래와 같은 문제점이 있었습니다.

 

 

 

 

 

 

Form에 Draw되는게 아니라 화면에 Draw되는 문제점......T_T

Activated와 Deactive Event를 통해 해결하려 했지만

Focus가 없는 최상위 Form이 생기면.......GG........

 

그러는 도중 구글링 중에

WinAPI에 InvertRect 함수 발견....

 

시그니쳐는 다음과 같습니다.

BOOL WINAPI InvertRect( __in HDC hDC, __in CONST RECT *lprc);

 

 

C#에서 사용하기 위해

Rect 구조체를 마이그레이션 하고

StructLayout 특성의 매개변수 LayoutKind.Sequential는 메모리를 순서대로 잡아주죠

Left->Top->Right->Bottom 이렇게..

 

아래의 LayoutKind.Explicit를 인자로 넘겨주게되면

멤버의 메모리 위치를 명시적으로 표시해주어야합니다.

        /// <summary>
        /// Rectangle
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct Rect
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
        /// <summary>
        /// Rectangle
        /// </summary>
        [StructLayout(LayoutKind.Explicit)]
        public struct Rect
        {
            [FieldOffset(0)]
            public int Left;
            [FieldOffset(4)]
            public int Top;
            [FieldOffset(8)]
            public int Right;
            [FieldOffset(12)]
            public int Bottom;
        }



 

 

API 함수를 호출 하기 위해 메서드를 정의하였습니다.

        /// <summary>
        /// 해당 Rectangle영역의 색상을 반전
        /// </summary>
        /// <param name="hdc"></param>
        /// <param name="lpRect"></param>
        /// <returns></returns>
        [DllImport("user32")]
        public static extern bool InvertRect(IntPtr hdc, ref Rect lpRect);


 

 

아래와 같이 코드를 작성하여서

프로그램에 적용 완료하였습니다. 

        /// <summary>
        /// Highlight를 생성할때 발생합니다
        /// </summary>
        /// <param name="rect"></param>
        void DrawManager_HighlightEvent(Rectangle rect)
        {
            try
            {
                if (rect == Rectangle.Empty)
                    return;
                using (Graphics g = this.panel_drawPaper.CreateGraphics())
                {
                    Websolus.NativeFunction.NativeGDI.Rect r = new Websolus.NativeFunction.NativeGDI.Rect();
                    r.Left = rect.Left;
                    r.Right = rect.Right;
                    r.Bottom = rect.Bottom;
                    r.Top = rect.Top;
                    Websolus.NativeFunction.NativeGDI.InvertRect(g.GetHdc(), ref r);
                }
            }
            catch (Exception ex)
            {
                MessageManager.ShowDetailErrorMessge(ex);
            }
        }


 

 

 

 

+ Recent posts