도형 출력.
윈도우에서 사용하는 것은 사용자에게 GUI을 제공하기 위한 것으로, 기본적으로 도형을 출력할 수 있는 점이 있다.
도형은 점, 선, 면이 있다. 2차원에서는 최대 면까지 표현할 수 있다.
만약에 3D를 표현하고 싶다면, 복잡한 도형을 생각해야 된다. 그래서 OpenGL을 이용해서 표현을 하는게 좋다. 그리고 GDI에서는 3D를 지원해주는 형태가 아니다.
참조 : https://msdn.microsoft.com/en-us/library/windows/desktop/dd183385(v=vs.85).aspx
그래픽 출력의 기본으로는 점, 선, 도형으로 나뉘어 진다.
점은 다음 과 같은 함수를 사용한다.
SetPixel(
HDC hdc, // hdc의 핸들.
int X, // 출력할 픽셀의 x좌표.
int Y, // 출력할 픽셀의 y좌표.
COLORREF crColor); // 픽셀의 색깔.
색상인 COLORREF는 32bit형태로 되어있는거랑 비슷하다고 보면된다.
역으로 Pixel 단위로 데이터를 얻는 방법이 있다.
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, 100, 30, RGB(255,0,0)); ReleaseDC(hWnd, hdc); break; case WM_PAINT: hdc = GetDC(hWnd); TextOut(hdc, 100, 50, "Hello World",11); ReleaseDC(hWnd, hdc); break; } return DefWindowProc(hWnd,iMessage,wParam, lParam); } | cs |
'연습' 카테고리의 다른 글
Windows API 프로그래밍 -11. 사각형 출력. - (0) | 2016.06.27 |
---|---|
Windows API 프로그래밍 -10. 선 출력. - (0) | 2016.06.26 |
Windows API 프로그래밍 -8. 텍스트 출력. - (0) | 2016.06.24 |
Windows API 프로그래밍 -7. WM_PAINT. - (0) | 2016.06.23 |
Windows API 프로그래밍 -6. GDI와 DC에 대한 설명. - (0) | 2016.06.22 |