BLOG ARTICLE 그래픽 | 1 ARTICLE FOUND

  1. 2007.01.08 그래픽

그래픽

programming/API 2007. 1. 8. 00:35
1. GDI Object
  GDI 오브젝트는 GDI가 그래픽 출력을 위해 사용하는 도구임과 동시에 사용자가 GDI의 출력을 조장할 수
  이쓴 도구이기도 하다. 원하는 색상과 모양의 모브젝트를 만들고 DC에 선택해 놓으면 이후부터 선택된
  오브젝트의 속성대로 출력

2. GDI 오브젝트를 만들 때 핸들을 발급받으며 선택하거나 삭제할 때는 이 핸들만 가지고 GDI 오브젝트를
  사용 DC가 BeginPaint나 GetDC 함수에 의해 처음 만들어 졌을 때 디폴트로 선택된 GDI 오브젝트는
  아래와 같음
GDI 오브젝트     핸들타입     설명                                디폴트
펜                    HPEN         선을 그을 때 사용              검정색의 가는 실선
브러시              HBRUSH     면을 채울때 사용               흰색
폰트                 HFONT       문자 출력에 사용되는 글꼴   시스템 글꼴
비트맵              HBITMAP    비트맵 이미지                   선택되지 않음
팔레트              HPALLETTE팔레트                              선택되지 않음
리전                 HRGN          화면상의 영역                  선택되지 않음

3. Stock Object
  가. 윈도우가 기본적으로 제공하는 GDI 오브젝트
  나. 운영체제가 부팅할 때부터 미리 만들어 놓아 일부러 만들지 않아도 언제든지 사용가능 하며
    사용한 후 파괴할 필요도 없음
    1) HGDIOBJ GetStockObject(int fnObject);  주로 브러시와 펜이 스톡 오브젝트로 제공됨
      함수는 여러 종류의 스톡 오브젝트를 리턴하므로 대입하기 전에 원하는 타입으로 캐스팅
    2) HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); 이전에 쓰던 오브젝트를 리턴

4. 색상
  RGB 매크로 함수를 사용하여 색상값을 만듬
  typedef DWORD COLORREF;
  #define RGB(r, g, b)
                    ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b)<<16)))

5. PEN
  가. 기본 스톡 펜은 흰색, 검정색, 투명색 세 가지 뿐이며 원색 펜은 직접 만들어서 사용
    HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
    (선의 모양, 선의 폭, 선의 색상) 펜의 핸들을 리턴 리턴후에는 반드시 파괴
    BOOL DeleteObject(HGDIOBJ hObject);   GDI 오브젝트를 삭제할 때 사용

6. BRUSH
  가. 기본 스톡 브러시는 단색 브러시가 있음, 만드는 건 PEN과 동일
    HBRUSH CreateSolidBrush(COLORREF crColor);  단색의 브러시 제작
    HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref); 무늬와 색상을 지정할수 있음

7. Old의 의미
  가. GDI 오브젝트를 생성하고 파괴하지 않으면 안됨
  나. GDI 오브젝트를 저장하는 리소스 영역은 메인 메모리와는 다른 특수한 영역으로 이 영역의 크기가
    그리 크지 못해 오브젝트를 많이 만들면 금방 가득차 버림
  다. DC에 선택되어 있는 오브젝트는 삭제할 수 없기 때문에 Old라는 GDI 오브젝트를 사용하여
    사용중인 오브젝트를 Old라는 오브젝트로 교체후 삭제함
  라. 코드의 범용성을 위해서는 항상 Old 오브젝트를 사용하여 DC를 원래대로 돌려놓는 습관을
    가지는 것이 좋음

8. 투명 오브젝트
 스톡 오브젝트에는 투명색의 오브젝트가 존재함

9. 그리기 모드
  가. 윈도우즈에서 사용하는 디폴트 그리기 모드는 R2_COPYPEN 모드라서 그려지는 그림이
    기존 그림을 덮어버림
    1) int SetROP2(HDC hdc, int fnDrawMode);
        int GetROP2(HDC hdc);
  나. 마우스를 따라 선을 이동시킬 때 이미 그려진 그림을 보존해야 하므로 그리는 중의 선을 반점 모드로
    그려 이 선이 지워질 때 원래대로 복구해 놓고 가야하는 것이다. 그러기 위해서느 절대 색상으로 삭제,
    그리기 해서는 안되면 이미 그려진 그림과 논리 연산을 취하는 다른 방법을 사용해야 한다. R2_NOT는
    이런 작업이 가능한 그리기 모드의 한 예인데 흑백 환경에서는 이 모드가 가장 편리하며 컬러 환경에는
    R2_NOTXORPEN이 가장 완벽함

10. BITMAP
    비트맵은 대용량이라 직접 출력하는 함수는 제공하지 않으며 약간의 준비를 거친 후 출력해야 한다.
    이렇게 준비 동작을 취한 후 출력하면 여러번 출력할 때 이미 준비된 데이터를 전송하기만 하면
    출력 속도도 빠르고 예비동작을 미리 취해 놓을 수 있다는 점에서도 유리하다. 비트맵은 화면으로
    직접 출력할 수 없으며 반드시 메모리 DC에 미리 준비해 놓고 사용해야 한다
  가. 메모리 DC란 화면 DC와 동일한 특성을 가지며 그 내부에 출력 표면을 가진 메모리 영역이다.
    메모리에 있기는 하지만 화면 DC에서 사용할 수 있는 모든 출력을 메모리 DC 에서도 할 수 있다.
  나. HDC CreateCompatibleDC(HDC hdc);
    화면 DC의 핸들을 주면 화면 DC와 동일한 특성을 가지는 DC를 메모리에 만들어 핸들을 리턴
  다. HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
    (비트맵 리소스를 가진 인스턴스의 핸들, 비트맵 리소스의 이름)
  라. BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc,
    int nXSrc, int nYSrc, DWORD dwRop);
    (복사 대상 DC, X좌표, Y좌표, 폭, 높이, 복사원 DC, 복사원X좌표, 복사원 Y좌표, 래스터 연산방법)
  마. BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,
    HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);
    확대, 축소가 가능
 
11. FONT
  HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight,
    DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet,
    DWORD FdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality,
    DWORD fdwPitchAndFamily, LPCTSTR lpszFace);
  (폰트의 높이, 폰트의 폭, 폰트의 각도, 개별문자 기울기, 폰트의 두께, 폰트 속성, 문자셋,
  출력 정확도, 클리핑 정확도, 논리적 폰트를 물리적 폰트와 얼마나 근접시킬 것인가 지정,
  폰트의 피치와 그룹을 설정, 글꼴의 이름)
  가. LOGFONT 구조체를 사용하여 폰트를 정의하고 CreateFontIndirect 함수로 폰트를 만드는 방법
    LOGFONT 구조체는 CreateFont 함수의 인수 전체를 멤버로 가지는 구조체로 LOGFONT에
    원하는 값을 먼저 대입한 후 CreateFontIndirect 함수로 이 구조체의 번지를 넘기면 됨
    HFONT CreateFontIndirect(CONST LOGFONT * lplf);
  나. 텍스트의 색상
    COLORREF SetTextColor(HDC hdc, COLORREF crColor); 글자 색상
    COLORREF SetBkColor(HDC hdc, COLORREF crColor); 글자 배경색상
    int SetBkMode(HDC hdc, int iBkMode); 글자배경색상 모드(투명, 불투명) 기본은 불투명
AND