게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
[본삭금] api 소스 관련 질문 드립니다 ..
게시물ID : programmer_14862짧은주소 복사하기
작성자 : 토왕
추천 : 0
조회수 : 726회
댓글수 : 1개
등록시간 : 2015/12/08 18:03:19
옵션
  • 본인삭제금지
 // 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;
}

제가 그림맞추기 게임을 수정해보려고 원래 있던 소스에 이제 큰,작은 아이콘  마우스 커서  랑 타이머 기능을 추가 하려고했는데요 
책에 있는데로 했는데  잘안되네요 ..  어느 부분이 문제인지 알수 있을까요 ? 
aaa.JPG
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호