블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total40,647
Today0
Yesterday364

'device context'에 해당되는 글 1건

  1. 2013.01.20 14장. 그리기 (1)

DC

DC의 정의

- DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며, 프로그램은 DC의 정보를 참조하여 그리기를 수행하고, DC의 정보를

  조작하여 그리는 방법을 변경함.

DC의 구조

- DC는 그리기 관련 정보를 가지고 있는 데이터 구조체임.

  배경색, 모드, 비트맵, 브러시, 펜, 폰트등을 포함한 많은 데이터들이 포함되어 있다.

  윈도우 관련 헤더에는 DC에 대한 타입 정의는 선언되어 있지 않으며, 각 속성에 대해 얻고, 변경하는 함수를 이용해서 DC를 사용.

DC의 종류

- 디스플레이 DC : 화면 출력에 사용, 프린터 DC : 프린터 출력, 메모리 DC : 비트맵 출력에 사용, 정보 DC : 정보 취득에 사용.

  Common DC

  - 일반적으로 사용하는 DC를 의미하며, GetDC나 BeginPaint 함수를 이용해 매번 디폴트 속성의 DC를 얻을 수 있음.

    사용이 완료된 후 반드시 ReleaseDC나 EndPaint로 DC를 해제해 줘야함.

  Private DC

  - 윈도우 생성시 한번 발급받아, 종료시 해제 함. 윈도우 클래스 스타일에 CS_OWNDC 스타일을 지정해서 사용하며,

    한번 설정된 속성은 바꿔주지 않으면 그대로 유지됨.

  Class DC

  - CS_CLASSDC플래그를 주고 사용가능하며, 해당 윈도우 클래스로부터 만들어지는 모든 윈도우는 클래스 DC를 사용.

    없다고 생각하고 쓰지 말아라.

  Window DC

  - Common DC와 비슷하게 사용. 단 윈도우 좌상단이 원점이고, 클리핑 또한 비작업영역을 포함하여 이루어짐.

    WM_NCPAINT나 WM_NCACTIVATE 메시지에서 비작업영역에 대해 커스터마이징 할것이 아니라면 사용을 비추.

    HDC GetWindowDC(HWND hWnd);

    - 위 함수를 이용해 DC를 얻고, ReleaseDC함수로 DC를 해제.

  Parent DC

  - 버튼이나 에디트 등의 차일드 컨트롤에서 그리기 속도를 최대한 빠르게 하기 위해 사용. 최상위 윈도우나 팝업 윈도우는 사용불가.

    CS_PARENTDC 플래그가 지정되어야 하며, 사용 비추.

GetDeviceCaps

- int GetDeviceCaps(HDC hdc, int nIndex);

  - hdc가 가진 장치의 특성을 파악하는 함수, DC에 어떤 특정한 작업을 하기 전에 지원하는지 여부를 확인 할 수 있음.

    nIndex 는 조사하고자 하는 값.

DRIVERVERSION

The device driver version.

TECHNOLOGY

Device technology. It can be any one of the following values.

DT_PLOTTER Vector plotter DT_RASDISPLAY Raster display DT_RASPRINTER Raster printer DT_RASCAMERA Raster camera DT_CHARSTREAM Character stream DT_METAFILE Metafile DT_DISPFILE Display file 

If the hdc parameter is a handle to the DC of an enhanced metafile, the device technology is that of the referenced device as specified to the CreateEnhMetaFile function. To determine whether it is an enhanced metafile DC, use the GetObjectType function.

HORZSIZE

Width, in millimeters, of the physical screen.

VERTSIZE

Height, in millimeters, of the physical screen.

HORZRES

Width, in pixels, of the screen; or for printers, the width, in pixels, of the printable area of the page.

VERTRES

Height, in raster lines, of the screen; or for printers, the height, in pixels, of the printable area of the page.

LOGPIXELSX

Number of pixels per logical inch along the screen width. In a system with multiple display monitors, this value is the same for all monitors.

LOGPIXELSY

Number of pixels per logical inch along the screen height. In a system with multiple display monitors, this value is the same for all monitors.

BITSPIXEL

Number of adjacent color bits for each pixel.

PLANES

Number of color planes.

NUMBRUSHES

Number of device-specific brushes.

NUMPENS

