#include <windows.h>
#include <math.h>
#include "resource2.h"
#define WIDTH 1024
#define HEIGHT 768
#define X 20 //리소스의 좌표 X축 값
#define Y 20 //리소스의 좌표 Y축 값
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = "Window Class Name";
RegisterClass(&WndClass);
hwnd = CreateWindow( "Window Class Name",
"Window Title Name",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WIDTH,
HEIGHT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc, mem1dc, mem2dc;
PAINTSTRUCT ps;
static RECT rectView;
static HBITMAP hBit1, hBit2, oldBit1, oldBit2, c;
static int x[4], y[4], stepX, stepY, cnt, mx, my, Drag, dir[2], f, s;
unsigned long int i;
switch (iMsg)
{
case WM_CREATE:
hBit2 = LoadBitmap(((LPCREATESTRUCT)lParam) -> hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
c = LoadBitmap(((LPCREATESTRUCT)lParam) -> hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
x[0] = 100;
y[0] = 100;
x[1] = 800;
y[1] = 100;
x[2] = 800;
y[2] = 490;
x[3] = 101;
y[3] = 490;
stepX = 0;
stepY = 0;
Drag = 0;
cnt = 0;
mx = 0;
my = 0;
dir[0] = 0;
dir[1] = 0;
dir[2] = 0;
dir[3] = 0;
f = 4;
s = 0;
SetTimer(hwnd, 1, 100, NULL);
break;
case WM_LBUTTONDOWN:
s++;
s = s & 3;
mx = LOWORD(lParam);
my = HIWORD(lParam);
Drag = 1;
stepX = (x[0] - mx) / 12;
stepY = (y[0] - my) / 12;
if(abs(x[0] - mx) > abs(y[0] - my))
{
if((x[0] - mx) >= 0)
dir[0] = 1*f;
else
dir[0] = 3*f;
}
else if(abs(x[0] - mx) < abs(y[0] - my))
{
if((y[0] - my) >= 0)
dir[0] = 2*f;
else
dir[0] = 0*f;
}
hdc = GetDC(hwnd);
if(hBit1 == NULL)
hBit1 = CreateCompatibleBitmap(hdc, WIDTH, HEIGHT);
mem1dc = CreateCompatibleDC(hdc);
mem2dc = CreateCompatibleDC(mem1dc);
oldBit1 = (HBITMAP)SelectObject(mem1dc, hBit1);
oldBit2 = (HBITMAP)SelectObject(mem2dc, hBit2);
BitBlt(mem1dc, 0, 0, WIDTH, HEIGHT, mem2dc, 0, 0, SRCCOPY);
SelectObject(mem2dc, c);
BitBlt(mem1dc, 150, 150, 600, 250, mem2dc, 0, 392, SRCCOPY);
for(i = 0; i < 4; i++)
{
if(i)
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
else
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
}
SelectObject(mem2dc, oldBit2);
DeleteDC(mem2dc);
SelectObject(mem1dc, oldBit1);
DeleteDC(mem1dc);
ReleaseDC(hwnd, hdc);
InvalidateRgn(hwnd, NULL, TRUE);
cnt = 0;
break;
case WM_LBUTTONUP:
Drag = FALSE;
InvalidateRgn(hwnd, NULL, TRUE);
break;
case WM_MOUSEMOVE:
if(!Drag)
break;
s++;
s = s & 3;
mx = LOWORD(lParam);
my = HIWORD(lParam);
stepX = (x[0] - mx) / 12;
stepY = (y[0] - my) / 12;
if(abs(x[0] - mx) > abs(y[0] - my))
{
if((x[0] - mx) >= 0)
dir[0] = 1*f;
else
dir[0] = 3*f;
}
else if(abs(x[0] - mx) < abs(y[0] - my))
{
if((y[0] - my) >= 0)
dir[0] = 2*f;
else
dir[0] = 0*f;
}
hdc = GetDC(hwnd);
if(hBit1 == NULL)
hBit1 = CreateCompatibleBitmap(hdc, WIDTH, HEIGHT);
mem1dc = CreateCompatibleDC(hdc);
mem2dc = CreateCompatibleDC(mem1dc);
oldBit1 = (HBITMAP)SelectObject(mem1dc, hBit1);
oldBit2 = (HBITMAP)SelectObject(mem2dc, hBit2);
BitBlt(mem1dc, 0, 0, WIDTH, HEIGHT, mem2dc, 0, 0, SRCCOPY);
SelectObject(mem2dc, c);
BitBlt(mem1dc, 150, 150, 600, 250, mem2dc, 0, 392, SRCCOPY);
for(i = 0; i < 4; i++)
{
if(i)
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
else
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
}
SelectObject(mem2dc, oldBit2);
DeleteDC(mem2dc);
SelectObject(mem1dc, oldBit1);
DeleteDC(mem1dc);
ReleaseDC(hwnd, hdc);
cnt = 0;
InvalidateRgn(hwnd, NULL, TRUE);
break;
case WM_KEYDOWN:
s++;
s = s & 3;
switch(wParam)
{
case VK_LEFT:
x[0] -= 5;
dir[0] = 1*f;
if((x[0] < rectView.left) || ((y[0] > 200) && (y[0] < 500) && (x[0] < 850) && (x[0] > 150)))
x[0] += 5;
break;
case VK_RIGHT:
x[0] += 5;
dir[0] = 3*f;
if((x[0] > rectView.right - X) || ((y[0] > 200) && (y[0] < 500) && (x[0] < 850) && (x[0] > 150)))
x[0] -= 5;
break;
case VK_UP:
y[0] -= 5;
dir[0] = 2*f;
if((y[0] < rectView.top) || ((y[0] > 200) && (y[0] < 500) && (x[0] < 850) && (x[0] > 150)))
y[0] += 5;
break;
case VK_DOWN:
y[0] += 5;
dir[0] = 0*f;
if((y[0] > rectView.bottom - Y) || ((y[0] > 200) && (y[0] < 500) && (x[0] < 850) && (x[0] > 150)))
y[0] -= 5;
break;
}
hdc = GetDC(hwnd);
if(hBit1 == NULL)
hBit1 = CreateCompatibleBitmap(hdc, WIDTH, HEIGHT);
mem1dc = CreateCompatibleDC(hdc);
mem2dc = CreateCompatibleDC(mem1dc);
oldBit1 = (HBITMAP)SelectObject(mem1dc, hBit1);
oldBit2 = (HBITMAP)SelectObject(mem2dc, hBit2);
BitBlt(mem1dc, 0, 0, WIDTH, HEIGHT, mem2dc, 0, 0, SRCCOPY);
SelectObject(mem2dc, c);
BitBlt(mem1dc, 150, 150, 600, 250, mem2dc, 0, 392, SRCCOPY);
for(i = 0; i < 4; i++)
{
if(i)
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
else
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
}
SelectObject(mem2dc, oldBit2);
DeleteDC(mem2dc);
SelectObject(mem1dc, oldBit1);
DeleteDC(mem1dc);
ReleaseDC(hwnd, hdc);
InvalidateRgn(hwnd, NULL, TRUE);
break;
case WM_TIMER:
cnt++;
s++;
s = s & 3;
x[0] -= stepX;
y[0] -= stepY;
if((y[0] > 200) && (y[0] < 500) && (x[0] < 850) && (x[0] > 150))
{
x[0] += stepX;
y[0] += stepY;
stepX = 0;
stepY = 0;
cnt = 0;
}
for(i = 1; i < 4; i++)
{
if(abs(x[0] - x[i]) > abs(y[0] - y[i]))
{
if((x[0] - x[i]) >= 0)
{
x[i] += 7-i;
dir[i] = 3*f;
if((x[i] > rectView.right - X) || ((y[i] > 200) && (y[i] < 500) && (x[i] < 850) && (x[i] > 150)))
x[i] -= 7-i;
}
else
{
x[i] -= 7-i;
dir[i] = 1*f;
if((x[i] < rectView.left) || ((y[i] > 200) && (y[i] < 500) && (x[i] < 850) && (x[i] > 150)))
x[i] += 7-i;
}
}
else //if(abs(x[0] - x[i]) < abs(y[0] - y[i]))
{
if((y[0] - y[i]) >= 0)
{
y[i] += 7-i;
dir[i] = 0*f;
if((y[i] > rectView.bottom - Y) || ((y[i] > 200) && (y[i] < 500) && (x[i] < 850) && (x[i] > 150)))
y[i] -= 7-i;
}
else
{
y[i] -= 7-i;
dir[i] = 2*f;
if((y[i] < rectView.top) || ((y[i] > 200) && (y[i] < 500) && (x[i] < 850) && (x[i] > 150)))
y[i] += 7-i;
}
}
}
if(cnt == 12)
{
stepX = 0;
stepY = 0;
cnt = 0;
}
hdc = GetDC(hwnd);
if(hBit1 == NULL)
hBit1 = CreateCompatibleBitmap(hdc, WIDTH, HEIGHT);
mem1dc = CreateCompatibleDC(hdc);
mem2dc = CreateCompatibleDC(mem1dc);
oldBit1 = (HBITMAP)SelectObject(mem1dc, hBit1);
oldBit2 = (HBITMAP)SelectObject(mem2dc, hBit2);
BitBlt(mem1dc, 0, 0, WIDTH, HEIGHT, mem2dc, 0, 0, SRCCOPY);
SelectObject(mem2dc, c);
BitBlt(mem1dc, 150, 150, 600, 250, mem2dc, 0, 392, SRCCOPY);
for(i = 0; i < 4; i++)
{
if(i)
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
else
{
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2, SRCAND);
BitBlt(mem1dc, x[i], y[i], X, Y, mem2dc, (dir[i]+s)*X, Y*i*2+Y, SRCPAINT);
}
}
SelectObject(mem2dc, oldBit2);
DeleteDC(mem2dc);
SelectObject(mem1dc, oldBit1);
DeleteDC(mem1dc);
ReleaseDC(hwnd, hdc);
InvalidateRgn(hwnd, NULL, TRUE);
break;
case WM_PAINT:
GetClientRect(hwnd, &rectView);
hdc = BeginPaint(hwnd, &ps);
mem1dc = CreateCompatibleDC(hdc);
oldBit1 = (HBITMAP)SelectObject(mem1dc, hBit1);
BitBlt(hdc, 0, 0, WIDTH, HEIGHT, mem1dc, 0, 0, SRCCOPY);
SelectObject(mem1dc, oldBit1);
DeleteDC(mem1dc);
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
if(hBit1)
DeleteObject(hBit1);
DeleteObject(hBit2);
KillTimer(hwnd, 1);
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
어찌 하긴했는데 검은 바탕 화면에 잔상이 자꾸남아요 어디가 문제죠
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.