도형 출력.

 윈도우에서 사용하는 것은 사용자에게 GUI을 제공하기 위한 것으로, 기본적으로 도형을 출력할 수 있는 점이 있다.


 도형은 점, 선, 면이 있다. 2차원에서는 최대 면까지 표현할 수 있다.

 만약에 3D를 표현하고 싶다면, 복잡한 도형을 생각해야 된다. 그래서 OpenGL을 이용해서 표현을 하는게 좋다. 그리고 GDI에서는 3D를 지원해주는 형태가 아니다.


 참조 : https://msdn.microsoft.com/en-us/library/windows/desktop/dd183385(v=vs.85).aspx


 그래픽 출력의 기본으로는 점, 선, 도형으로 나뉘어 진다.


 점은 다음 과 같은 함수를 사용한다.

 SetPixel()[각주:1]


 SetPixel(

HDC hdc, // hdc의 핸들.

int X, // 출력할 픽셀의 x좌표.

int Y, // 출력할 픽셀의 y좌표.

COLORREF crColor); // 픽셀의 색깔.


 색상인 COLORREF는 32bit형태로 되어있는거랑 비슷하다고 보면된다.


 역으로 Pixel 단위로 데이터를 얻는 방법이 있다.

 GetPixel()[각주:2]


 GetPixel(

HDC hdc,

int X,

int Y);


 이렇게해서 해당 컬러 데이터를 얻을 수 있다.


 COLORREF의 데이터를 만들기 위해서는 함수를 사용한다.

 RGB 라는 형식으로 컬러를 생성하는 함수를 얻을 수 있다.


 이렇게해서 이미지를 생성하는 방법으로 SetPixel을 사용하면, 문제가 생긴다.

 이유는 SetPixel함수를 작동할때마다 HDC에서 받아들여지는 BMP의 정보를 받아들여 데이터를 변환한다. 해당 값을 변환 한 후에 끊는다. 그래서 SetPixel()이 많이 작동하게 되면, HDC을 연결하고 끊는 작업이 반복되서 문제가 생기게 된다.


 그래서 그림을 출력하는 것은 SetPixel()을 사용하지 않는게 좋다.


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
83
84
#include <stdlib.h>
 
#include <tchar.h>
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
 
WNDCLASS WndClass;
 
int WINAPI WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpszCmdParam,
            int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    g_hInst = hInstance;
    
    //윈도우 클래스 초기화
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName="ApiBase";
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
 
    //윈도우 클래스 생성.
    RegisterClass(&WndClass);
    
    //윈도우 객체 생성.
    hWnd = CreateWindow("ApiBase",
                        "Test",
                        WS_OVERLAPPEDWINDOW,
                        10,// X
                        100,// Y
                        400,// Width
                        400,// Height
                        NULL,
                        (HMENU)NULL,
                        hInstance,
                        NULL);
    
    //윈도우 창 띄우기.
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    
    return Message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    long dwStyle;
    
    switch(iMessage)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_LBUTTONDOWN:
            hdc = GetDC(hWnd);
            SetPixel(hdc, 10030, RGB(255,0,0));
            ReleaseDC(hWnd, hdc);
            break;
        case WM_PAINT:
            hdc = GetDC(hWnd);
            TextOut(hdc, 10050"Hello World",11);
            ReleaseDC(hWnd, hdc);
            break;
    }
    return DefWindowProc(hWnd,iMessage,wParam, lParam);
}
 
cs


  1. https://msdn.microsoft.com/en-us/library/windows/desktop/dd145078(v=vs.85).aspx(2016-06-22) [본문으로]
  2. https://msdn.microsoft.com/en-us/library/windows/desktop/dd144909(v=vs.85).aspx(2016-06-22) [본문으로]
Posted by JunkMam
,