ASH84

Software Engineer/Developer, co-founder of Payhere. Ex-Banksalad. Intereseted in iteroperability, bootstrap company, writting.

[Microsoft Ink] InkOveray 위에서 커서모양 바꾸기

created:2010-01-20
updated:2015-07-03
edit
필자는 요즘 회사에서 Microsoft Ink 관련 Application을 유지보수 하고 있습니다. 생각보다 복잡한 구조로 되어 있더라구요. 그 와중에 발견한 팁이 하나 있어서 올립니다.
** 일반적인 Cursor 모양 변화 주기 **
일반적인 윈도우 어플리케이션에서 마우스 커서에 모양을 변화를 주기 위해서는 다음과 같은 코드를 사용합니다.
 this.Cursor = System.Windows.Forms.Cursors.Cross;
현재 커서를 Cross 모양의 커서로 바꾸라는 명령입니다. System.Windows.Forms.Cursors에는 우리가 흔히 보는 화상표, 모래시계 등의 커서 모양이 이미 정의되어 있어서 위의 코드 처럼 쓰면 됩니다.
**InkOverlay 상에서는요?**
Microsoft Ink 라이브러리를 조금 사용해 보신 분이라면 아시겠지만,  Ink Picture, InkCollec tor, InkOverlay 등을 화면 컨트롤과 연결시킨 후에 구동 시켜보면, 마우스 커서가 해당 Ink 영역 안에서는 원래 의도한 커서가 아닌 점(Point)의 형태로 나타나는 것을 볼수 있습니다
![](http://ash84.net/wp-content/uploads/1/cfile29.uf.1332D8284B5656CD6F5E0A.jpg)
잘 보이지가 않네요^^;
위의 코드를 어딘가에 입력해 보아도 전혀 마우스의 커서는 변화하지 않을것 입니다. 왜 이런 현상이 벌어지는 걸까요? **답은 MSDN에 있다!!**
MSDN 을 한번 봅시다. InkOverlay의 Cursor속성에 대한 MSDN의 설명은 다음과 같이 나와있습니다. ([http://msdn.microsoft.com/ko-kr/library/microsoft.ink.inkoverlay.cursor.aspx](http://msdn.microsoft.com/ko-kr/library/microsoft.ink.inkoverlay.cursor.aspx))
**![](http://ash84.net/wp-content/uploads/1/cfile23.uf.140F68244B5655B47EBAF8.jpg) MSDN 中에서.. ** 기본 커서인 상속된 [Default](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscursorsclassdefaulttopic.asp) 속성으로 설정하면 마우스 커서의 동작이 뷰에 있는 현재 커서의 그리기 특성을 따릅니다. 그런 다음 기본 커서 설정을 유지하면서 개체를 비활성화하면 커서 재정의가 비활성화되고 마우스 커서 설정이 내부 창의 마우스 커서 특성을 따릅니다.   커서를 nullNothingnullptrNull 참조(Visual Basic의 경우 Nothing)(Microsoft Visual Basic .NET의 경우 Nothing)로****설정하면 개체의 커서 처리도 비활성화됩니다. 커서가 기본 설정과 다르게 설정된 경우 개체의 활성화 여부와 관계없이 개체에서 항상 해당 커서를 사용합니다.이 속성은 잉크 입력 장치가 아닌 포인터의 시각적 표시를 참조합니다. 잉크 입력 장치는 [Microsoft.Ink..::.Cursor](http://msdn.microsoft.com/ko-kr/library/microsoft.ink.cursor.aspx) 클래스로 나타냅니다.


즉, InkOverlay가 비활성화 되면 원래의 Cursor를 따르게 되고, 활성화 된 경우에는 그리기의 특성, 즉 점(Point)의 형태로 나타내어 진다는 것입니다. 따라서 InkOverlay 위에서 커서를 바꿔주기 위해서는 InkOverlay 개체를 비활성화 해야 한다는 말입니다. 아래의 코드는 마우스가 움직일 경우, 마우스 클릭이 없는 경우에는 점(Point) 형태의 기본 InkOverlay 커서 속성이 아닌 Arrow(화살표) 속성을 지정하는 코드 입니다.
private void Form_MouseMove(object sender, MouseEventArgs e) {
            if (e.Button MouseButtons.None)             {                 if (inkOverlay.CollectingInk true)                 { }                 else                 {                    inkOverlay.Enabled = false;
                   this.Cursor = System.Windows.Forms.Cursors.Arrow;                 }
            }             else if (e.Button MouseButtons.Left || e.Button MouseButtons.Right)             {
                inkOverlay.Enabled = true;
            } }

마우스 버튼이 없을때는 InkOverlay의 Enabled 속성을 False로 함으로써, 개체를 비활성화 시키고 있습니다. 따라서 비활성화 후에 커서의 모양을 변화시켜주면 원하는 대로 모양이 변화하게 됩니다. 그리고 마우스의 버튼 클릭이 있는 경우에는, Enabled 속성을 True로 함으로써 개체를 활성화 시켜주면 바로 커서의 모양이 바뀌게 됩니다. **주의할 점!! 이것만 기억하자. 꼭꼭꼭!!**
위의 코드에서 빨간 색으로 지정한 부분을 보면 inkOverlay.CollectingInk 라는 속성이 있습니다. 간혹, 마우스가 아닌 다른 하드웨어로 부터 신호를 받아서 처리하는 경우, 마우스 이벤트를 강제로 발생 시켜서 그리는 경우가 있습니다. 이럴경우, Ink를 수집(Collect)하고 있는데, 그 와중에 Enabled=false를 하게 되면 런타임 에러가 발생하기 때문에 위의 소스코드 처럼 처리를 하시기 바랍니다.

 


 


#c#  #change cursor  #dev  #InkOverlay curosr  #Ink상에서의 커서변화  #Microsoft.Ink  #MS INK  #커서변화