프로그래밍 관련/Win API

이번에는 비트맵에 알파 블랜딩(투명)을 하는법에 대해서 알아보겠습니다. AlphaBlend함수가 있지만 Gdi32.lib 파일을 포함시켜야만 하는데, 윈도우 2000 이상부터는 GdiAlphaBlend함수를 사용하여, 동일한 기능을 할 수 있습니다. (해당 기능의 헤더 파일은 WinGdi.h (include Windows.h)) GdiAlphaBlend : 투명 또는 반투명 픽셀 비트맵을 표시합니다. - 해당 함수의 기능은 AlphaBlend와 완전히 같습니다. BOOL GdiAlphaBlend( _In_ HDC hdcDest, _In_ int xoriginDest, _In_ int yoriginDest, _In_ int wDest, _In_ int hDest, _In_ HDC hdcSrc, _In_ i..
기존에 비트맵을 단순 출력하는것에서 추가적인 효과를 주는법에 대해서 알아보도록 하겠습니다. 기본적으로 WINAPI에서 비트맵을 출력할때는 사각형 모양으로 밖에 출력되지 않습니다. 물론 흰색 바탕에 흰색배경이 있는 이미지라면 상관 없겠지만 다른 색상일 경우 위와 같이 사각형의 테두리가 발생되기 마련입니다. 위에 깜찍한 무지가 있지만 이 무지의 주변에 보라색만 제거하고 싶을때 어떻게 해야할까요? TransparentBlt 함수가 있지만 Gdi32.lib 파일을 포함시켜야만 하는데, 윈도우 2000 이상부터는 GdiTransparentBlt 함수를 사용하여, 동일한 기능을 할 수 있습니다.(해당 기능의 헤더 파일은 WinGdi.h (include Windows.h)) GdiTransparentBlt : 특정 ..
그 동안 X,Y 좌표로 이루어진 2차원 평면 공간에 이미지나 텍스트들을 출력해 왔습니다. WIn API에서는 4가지의 좌표 공간을 제공합니다. 월드 공간(논리 좌표를 사용하는 큰 공간) -> 페이지 공간 (논리 좌표) -> 디바이스 공간 (물리 좌표) -> 물리 장치(프린터 등등) 페이지 공간과 디바이스 공간에 대해서는 이전 시간에 맵핑을 하였기 때문에 생략하도록 하고, 이번 시간에는 월드 공간에서 페이지 공간으로 맵핑을 하도록 하겠습니다. 월드 공간은 디폴트로 사용되어 지지 않으며, 그래픽 모드를 변경하여 사용합니다. 이전에 사용했던 페이지 공간에서 디바이스 공간으로의 맵핑 만 사용해도 원점의 이동으로 화면 이동을 쉽게 구현 할 수 있습니다. 다만, 월드 좌표를 변환하게 되면 페이지 공간 자체를 변경하..
이전 시간에는 윈도우 좌표체계에 대해서 공부해봤습니다. 이번 시간에는 화면에 표시되는 논리좌표(윈도우가 표시되는 좌표)와 물리좌표(화면에 보이는 영역)을 맵핑하는 방법에 대해서 알아보겠습니다. 먼저 사각형을 그리도록 하겠습니다. [결과] 예상했던것과 같이 나란히 사각형이 그려졌습니다. 단 , -100 , -100 , 0 , 0 의 그린 사각형의 경우 보이지 않습니다. 이제 우리는 이 부분에 대해서 설명할 수 있습니다. Rectangle함수를 통해 그리는 좌표는 논리 좌표(윈도우 좌표)이고, 화면상에 보이는 것은 물리 좌표(뷰 포트)의 영역이라는 것을 알 수 있습니다. 그럼 맵핑 함수를 통해 지금은 보이지 않는 사각형을 볼 수 있도록 해보겠습니다. 먼저 맵핑을 하는 함수에 대해서 알아보고 이후에 맵핑 모드..
기본적으로 윈도우는 점(픽셀)단위로 그래픽이 이루어집니다. 이 픽셀은 최소단위이며 다른 말로는 화소라고 할 수 있으며,(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 +..
QA Engineer  - P군
'프로그래밍 관련/Win API' 카테고리의 글 목록