현재 회사 진행 중인 프로젝트 중에 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); } }
'.Net > Winform' 카테고리의 다른 글
Convert Visual Basic for Applications Macro to C# 4.0 (0) | 2013.01.10 |
---|---|
C# 크로스쓰레드 문제 깔끔하게 해결하기 (1) | 2013.01.09 |
C# 사용자별 개별 저장소 제공하기 (0) | 2012.12.21 |
C# ListBox Height 변경하기 (1) | 2012.12.14 |
C# TabControl Tab Background 변경 (0) | 2012.12.11 |