GetSysColor()
COLOR_3DFACE|COLOR_BTNTEXT
InvalidateRect()
on WM_ERASEBKGND
윈도우 크래스에 등록된 배경 브러시로 작업영역을 지운다.
c.f. InvalidateRect()
WM_PAINT
BeginPaint()
EndPaint()
GetClientRect()
GDI(Graphic Device Interface)
하드웨어 종류에 상관없이 통일된 방법으로 출력 // 하드웨어 독립
모니터나 프린터 등의 여러 가지 출력 장비 개발 업체들이 윈도 운영 체제에서 동일한 방법으로 처리할 수 있는 디바이스 드라이버를 제공한다.
DC(Device Context)
BeginPaint()
EndPaint()
GetDC()
ReleaseDC()
CreateCompatibleDC()
DeleteDC()
CreateEnhMetaFile()
CloseEnhMetaFile()
GetEnhMetaFile()
DeleteEnhMetaFile()
PlayEnhMetaFile()
RECT
SetRect()
InflateRect()
IntersectRect()
정규화되지 않은 사각형은 빈 영역으로 간주
IsRectEmpty()
정규화되지 않은 사각형은 빈 영역으로 간주
PtInRect()
정규화된 사각형만을 인수로
요구한다
HRGN
PtInRegion()
윈도우
논리 좌표가 사용되는 표면
그래픽 출력 함수는 윈도우에 그래픽을 출력한다.
뷰포트
물리 좌표가 사용되는 영역
실제로 사용자의 눈에 보이는 좌표 영역
맵핑 모드
논리 좌표와 물리 좌표의 관계를 정의
MM_TEXT
고정 크기 매핑 모드
수학 좌표계 //?
MM_LOENGLISH
MM_HIENGLISH
MM_LOMETRIC
MM_HIMETRIC
MM_TWIPS
가변 크기 매핑 모드
MM_ISOTROPIC
MM_ANISOTROPIC
논리 좌표계
임의의 그래픽 디바이스
디바이스 좌표계
SetMapMode()
GetMapMode()
DPtoLP()
LPtoDP()
디폴트로 원점은 맵핑 모드에 상관없이 화면의 좌상단에 위치하고 있다.
SetViewportOrgEx()
specifies which device point maps to the window origin
offset
SetWindowOrgEx()
specifies which window point maps to the viewport origin
offset
더보기 접기
#include <windowsx.h>
void MsgCrk_OnDestroy(HWND hWnd)
{
PostQuitMessage(0);
}
void MsgCrk_OnPaint(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
// {
SetMapMode (hdc, MM_LOENGLISH );
SetViewportOrgEx (hdc, 200, 150, NULL);
/*
or
SetMapMode(hdc, MM_ANISOTROPIC);
SetWindowExtEx(hdc, 160, 100, NULL);
RECT rect;
GetClientRect(hWnd, &rect);
SetViewportExtEx(hdc, rect. right, rect. bottom, NULL);
*/
...
// }
EndPaint(hWnd, &ps);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
HANDLE_MSG(hWnd, WM_DESTROY, MsgCrk_OnDestroy);
HANDLE_MSG(hWnd, WM_PAINT, MsgCrk_OnPaint);
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
접기
GDI는 현재 DC에 선택되어 있는 GDI 오브젝트를 사용한다.
GDI 메모리는 프로세스가 소유하고 응용 프로그램이 종료될 때 해제된다.
DC에 현재 선택되어 있는 GDI 오브젝트는 삭제할 수 없다.
따라서 GDI 객체를 반드시 삭제해야 하고 객체를 삭제하기 전에, 디바이스 콘텍스트로부터 분리해야 한다.
디바이스 컨텍스트 객체가 파괴될 때, 이와 관련된 모든 GDI 객체의 선택이 해제된다. // ???
GDI 오브젝트
DeleteObject()
SelectObject()
펜
CreatePen()
PS_INSIDEFRAME
DeleteObject()
브러시
CreateSolidBrush()
DeleteObject()
폰트
CreateFontIndirect()
DeleteObject()
비트맵
화면 DC와 호환되는 비트맵을 생성해서 더블 버퍼링의 내부 버퍼로 사용될 수 있다.
화면 DC와 호환되는 메모리 DC에 선택해서 그래픽 함수를 적용
BitBlt()
팔레트
리전
스톡 오브젝트 // 표준 GDI 오브젝트?
GetStockObject()
BLACK_PEN|NULL_BRUSH|NULL_PEN
GetSysColorBrush() // 시스템 브러시?
COLOR_HIGHLIGHT
COLOR_WINDOW
더보기 접기
COLORREF colBack;
HBRUSH hBrush;
hBrush = CreateSolidBrush (colBack);
hOldBrush = (HBRUSH)SelectObject (hDC, hBrush);
... hBrush ...
SelectObject (hDC, hOldBrush);
DeleteObject (hBrush);
접기
더보기 접기
HPEN hOldPen, hPen;
hPen = (HPEN)GetStockObject (BLACK_PEN );
hOldPen = (HPEN)SelectObject (hDC, hPen);
...
SelectObject (hDC, hOldPen);
접기 더보기 접기
LOGFONT lf;
// clear out structure
memset(&lf, 0, sizeof(LOGFONT));
// request a 12-pixel-height font
lf.lfHeight = 12;
// request a face name "Arial"
strcpy_s(lf.lfFaceName, LF_FACESIZE, "Arial");
// create the font
HFONT hfont = ::CreateFontIndirect (&lf);
..
// Done with the font. Delete the font object.
::DeleteObject (hfont);
접기 SetPixel()
MoveToEx()
LineTo()
Rectangle()
FillRect()
Ellipse()
Polygon()
Point
PointF
Rect
RectF
GDI+
Pen -> GdiplusBase
.SetColor()
.SetAlignment()
PenAlignmentInset
PenAlignmentCenter
.SetStartCap()
LineCapSquare
LineCapRound
LineCapTriangle
LineCapSquareAnchor
LineCapRoundAnchor
LineCapDiamondAnchor
LineCapArrowAnchor
.SetEndCap()
.SetLineJoin()
LineJoinBevel
LineJoinRound
.SetDashStyle()
DashStyleDash
DashStyleDot
DashStyleDashDot
DashStyleDashDotDot
.SetDashOffset()
.SetDashPattern()
Color
SolidBrush -> Brush -> GdiplusBase
.SetColor()
LinearGradientBrush -> Brush
GraphicsPath -> GdiplusBase
.AddEllipse()
PathGradientBrush -> Brush
.SetCenterColor()
.SetSurroundColors()
HatchBrush -> Brush
GraphicsPath -> GdiplusBase
Region -> GdiplusBase
Graphics
.ResetTransform()
.TranslateTransform()
.SetPageUnit()
UnitPixel
UnitMillimeter
.DrawLine()
.DrawRectangle()
.FillRectangle()
.DrawEllipse()
.FillEllipse()
.DrawPie()
.FillPie()
.DrawArc()
.DrawPolygon() // 다각형
.DrawClosedCurve() // 닫힌 커브
.FillClosedCurve()
.DrawCurve() // 열린 커브
.DrawImage()
.SetInterpolationMode()
InterpolationModeNearestNeighbor
InterpolationModeHighQualityBilinear
.SetClip()
더보기 접기
void CCurveDrawingView::OnDraw(CDC* pDC)
{
CCurveDrawingDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
Graphics graphics(pDC->m_hDC);
Pen pen(Color (255, 0, 0, 0), 3);
// 좌표 지정
Point points[] = {Point(30, 30), Point(120, 50), Point(170, 10),
Point(150, 90), Point(90, 70), Point(50, 130)};
graphics.DrawPolygon (&pen, points, 6);
for(int i=0 ; i<6 ; i++)
points[i].X += 200;
graphics.DrawClosedCurve (&pen, points, 6, 0.5f);
for(i=0 ; i<6 ; i++)
{
points[i].X -= 400;
points[i].Y += 150;
}
graphics.DrawCurve (&pen, points, 6, 0);
}
접기
참조 사이트: