// Hello.cpp
//
// 간단한 메시지를 화면에 출력하는 프로그램입니다.
#include <windows.h> // 윈도우즈 프로그램을 작성하는데 필요한 구조체,
// 각종 API 함수, 매크로, 메시지 등이 선언된 헤더 파일로
// 윈도우즈 프로그램에 반드시 포함해야 합니다.
#include <time.h>
#include "resource.h"
////////////// 윈도우 프로시져 선언 /////////////////////////////////////
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MakeProc(HWND, UINT, WPARAM, LPARAM);
void F_suk(); //석는 함수
HINSTANCE hInst;
HWND hWnd_Make;
int Show;
struct
{
int num; //짝이맞는 그림숫자 2개씩있음
int value; //그림의 상태를 나타내는 값
int x;
int y;
} Pic[25], temp; //그림 봐꿔줄때의 변수
// 윈도우 프로시져(Window Procedure)에 대한 선언
// WinMain() : 윈도우즈 어플리케이션의 진입점(entry point)
// 여기서 프로그램이 시작한다.
// 콘솔기반 C프로그램의 main()에 해당한다.
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
Show = nCmdShow; //차일드 윈도우를 보여주기 위한 상태값
static char szClassName[] = "그림맞추기"; // 윈도우 클래스 이름
static char szTitle[] = "그림맞추기"; // 타이틀 바에 출력될 문자열
MSG msg; // 메시지 구조체
HWND hWnd; // 윈도우 핸들
WNDCLASSEX wc; // 윈도우클래스 구조체
hInst = hInstance;
//////////////////// (1) 윈도우클래스 구조체에 값을 지정한다. ////////////////////
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW; // 클래스 스타일
// 윈도우 프로시져를 윈도우클래스 구조체에 등록
wc.lpfnWndProc = WndProc; // 윈도우 프로시저 지정
wc.cbClsExtra = 0; // 윈도우클래스 데이터 영역
wc.cbWndExtra = 0; // 윈도우의 데이터 영역
wc.hInstance = hInstance; // 인스턴스 핸들
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); // 아이콘 핸들
wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1)); // 사용할 커서 핸들
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 바탕색 브러쉬 핸들
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); // 메뉴 이름
wc.lpszClassName = szClassName; // 윈도우 클래스 이름
wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
///////////////////// (2) 윈도우 클래스를 등록한다. //////////////////////////////
RegisterClassEx(&wc); // 윈도우 클래스를 등록
//차일드 윈도우
wc.lpfnWndProc = MakeProc;
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wc.lpszClassName = "Make";
wc.lpszMenuName = NULL;
RegisterClassEx(&wc);
///////////////////// (3) 프레임 윈도우를 생성한다. //////////////////////////////
hWnd = CreateWindow(
szClassName, // 윈도우 클래스 이름
szTitle, // 타이틀 바에 출력될 문자열
WS_OVERLAPPEDWINDOW, // 윈도우 스타일
CW_USEDEFAULT, // 윈도우의 좌측 상단의 X좌표
CW_USEDEFAULT, // 윈도우의 좌측 상단의 Y좌표
420, // 윈도우의 폭
370, // 윈도우의 높이
NULL, // 부모 윈도우의 핸들
NULL, // 메뉴 혹은 자식 윈도우의 식별자
hInstance, // 윈도우를 생성한 인스턴스 핸들
NULL // CREATESTRUCT 구조체를 통해 전달되는 값
);
if (!hWnd) // 윈도우 생성에 실패하면
return(FALSE); // 프로그램을 종료한다.
////////////////////// (4) 프레임 윈도우를 화면에 나타낸다.////////////////////////
ShowWindow(hWnd, nCmdShow); // 윈도우를 화면에 나타낸다.
UpdateWindow(hWnd); // 윈도우의 클라이언트 영역을 칠합니다.
/////// (5) 메시지 루프:루프를 돌며 메시지 큐로 부터 메시지를 얻어와 처리한다.//////
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); // 키보드 메시지를 번역
DispatchMessage(&msg); // 메시지를 해당 윈도우 프로시져로 보낸다.
}
return msg.wParam;
}
/////////////////////// 윈도우 프로시져 (Window Procedure) //////////////////////////
//////////////// 윈도우 프로시져함수의 정의부분 ///////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc, MemDC;
static int tim, red;
PAINTSTRUCT ps;
HBITMAP NewBitmap, OldBitmap;
static char str[30],temp[50];
static int width = 41, height = 64;
static int button = 0, swit = 0; //버튼은 클릭상태를 나타내는것 swit는 누를때 2번기회를 나타내는 것
static int compare[2][2]; // 그림이 같은가 안 같은가를 비교..
// [swit][0] --> 그림의 짝이 맞는 숫자
// [swit][1] --> 그림의 위치 번호
static int count = 0, clear; // count는 클릭한 횟수, clear는 짝이 맞은 횟수
static int i, j, k;
static POINT point;
switch (uMsg) {
case WM_CREATE:
SetTimer(hWnd, 1, 1000, NULL); // 셋 타이머 함수
SetTimer(hWnd, 2, 300000, NULL);
srand((unsigned)time(NULL)); // 랜덤 함수의 시간에 따른 랜덤화
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
for (k = 0; k< 2; k++)
{
Pic[(i * 4 + j) * 2 + k].num = i * 4 + j + 1;
Pic[(i * 4 + j) * 2 + k].x = j * width;
Pic[(i * 4 + j) * 2 + k].y = i * height;
Pic[(i * 4 + j) * 2 + k].value = 0;
}
}
}
Pic[24].num = 25, Pic[24].x = 0, Pic[24].y = 3 * height;
F_suk();
break;
case WM_TIMER:
swicth(wParam) {
case 1:
if (red > 255) red = 255;
wsprintf(temp, "현재경과시간은=%3d입니다.", tim++);
hdc = GetDC(hWnd);
SetTextColor(hdc, RGB (red++, 0, 0));
TextOut(hdc, 20, 20, temp, strlen(temp));
ReleaseDC(hWne, hdc);
break;
case 2:
MessageBeep(MB_OK);
red = 0;
tim = 0;
break;
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MemDC = CreateCompatibleDC(hdc); //1
NewBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));//2
OldBitmap = (HBITMAP)SelectObject(MemDC, NewBitmap);//3
//x=bit.bmWidth; y=bit.bmHeight;
for (i = 0; i < 4; i++)
for (j = 0; j < 6; j++)
{
if (button)
{
if (j * 70 < point.x && i * 70 < point.y
&& j * 70 + width >= point.x && i * 70 + height >= point.y) // 마우스 포인터의 위치가 그림에 있냐?
{
compare[swit][0] = Pic[i * 6 + j].num;
compare[swit][1] = i * 6 + j;
swit++;
Pic[i * 6 + j].value = 1;
}
}
if (Pic[i * 6 + j].value) BitBlt(hdc, j * 70 + 10, i * 70 + 10, width + 1, height + 1, MemDC, Pic[i * 6 + j].x, Pic[i * 6 + j].y, SRCCOPY);
else BitBlt(hdc, j * 70 + 10, i * 70 + 10, width + 1, height + 1, MemDC, Pic[24].x, Pic[24].y, SRCCOPY);
}
button = 0;
if (swit == 2)
{
swit = 0;
if (compare[0][0] != compare[1][0]) // 전 그림과 지금 그림을 비교해서 맞지 않으면
{
Pic[compare[0][1]].value = 0; // 뒤집어버린다..
Pic[compare[1][1]].value = 0;
}
count++;
}
clear = 0;
for (i = 0; i<24; i++)
{
if (Pic[i].value == 1) clear++;
}
if (clear == 24)
{
if (count < 20) MessageBox(hWnd, "당신은 천재일지도.. ^_^", "클리어~!!", NULL);
else if (count < 30) MessageBox(hWnd, "참 잘했어요", "클리어~!!", NULL);
else if (count < 40) MessageBox(hWnd, "좀 더 분발하시길..", "클리어..", NULL);
else MessageBox(hWnd, "당신은 바보?? -_-;; ", "...", NULL);
PostQuitMessage(0);
}
wsprintf(str, "실행 횟수 : %d", count);
TextOut(hdc, 310, 300, str, strlen(str));
SelectObject(MemDC, OldBitmap);
DeleteObject(NewBitmap);
DeleteDC(MemDC);
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN:
button = 1;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
InvalidateRect(hWnd, NULL, FALSE);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_SUK:
F_suk();
count = 0;
swit = 0;
InvalidateRect(hWnd, NULL, FALSE);
break;
case ID_END:
MessageBox(hWnd, "다음에 봅시다 ^^;", "안녕~", NULL);
PostQuitMessage(0);
break;
case ID_MAKE:
hWnd_Make = CreateWindow("Make",
"만든이",
WS_OVERLAPPEDWINDOW,
200,
200,
200,
200,
hWnd,
NULL,
hInst,
NULL);
ShowWindow(hWnd_Make, Show);
break;
}
break;
case WM_DESTROY:
KillTimer(hWnd, 1);
KillTimer(hWnd, 2);// 프로그램에 종료 메시지가 온 경우
PostQuitMessage(0); // WM_CLOSE메시지를 발생시켜 메시지루프를 중단한다.
break;
default: // 처리하지 않은 메시지는
return DefWindowProc(hWnd, uMsg, wParam, lParam);
// DefWindowProc()가 처리하도록 합니다.
}
return 0;
}
제가 그림맞추기 게임을 수정해보려고 원래 있던 소스에 이제 큰,작은 아이콘 마우스 커서 랑 타이머 기능을 추가 하려고했는데요
책에 있는데로 했는데 잘안되네요 .. 어느 부분이 문제인지 알수 있을까요 ?