기본적으로 윈도우는 점(픽셀)단위로 그래픽이 이루어집니다. 이 픽셀은 최소단위이며 다른 말로는 화소라고 할 수 있으며,(600dpi..등등) 또한 이미지나 문자를 출력하기 위해서는 X와 Y 좌표가 필요합니다. 먼저 그림을 보겠습니다. 사분면을 놓고 생각을 해보자면 현재 우리가 사용하는 윈도우 API에서의 좌표는 우측으로 갈 수록 X 값이 증가하고 Y 축으로 갈수록 Y값도 증가합니다. 화면 좌측 상단이 Origin(원점)이라고 할때 수학에서 배웠던 4/4분면에 위치하고 X축도 증가하지만 Y축은 음수가 아닌 양수로 표시됩니다. 즉 그림의 무지가 출력되는 위치가 (0,0)과 (4 ,5 )라고 할때 위 그림처럼 출력되는 것입니다. 그럼 만약 -3 ,-2에 출력된 그림이 있다면, 이것은 어떻게 볼 수 있을까요? ..
프로그래밍 관련
이전과정을 통해서 비트맵을 윈도우창에 한개 띄우는것에 성공하였습니다. 하지만 게임을 만들기 위해서는 여러개의 이미지를 그리는것이 필요합니다. 그렇다면 여러개의 이미지를 띄울려면 어떻게 해야할까요? 먼저 가장 간단한 방법으로 생각해보건데 여러개의 이미지를 하나의 DC에 그리면 되지 않을까요? 비트맵을 그린후에 여러게를 고속 복사해서 DC에 집어넣으면 왠지 될 것도 같지 않으세요? [결과] 여러개의 비트맵을 출력하는것에는 성공하였지만 왠일인지 깜빡이게 됩니다. (InvalidateRect를 false로 하나 true로 하나 지정된 자리에 출력되기 때문에 결과는 같습니다.) 그렇습니다....비트맵을 여러개 출력하는것에는 성공하였지만..이것도 역시 더블 버퍼링을 해야합니다. 즉 비트맵마다 Memory DC를 생..
이제 어떤 방법으로 화면에 표시된 사각형들이 깜빡이지 않고 출력되는지 코드를 자세히 살펴보겠습니다.다른 부분들은 이미 이전에 설명을 했으니 void DrawIMG() 함수만을 조금 더 자세히 살펴보겠습니다. RECT crt; 현재 윈도우 클라이언트 영역의 크기를 저장할 RECT를 선언합니다. GetClientRect ( _hWnd , &crt); 윈도우 클라이언트의 영역의 좌표를 가져옵니다 . 클라이언트는 영역의 왼쪽 위 모서리의 좌표는 0, 0으로 지정됩니다. BOOL WINAPI GetClientRect( _In_ HWND hWnd, _Out_ LPRECT lpRect ); 매게 변수 의미 hWnd 좌표를 검색할 클라이언트의 핸들 값을 지정합니다. lpRect 클라이언트의 좌표를 저장한 RECT 구조..
이제 기본적인 비트맵을 출력해봤으니 더블 버퍼에 대해서 알아보도록 하겠습니다. 먼저 아래 코드를 작성해보겠습니다. void DrawIMG() { InvalidateRect( _hWnd , NULL ,TRUE); } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static RECT rc = {0 ,250 , 100 , 350}; switch (iMessage) { case WM_CREATE: { SetTimer (hWnd , 1 , 25 ,NULL); break; } case WM_TIMER: { DrawIMG(); rc.left += 1; rc.right +..
그럼 비트맵 출력 코드를 살펴보겠습니다. (WIndows API - #9 -1. 그래픽 처리 (Old를 같이 쓰는 이유) (1) 에서 설명된 내용은 제외하였습니다.) 먼저 , 윈도우즈에서는 비트맵을 곧바로 화면 DC로 출력하는 함수를 제공하지 않는다고 합니다. 비트맵의 크기가 다른 데이터에 비해 크기 때문에 출력속도가 낮기 때문이라고 합니다. 이 때문에 해당하는 파일을 먼저 읽어드리고(그리고) 난후에 출력해야하기 때문에 메모리 DC라는것을 만들어 화면 DC에 고속으로 복사하여 출력합니다. (그려지는 과정이 보여지지 않도록) #include "resource.h" resource.h 파일을 포함시킵니다. 해당 파일에는 추가한 이미지에 대한 정보가 들어있습니다. HDC hdc,MemDC; 메모리 DC라는것을..
윈도에 비트맵을 띄워봅시다! 게임을 만들거나 또는 어떠한 프로그램을 만들때 비트맵은 아주 중요한 리소스 입니다. 게임에서는 캐릭터, 배경 등등 거의 모든것을... 프로그래밍에서는 보다 멋진 인터페이스를 제공할 수도 있을 것 입니다. 아무튼 이제 이미지를 출력해보도록 하겠습니다. 먼저 리소스에 비트맵을 추가합니다. 비트맵 추가하는 법 1. 리소스 파일 -> 추가 -> 리소스를 클릭합니다. 2. 리소스 추가 항목에서 Bitmap을 클릭하고 가져오기를 누릅니다. (새로 만드셔도 됩니다만..그럴 분은 없겠죠?) 정상적으로 리소스를 추가하셨다면, "resource.h" 해더 파일과 비트맵이 추가되어 있습니다. 그 다음 아래와 같은 코드를 입력하시면 됩니다. #include "resource.h" LRESULT C..
기본적인 사각형을 그리는 코드를 조금 자세히 살펴봤으니 해당하는 구조로 사용해야하는 이유에 대해서실험을 통해 알아보도록 하겠습니다. * OLD를 왜 써야 하는가? 이 게시물에 가장 중요한 주제입니다. 간단히 말해서 기존에 생성한 GDI 오브잭트를 삭제하기 위해서 입니다.계속해서 GDI 오브잭트를 생성하고 삭제를 하지 않는 다면, 나중에는 리소스가 쌓여서 프로그램에 악영향을 미치게 될 것 입니다. 물론 간단한 프로그램은 괜찮겠지만 지속적인 추후 프로그래밍을 위해 생성된 오브잭트와 읽어드린 파일,생성한 힙 메모리 등은 당연히 해제를 해줘야 하는것이 좋은 습관이기 때문입니다. 그럼 OLD를 사용하는 이유에 대해서 알아보도록 하겠습니다. 1. 기존에 선택한 속성의 GDI 오브잭트는 선택된 상태에서 삭제가 되지 ..
그 동안 윈도우에 여러가지 그래픽을 출력할때 습관적으로 Old를 같이 써왔습니다.왜 Old를 같이 써야하는지... 이유도 모르고 말이죠...(적어도 지금까지의 저는 그랬습니다...)그래픽을 출력하는 함수와 순서 부분부터 OLD를 사용하는 부분까지 자세히 분석해보겠습니다. HDC hdc;PAINTSTRUCT ps;HBRUSH MyBrush , OldBrush; switch (iMessage){case WM_PAINT: {hdc = BeginPaint(hWnd , &ps); MyBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);OldBrush = (HBRUSH)SelectObject(hdc , MyBrush);Rectangle(hdc , 100 , 100, 200 , 200);Se..