- 음악과 나 -/『 짬 통 』

4월 17일.. 디다.

noon2dy 2006. 4. 17. 21:22

 

/////////////////////////////////////////////////
// 4월 17일 월요일 오후 3: 37

 

SetROP2() 함수.. 는 그리기모드를 변경하는거라고 했쥐.

 

int SetROP2(
  HDC hdc,         // handle to DC
  int fnDrawMode   // drawing mode
);

 

 

fnDrawMode 종류,..

 

R2_BLACK Pixel is always 0.
R2_COPYPEN Pixel is the pen color.
R2_NOT  Pixel is the inverse of the screen color.
R2_XORPEN  Pixel is a combination of the colors in the pen and in the screen,
  but not in both.
등등. 나머진 msdn찾아보기.

 

 

이코드?

static int sx, sy, oldx, oldy;
int ex, ey;
static BOOL bNowDraw = FALSE;


switch (message)
{
 case WM_LBUTTONDOWN:
  sx = LOWORD( lParam );
  sy = HIWORD( lParam );
  oldx = sx;
  oldy = sy;
  bNowDraw = TRUE;  
  return 0;
 case WM_MOUSEMOVE:
  if( bNowDraw == TRUE )
  {
   hdc = GetDC( hWnd );
   SetROP2( hdc, R2_NOT );
   MoveToEx( hdc, sx, sy, NULL ); // 처음 클릭했을때 좌표로 CP이동
   LineTo( hdc, oldx, oldy );  //
   ex = LOWORD( lParam );
   ey = HIWORD( lParam );
   MoveToEx( hdc, sx, sy, NULL );
   LineTo( hdc, ex, ey );
   oldx = ex;
   oldy = ey;
   ReleaseDC( hWnd, hdc );
  }
  return 0;
 case WM_LBUTTONUP:
  bNowDraw = FALSE;
  hdc = GetDC( hWnd );
  MoveToEx( hdc, sx, sy, NULL );
  LineTo( hdc, oldx, oldy );
  ReleaseDC( hWnd, hdc );
  return 0;

 

계속 보기.. -_- 확실하게 이해가안되네.


sx, sy 는  처음 마우스를 누른 위치
oldx, oldy 는  지워져야 할 선의 끝좌표를 가진다.
ex, ey 는  다시 그려져야 할 선의 끝 좌표를 가진다
bNowDraw 는  현재 선을 그리고있는 중인가에 대한 정보를 가진다

 


논리좌표 : Windows 내에서 사용되는 좌표. Textout( hdc, 100, 100, ... );
물리좌표 : 실제 화면에 출력되는 좌표.

 

맵핑모드란?
논리좌표와 물리좌표사이의 관계를 정의해주는것.

 

맵핑모드 변경
int SetMapMode( HDC hdc, int fnMapMode );
ex>
SetMapMode( hdc, MM_LOENGLISH );
지정단위가 모두 0.01인치가됨.

 

현재 DC에 설정된 맵핑모드 Get하기
int GetMapMode( HDC hdc );

 

윈도우 : 논리 좌표가 사용되는 표면
뷰포트(Viewport) : 물리좌표가 사용되는 표면

 

TextOut( hdc, 100, 100, ... ); 하면
윈도우영역의 ( 100, 100 )에 문자열을 출력하며,
이렇게 출력된 문자열은 뷰포트를 통해 우리눈에 보이게된다.

 

 

BOOL SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint );
BOOL SetWindowOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint );
각각 뷰포트와 윈도우의 원점을 인수로 지정한 좌표 ( X, Y )로 이동시킨다.

 

 

BOOL SetWindowExtEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize );
BOOL SetViewportExtEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize );


bitmap...에 관해..

메모리DC란?
화면DC와 동일한 특성을 가지며 그 내부에 출력 표면을 가진 메모리 영역... -_-. ?

메모리DC에 먼저 그림을 그린 후,
그 결과만 화면으로 고속 복사함( 화면에 그림이 나타남 )

비트맵도 일종의 GDI오브젝트이지만 화면 DC에서는 선택할 수 없으며
메모리 DC만이 비트맵을 선택할 수 있다... 왜..? -_-.. 그렇게 만들어놨으니깐 그렇겠지..
그래서, 메모리 DC에서 먼저 비트맵을 읽어서 화면 DC로 복사한다. ]

 

1. 메모리 DC를 만들자

HDC CreateCompatibleDC( HDC hdc );

인수로 화면DC의 핸들을 주면, 이 화면DC와 동일한 특성을 가지는 DC를 메모리에 만들어
그 핸들값을 리턴해준다.=> 동일한 특성이란 색상수, 색상면(plane)이 같다는뜻.

아.. 저녁먹고 왔다. ㅎㅎ
겜아카데미 사람들. 오티하는데 꼽사리껴가지고.~ ㅎ


2. 메모리 DC를 만든 후에는 비트맵을 읽어온 후, 메모리 DC에 선택해준다.

HBITMAP LoadBitmap( HINSTANCE hInstance, LPCTSTR lpBitmapName );

 

이렇게 읽어온 비트맵을 SelectObject 함수로 메모리 DC에 선택하면
메모리 DC의 표면에는 리소스에서 읽어온 비트맵이 그려지겠지...
=> 그다음엔? 메모리 DC에 그려진 비트맵을 화면으로 복사.

 

3. BitBlt 함수로 DC간의 영역끼리 고속복사를 수행함

BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
 HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop );


4. 비트맵 출력이 끝난 후에는 비트맵 자체와 메모리 DC를 해제해 주어야함.


DeleteObject()
DeleteDC()

..

 

 

BOOL StretchBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest,
 int nWidthDest, int nHeightDest, HDC hdcSrc,
 int nXOriginSrc, int nYOriginSrc, int nHeightSrc, DWORD dwRop );

BitBlt와 마찬가지로 DC간의 복사를 수행하지만,
복사후에 크기가 변함.

 

StretchBlt( hdc, 0, 0, 246, 320, MemDC, 0, 0, 123, 160, SRCCOPY );

123, 160의 폭을 가지는 영역을 246, 320 영역에 복사. ( 두배 크기 )

 

폰트를 만들기.
CreateFont함수.. 를 사용하여 이 함수가 리턴해주는 핸들을 HFONT형의 변수에 대입.
BOOL CreateFont(
   int nHeight,
   int nWidth,
   int nEscapement,
   int nOrientation,
   int nWeight,
   BYTE bItalic,
   BYTE bUnderline,
   BYTE cStrikeOut,
   BYTE nCharSet,
   BYTE nOutPrecision,
   BYTE nClipPrecision,
   BYTE nQuality,
   BYTE nPitchAndFamily,
   LPCTSTR lpszFacename
);

 

 

음....

 

 

 

컨트롤은 윈도우...
CreateWindow( "button", "Click Me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    20, 20, 100, 25, hWnd, ( HMENU )0, hInst, NULL );

 

컨트롤은 윈도우이지만 홀로 사용될 수없고, 반드시 부모 윈도우의 차일드로 존재해야된다.
보통 메인 윈도우가 만들어질때( WM_CREATE )메시지가 발생했을때 만들어준다.