티스토리 뷰
GDI 비교, 깜박임 제거 : https://petra.tistory.com/1728
GDI+ 기본 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include <Gdiplus.h> // GDI+
using namespace Gdiplus;
//#pragma comment(lib, "gdiplus.lib) // Win32 API 에서 필요함
void DrawLine(CDC* ap_dc) // GDI+ 그리기, 25행 _DEBUG 선언 보더 먼저 함수정의해야만 new 연산자 오류가 없다.
{
Graphics* p_graphic = new Graphics(ap_dc->m_hDC);
Pen* p_pen = new Pen(Color(255, 255, 0, 0), 2);
p_graphic->SetSmoothingMode(SmoothingModeInvalid);
p_graphic->DrawEllipse(p_pen, 30, 130, 70, 50); // 채워지지 않는 도형을 그림
p_graphic->DrawEllipse(p_pen, 110, 130, 70, 50);
p_graphic->DrawEllipse(p_pen, 70, 150, 70, 50);
ap_dc->TextOut(210, 130, TEXT("GDI+ SmoothingModeInvalid (DGI와 같음)"));
p_graphic->SetSmoothingMode(SmoothingModeAntiAlias);
p_graphic->DrawEllipse(p_pen, 30, 230, 70, 50); // 채워지지 않는 도형을 그림
p_graphic->DrawEllipse(p_pen, 110, 230, 70, 50);
p_graphic->DrawEllipse(p_pen, 70, 250, 70, 50);
ap_dc->TextOut(210, 230, TEXT("GDI+ SmoothingModeAntiAlias"));
delete p_graphic;
delete p_pen;
}
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
BOOL CL2022Dlg::OnInitDialog()
{
...
// TODO: 여기에 추가 초기화 작업을 추가합니다.
GdiplusStartupInput gpsi;
if (Ok != GdiplusStartup(&m_token, &gpsi, NULL)) return 0; // GDI+ 지원여부 검사
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
void CL2022Dlg::OnDestroy()
{
...
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
GdiplusShutdown(m_token); // GDI+ 라이브러리 정리 작업
}
void CL2022Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else // GDI 그리기
{
CPaintDC dc(this);
CPen blue_pen(PS_SOLID, 2, RGB(0, 0, 255));
dc.SelectStockObject(NULL_BRUSH);
dc.SelectObject(&blue_pen);
dc.Ellipse(30, 30, 100, 80);
dc.Ellipse(110, 30, 180, 80);
dc.Ellipse(70, 50, 140, 100);
dc.TextOut(210, 30, TEXT("GDI"));
DrawLine(&dc);
//CDialogEx::OnPaint();
}
}
|
cs |
1~3행
34, 35행
5행 DarwLine() 에서 GDI+ 그리기 (OnPaint 에서 호출됨)
44행
DGI 보다 빠르다.