본문 바로가기

TechLog

C#.net에서 SetROP2() 함수 기능 사용하기.

간단하게 말하자면, 그런 기능 없다.
닷넷 라이브러리의 GDI+ 팀이 도대체 무슨 생각을 한건지 케냘로서는 알 길이 없지만, 케냘이 돈 박스였으면 아마 GDI+ 팀을 찾아가서 매니저의 면상에 드롭킥을 날렸으리라...

어쨌든 그런건 중요한게 아니고,

일단 GDI의 SetROP2() 함수를 쓸 상황이 무지하게 많기는 한데... 케냘의 경우에는 스크린 캡쳐 프로그램을 만들 일이 있어서, 이 스크린 캡쳐 영역을 마우스로 드래그하면 캡쳐 영역을 표시해주는, 그런 용도 사용하려는 것이었다. 캡쳐하려는 그림이 그냥 밝은 색 위주이면 그냥 검정색 테두리를 그려줘도 되는데, 밝은 색이 아닐 경우도 있고.. SetROP2()를 사용한 XOR 연산을 사용하면 Invert만 하면서 테두리를 그려주면 이전 화면을 다시 그려줄 필요도 없어서 ... 으아 이거 설명하기 시작하면 끝이 없겠구나. 그냥 VC++에서 SetROP2() 사용해서 그래픽 툴 등에서 사용하는 영역 선택 기능 구현하려고 했었던 사람들만 읽어보도록 하여요. 설명하기가 귀찮아 ... 여튼.

앞서 적었듯이 GDI+에는 XOR 연산 관련 기능이 없다. 비트맵을 잘라다가 붙일 때 비스무리한 기능을 사용할 수는 있는데, 그거는 간단한 선을 그리거나 할 때는 손이 너무 많이 가서... 라인을 그린다던가 사각형(Rectangle)을 그릴 때는 다음과 같은 함수를 사용할 수 있다 :

ControlPaint.DrawReversibleFrame(rectangle, color, framestyle);
이름을 보면 쉽게 용도가 떠올라야 하는데.. 케냘은 양키도 아니고 미국 시민권자도 아니며 토익 900점대 득점자도 아니다. 다행히 예전에 봤던, 모니카 벨루치 나왔던 돌이킬 수 없는(Irreversible)이란 영화 제목 덕에 돌이킬 수 '있는'인가? 라는 생각은 살짝 들었다만. 돌이킬 수 '있는' 프레임을 그리는 명령이군요. 짠짠.

예상했겠지만, 첫번째 인자는 프레임을 그리는 영역이다. color는 어떤 색상을 기준으로 반전(Invert)을 시킬 것인지 지정하는 것인데, 별로 고민하지 말고 그냥 Color.Black을 넣어주면 알아서 반전된 색상으로 세팅해준다. 그리고 frameStyle은 말 그대로 프레임에 어떤 선을 그어줄 것이냐 ... 인데 이게 스타일이 지랄맞게도 딱 두 가지다. 약간 굵은 선(thick)과 점선(dash). 아니 이럴거면 그냥 Pen을 인자로 넘기지 왜 이따위로 만들어놨어 짜증나게... 여튼 저 함수를 사용해서, 마우스로 드래그하는 동안 첫 위치와 마우스의 최근 위치를 잇는 사각형을 그려주면 된다. 이게 색반전을 이용한 것이다보니, 사각형이 그려진 곳은 사각형의 테두리에 해당하는 각 픽셀의 색상이 반전된다. 예를 들어 (255,255,255) 값을 가진 흰색은 (0,0,0) 값을 갖는 검정색으로, 뭐 다른 색들도 비슷하게. 그리고 나서 마우스가 다른 위치로 이동하면? 방금 전의 위치에서 테두리를 한 번 더 그려주면 (0,0,0) -> (255,255,255)로 색상이 돌아오게 된다. Reversible! 이런 식으로 그리고 그린데 또 그리고 새로 그리고 새로 그린데 또 그리고 ... 하는 식으로 그려주면 되는 것.

그 외에도 DrawReversibleLine, FillReversibleRectangle이라는 함수도 있으므로, 선택 영역의 테두리 대신 영역 자체를 반전시키는 것도 가능하다. 다만 이건 좀 화면이 흉해지므로 가급적이면 쓰지 말자.

오늘 엄한거 자주 포스팅하네 -_-;