Number of device-specific pens.

NUMFONTS

Number of device-specific fonts.

NUMCOLORS

Number of entries in the device's color table, if the device has a color depth of no more than 8 bits per pixel. For devices with greater color depths, 1 is returned.

ASPECTX

Relative width of a device pixel used for line drawing.

ASPECTY

Relative height of a device pixel used for line drawing.

ASPECTXY

Diagonal width of the device pixel used for line drawing.

PDEVICESIZE

Reserved.

CLIPCAPS

Flag that indicates the clipping capabilities of the device. If the device can clip to a rectangle, it is 1. Otherwise, it is 0.

SIZEPALETTE

Number of entries in the system palette. This index is valid only if the device driver sets the RC_PALETTE bit in the RASTERCAPS index and is available only if the driver is compatible with 16-bit Windows.

NUMRESERVED

Number of reserved entries in the system palette. This index is valid only if the device driver sets the RC_PALETTE bit in the RASTERCAPS index and is available only if the driver is compatible with 16-bit Windows.

COLORRES

Actual color resolution of the device, in bits per pixel. This index is valid only if the device driver sets the RC_PALETTE bit in the RASTERCAPS index and is available only if the driver is compatible with 16-bit Windows.

PHYSICALWIDTH

For printing devices: the width of the physical page, in device units. For example, a printer set to print at 600 dpi on 8.5-x11-inch paper has a physical width value of 5100 device units. Note that the physical page is almost always greater than the printable area of the page, and never smaller.

PHYSICALHEIGHT

For printing devices: the height of the physical page, in device units. For example, a printer set to print at 600 dpi on 8.5-by-11-inch paper has a physical height value of 6600 device units. Note that the physical page is almost always greater than the printable area of the page, and never smaller.

PHYSICALOFFSETX

For printing devices: the distance from the left edge of the physical page to the left edge of the printable area, in device units. For example, a printer set to print at 600 dpi on 8.5-by-11-inch paper, that cannot print on the leftmost 0.25-inch of paper, has a horizontal physical offset of 150 device units.

PHYSICALOFFSETY

For printing devices: the distance from the top edge of the physical page to the top edge of the printable area, in device units. For example, a printer set to print at 600 dpi on 8.5-by-11-inch paper, that cannot print on the topmost 0.5-inch of paper, has a vertical physical offset of 300 device units.

VREFRESH

For display devices: the current vertical refresh rate of the device, in cycles per second (Hz).

A vertical refresh rate value of 0 or 1 represents the display hardware's default refresh rate. This default rate is typically set by switches on a display card or computer motherboard, or by a configuration program that does not use display functions such as ChangeDisplaySettings.

SCALINGFACTORX

Scaling factor for the x-axis of the printer.

SCALINGFACTORY

Scaling factor for the y-axis of the printer.

BLTALIGNMENT

Preferred horizontal drawing alignment, expressed as a multiple of pixels. For best drawing performance, windows should be horizontally aligned to a multiple of this value. A value of zero indicates that the device is accelerated, and any alignment may be used.

SHADEBLENDCAPS

Value that indicates the shading and blending capabilities of the device. See Remarks for further comments.

SB_CONST_ALPHA Handles the SourceConstantAlpha member of the BLENDFUNCTION structure, which is referenced by the blendFunction parameter of the AlphaBlend function. SB_GRAD_RECT Capable of doing GradientFill rectangles. SB_GRAD_TRI Capable of doing GradientFill triangles. SB_NONE Device does not support any of these capabilities. SB_PIXEL_ALPHA Capable of handling per-pixel alpha in AlphaBlend. SB_PREMULT_ALPHA Capable of handling premultiplied alpha in AlphaBlend. 

RASTERCAPS

Value that indicates the raster capabilities of the device, as shown in the following table.

RC_BANDING Requires banding support. RC_BITBLT Capable of transferring bitmaps. RC_BITMAP64 Capable of supporting bitmaps larger than 64 KB. RC_DI_BITMAP Capable of supporting the SetDIBits and GetDIBits functions. RC_DIBTODEV Capable of supporting the SetDIBitsToDevice function. RC_FLOODFILL Capable of performing flood fills. RC_PALETTE Specifies a palette-based device. RC_SCALING Capable of scaling. RC_STRETCHBLT Capable of performing the StretchBlt function. RC_STRETCHDIB Capable of performing the StretchDIBits function. 

