SetROP2

원형 int SetROP2(HDC hdc, int fnDrawMode);
인수

▶hdc : 그리기 모드를 지정할 DC의 핸들

▶fnDrawMode : 그리기 모드 ***) 연산 방법을 정확하게 조사할 것

그리기 모드 설명
R2_BLACK 항상 검정색으로만 그려진다.
R2_COPYPEN 펜의 색상으로만 그려지며 이미 그려져 있는 그림은 지워진다.
R2_MASKNOTPEN 화면과 펜의 역상색의 OR 조합
R2_MASKPEN 화면과 펜의 OR 조합
R2_MASKPENNOT 화면의 역상색과 펜의 OR 조합
R2_MERGENOTPEN 화면과 펜의 역상생의 조합
R2_MERGEPEN 화면과 펜의 조합
R2_MERGEPENNOT 화면의 역상색과 펜의 조합
R2_NOP 아무런 동작도 하지 않는다.
R2_NOT 화면 색상의 반전색으로 그려진다.
R2_NOTCOPYPEN 펜의 역상색으로 그려진다.
R2_NOTMASKPEN R2_MASKPEN 색상의 역상값
R2_NOTMERGEPEN R2_MERGEPEN의 역상값
R2_NOTXORPEN R2_XORPEN의 역상값
R2_WHITE 항상 흰색으로만 그려진다.
R2_XORPEN 화면 색상과 펜 색상의 XOR 조합값
리턴 성공하면 0이 아닌 값을 리턴하며 에러 발생시 0을 리턴한다.
설명

그리기 모드란 GDI 함수가 화면에 출력을 내보낼 때 화면에 이미 출력되어 있는 그림과 새로 그려지는 그림과의 관계를 정의하는 것이다. AND, OR, XOR 등 비트간의 이진 연상 방법과 NOT 연산의 조합으로 지정된다.그리기 연산은 래스터 디바이스에만 적용되며 벡터 디바이스에는 적용되지 않는다.

이 함수명의 ROP는 Rater OPeration의 약자이며 2는 화면색상과 펜의 색상 2개를 피연산자로 취한다는 뜻이다.

예제 1

다음 예제는 복잡한 모양의 배경(동심원)사이를 작은 원이 마우스를 따라 이동하는 방법을 보여준다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	int i;
	static oldx,oldy;
	int x,y;

	switch(iMessage) {
	case WM_MOUSEMOVE:
		hdc=GetDC(hWnd);
		SelectObject(hdc,GetStockObject(NULL_BRUSH));
		SetROP2(hdc,R2_NOT);
		if (oldx != 0)
			Ellipse(hdc,oldx-10, oldy-10,oldx+10,oldy+10);
		x=LOWORD(lParam);
		y=HIWORD(lParam);
		Ellipse(hdc,x-10, y-10,x+10,y+10);
		oldx=x;
		oldy=y;
		ReleaseDC(hWnd,hdc);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		SelectObject(hdc,GetStockObject(NULL_BRUSH));
		for (i=0;i<300;i+=5)
			Ellipse(hdc,200-i,200-i,200+i,200+i);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

마우스가 이동할 때마다 작은 원이 그려지는데 이 때 R2_NOT 그리기 모드를 사용하여 원래의 그림을 복구하면서 이동하기 때문에 항상 배경의 동심원이 파괴되지 않고 그 모양을 유지한다. 만약 R2_NOT 그리기 모드를 사용하지 않으면 마우스가 움직일 때마다 작은 원이 그려지기 때문에 배경의 동심원 모양이 원래 모양을 유지하지 못한다.

참고함수 GetROP2
플렛폼95이상
본문참조 

written by http://www.winapi.co.kr