CURVECAPS

Value that indicates the curve capabilities of the device, as shown in the following table.

CC_NONE Device does not support curves. CC_CHORD Device can draw chord arcs. CC_CIRCLES Device can draw circles. CC_ELLIPSES Device can draw ellipses. CC_INTERIORS Device can draw interiors. CC_PIE Device can draw pie wedges. CC_ROUNDRECT Device can draw rounded rectangles. CC_STYLED Device can draw styled borders. CC_WIDE Device can draw wide borders. CC_WIDESTYLED Device can draw borders that are wide and styled. 

LINECAPS

Value that indicates the line capabilities of the device, as shown in the following table:

LC_NONE Device does not support lines. LC_INTERIORS Device can draw interiors. LC_MARKER Device can draw a marker. LC_POLYLINE Device can draw a polyline. LC_POLYMARKER Device can draw multiple markers. LC_STYLED Device can draw styled lines. LC_WIDE Device can draw wide lines. LC_WIDESTYLED Device can draw lines that are wide and styled. 

POLYGONALCAPS

Value that indicates the polygon capabilities of the device, as shown in the following table.

PC_NONE Device does not support polygons. PC_INTERIORS Device can draw interiors. PC_POLYGON Device can draw alternate-fill polygons. PC_RECTANGLE Device can draw rectangles. PC_SCANLINE Device can draw a single scanline. PC_STYLED Device can draw styled borders. PC_WIDE Device can draw wide borders. PC_WIDESTYLED Device can draw borders that are wide and styled. PC_WINDPOLYGON Device can draw winding-fill polygons. 

TEXTCAPS

Value that indicates the text capabilities of the device, as shown in the following table.

TC_OP_CHARACTER Device is capable of character output precision. TC_OP_STROKE Device is capable of stroke output precision. TC_CP_STROKE Device is capable of stroke clip precision. TC_CR_90 Device is capable of 90-degree character rotation. TC_CR_ANY Device is capable of any character rotation. TC_SF_X_YINDEP Device can scale independently in the x- and y-directions. TC_SA_DOUBLE Device is capable of doubled character for scaling. TC_SA_INTEGER Device uses integer multiples only for character scaling. TC_SA_CONTIN Device uses any multiples for exact character scaling. TC_EA_DOUBLE Device can draw double-weight characters. TC_IA_ABLE Device can italicize. TC_UA_ABLE Device can underline. TC_SO_ABLE Device can draw strikeouts. TC_RA_ABLE Device can draw raster fonts. TC_VA_ABLE Device can draw vector fonts. TC_RESERVED Reserved; must be zero. TC_SCROLLBLT Device cannot scroll using a bit-block transfer. Note that this meaning may be the opposite of what you expect. 

COLORMGMTCAPS

Value that indicates the color management capabilities of the device.

CM_CMYK_COLOR Device can accept CMYK color space ICC color profile. CM_DEVICE_ICM Device can perform ICM on either the device driver or the device itself. CM_GAMMA_RAMP Device supports GetDeviceGammaRamp and SetDeviceGammaRamp CM_NONE Device does not support ICM.

WM_PAINT 메시지

무효영역

- 응용 프로그램이 윈도우에 그리기를 수행하는 경우가 있음. 효과적인 그리기를 위해, 복잡한 메커니즘이 사용되며,

  이 중 화면의 일부가 변경되어 다시 그려져야 할 부분을 무효영역(Invalide Region == Update Region)이라 함.

  BOOL InvalidateRect(HWND hWnd, CONST RECT* lpRect, BOOL bErase);

  - hWnd 윈도우의 lpRect영역을 무효화하여 다시 그리도록 하는 함수, lpRect가 NULL인 경우 윈도우 전체가 무효화 됨.

    bErase는 무효영역의 배경을 먼저 지울것인가를 지정하는 것으로, TRUE이면 BeginPaint함수가 배경을 먼저 지운후 그려짐.

    무효영역을 계산하는 과정이 복잡하거나, 시간이 소요되더라도 모든 작업영역을 다시그리는 것보다는 훨씬 더 빠르기 때문에,

    무효영역을 계산하여 InvalidateRect의 인자로 넣어주는 것이 좋음.

  BOOL ValidateRect(HWND hWnd, CONST RECT *lpRect);

  - hWnd 윈도우의 lpRect의 영역을 유효화하여 그리기 영역에서 제외 시키는 함수.

  BOOL InvalidateRgn(HWND hWnd, HRGN hRgn, BOOL bErase);

  BOOL ValidateRgn(HWND hWnd, HRGN hRgn);

  - Rect대신 Region 영역에 대해 유/무효화를 수행하는 함수들.

  WM_PAINT 메시지가 보내지는 시점.

  - 첫째로 메시지 큐에 대기중인 메시지가 없어야 함.(우선 순위가 WM_TIMER를 제외하곤 가장 낮은 메시지)

    둘째로 무효영역이 있어야 함.

    응용 프로그램이 아닌 운영체제가 직접 WM_PAINT 메시지를 큐에 넣는다. 응용 프로그램에서는 다만 무효영역을 만들 뿐이며,

    무효영역이 있으면 운영체제가 적당한 때에 WM_PAINT 메시지를 보내 다시 그리도록 함.

  WM_PAINT 통합

  - WM_PAINT 메시지는 메시지 큐에 동시에 두개가 들어가지 않으며, 무효영역을 합치고 메시지도 하나로 줄이는 최적화 동작을 함.

  UpdateWindow 함수

  - 화면이 무효화 되는 시점과 실제로 그려지는 시점은 비동기적임.

    무효화되는 즉시 화면을 다시 그릴때 사용하는 함수는 UpdateWindow임.

    메시지 큐를 거치지 않고, WM_PAINT 메시지를 윈도우 프로시저로 보내기 때문에 바로 처리하게 함.

    단 무효영역이 없을 경우, WM_PAINT 메시지를 발생시키지 않음.

    BOOL RedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags);

    - UpdateWindow 함수와 비슷하지만, 영역 지정이나, 그리기 방법 지정등 더많은 기능이 있다.

클리핑 영역

- 무효영역이란 다시 그려져야 할 부분이지만, 운영체제가 실제 그리기에 사용하는 영역은 클리핑 영역이다.

  화면에 보이는 가시 영역을 말한다. 무효영역은 운영체제에 의해 설정되거나 응용 프로그램이 InvalidateRect 등의 함수로 직접 설정.

  클리핑 영역은 BeginPaint함수에 의해 계산된다.

윈도우 스타일

- 윈도우 스타일 중에 무효영역과 클리핑 영역에 관계된 것들

  WS_CLIPCHILDREN

  - 윈도우가 이 스타일을 가지면 차일드의 영역을 클리핑 영역에서 제외함으로써 차일드가 불필요하게 다시 그려지지 않도록 함.

    즉, 차일드위에 뭔가를 그릴 수 없음.

  WS_CLIPSIBLING

  - 차일드 윈도우에만 적용되는 스타일로, 차일드끼리 겹쳐있을 때 서로의 영역을 침범하지 않도록 함.

  CS_HREDRAW, CS_VREDRAW

  - 가로, 세로 윈도우 크기가 변경될 때 전체 작업영역을 무효화하게 하는 클래스 스타일.

PAINTSTRUCT

- WM_PAINT의 앞에서 BeginPaint함수를 호출할 때 전달하는 인자

  PAINTSTRUCT 구조체의 뒤쪽 세개 멤버는 운영체제가 사용하는 런타임 데이터이므로 무시

  hdc는 DC의 핸들, fErase는 배경을 지울것인가를 지정하는 값으로 0이 아닌값이면 지울 필요가 있는 것.

  rcPaint는 그리기를 해야 할 사각영역을 가짐. 이영역을 잘 활용하면 그리는 속도를 훨씬 더 빠르게 할 수 있음.

BeginPaint

- BeginPaint함수의 동작

  1. 그리기를 위해 DC를 발급받음

  2. 클리핑 영역을 조사하여 DC에 설정

  3. 무효영역을 없애(유효화) 다시 WM_PAINT 메시지가 호출되지 않도록 함.

  4. 다시 그려지는 영역에 캐럿이 있다면, 그리기를 시작하기 전에 숨겨 캐럿이 파괴되지 않도록 함. EndPaint에서 복구됨

  5. 윈도우의 배경을 지우기 위해 WM_ERASEBKGND메시지를 보내고, WM_NCPAINT도 보낸다.

그리기 메시지

- 비작업영역을 커스터마이징 하기위해 WM_NCPAINT메시지를 가로채고, GetWIndowDC로 윈도우 DC를 얻어 원하는대로 그릴 수 있음

  WM_ERASEBKGND 메시지는 배경 브러시가 등록되어 있을 경우 이 브러시로 배경을 칠하는데 이는 곧 배경을 지우는 것

  WM_ERASEBKGND의 wParam으로 DC핸들이 전달되고, 이 핸들은 해제할 필요가 없음.

  GetDC를 이용해 얻은 DC 사용시 문제가 발생할 수 있다. 클리핑 영역이 설정되어 있지 않아 화면 어느 곳이나 그릴 수 있으며 따라서

  배경에 의해 기존 그림이 덮여버릴수 있다.

GetDC

- 대부분의 그리기 동작은 WM_PAINT 메시지 처리 루틴에서 수행하는 것이 정상적임.

  그러나 특수한 경우 WM_PAINT메시지 밖에서 그리기를 하는 것이 더 효율적이거나 즉시 그리기를 해야만 할 때가 있음.

  이때 GetDC함수로 DC 핸들을 얻고, 그리기가 끝난 후, ReleaseDC함수로 해제해준다.

  HDC GetDCEx(HWND hWnd, HRGN hrgnClip, DWORD flags);

  - GetDC에 비해 클리핑 영역 지정에 대한 옵션을 지정할 수 있음

  HWND WindowFromDC(HDC hDC);

  - GetDC의 반대 동작을 하는 함수이다.

그리기 정보의 보관

정보 보관의 필요성

- 윈도우즈용 프로그램의 그리기는 모두 WM_PAINT 메시지에 모아져야 하며 언제든지 WM_PAINT 메시지가 전달되면 원래의 모습대로

  깜쪽같이 그릴수 있어야 하므로, 그리기에 대한 정보들은 어딘가에 저장되어 있어야함.

비트맵에 저장하기

- 메모리 비트맵을 사용하면 어떤 복잡한 형태의 그림이라도 기억할 수 있는 장점이 있으며, 속도도 만족할 만큼 빠르다.

  단 메모리가 조금 많이 드는 것이 단점.

DC 관리

LockWindowUpdate

- BOOL LockWindowUpdate(HWND hWndLock);

  - 화면을 그리기는 작업을 한번에 하기 위해, 화면 그리기를 금지/해제하는 함수

    금지 대상이 될 윈도우 핸들을 인자로 넘기며, NULL을 넘기면 락을 해제 한다는 의미가 된다.

SaveDC

- DC에는 여러 가지 복잡한 정보들이 많이 포함되어 있어, 많은 부분을 변경하였을 때 DC를 저장해 두어야 할 필요가 있을 때 사용

  int SaveDC(HDC hdc);

  - DC의 모든 설정 상태를 스택에 저장해 놓는다. 그리곤 핸들에 해당하는 정수 값을 리턴한다.

  BOOL RestoreDC(HDC hdc, int nSavedDC);

  - SaveDC에서 얻은 정수값은 nSavedDC로 넘겨, hdc에 해당 DC의 핸들을 받는다.

CreateDC

- 윈도우와 관련된 DC는 GetDC등의 함수로 구해 사용하지만 다음 함수를 사용하면 DC를 만들 수도 있음

  HDC CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput, CONST DEVMODE* lpInitData);

  - 주로 프린터 DC를 만들 때 사용하지만, 화면 DC를 만들 때도 쓸 수 있음.

    ex) CreateDC("DISPLAY", NULL, NULL, NULL); 이라고 호출하면 전체 화면에 대한 DC를 얻을 수 있음.

'20130827이전 > WinAPI' 카테고리의 다른 글

키보드 입력  (0) 2013.01.28
컴파일 관련 에러 - 1  (0) 2013.01.26
14장. 그리기  (1) 2013.01.20
13장. 메시지  (0) 2013.01.19
12장. 윈도우 관리  (0) 2013.01.18
11장. 윈도우  (1) 2013.01.15
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함