//CMD대신에 WINDOW창을 이용한 헥사프로그램 응용
//CMD대신에 WINDOW창을 이용한 헥사프로그램 응용
//CMD대신에 WINDOW창을 이용한 헥사프로그램 응용
//CMD대신에 WINDOW창을 이용한 헥사프로그램 응용
//필요파일 1. mainsrc.c
//필요파일 2. wincommon.h
//필요파일 3. wincommon.c
//실행파일만드는 방법
//gcc -Wall -DTEST_PRINTF -c mainsrc.c
//gcc -Wall -DTEST_PRINTF -c wincommon.c
//gcc -o mainexe mainsrc.o wincommon.o -lm -lws2_32 -lgdi32
#include "wincommon.h"
char design[6][2+1];
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,
WPARAM wParam , LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
LPTSTR lpszCmdLine , int nCmdShow)
{
HWND hwnd;
MSG msg;
// 윈도우 클래스 생성
WNDCLASS WndClass; // 윈도우 클래스 타입인 WNDCLASSEX의 변수를 만들고 각 필드에 값 부여
WndClass.style = CS_HREDRAW | CS_VREDRAW; // 윈도우의 크기를 변경하면 다시 그리는 형태의 윈도우
WndClass.lpfnWndProc = WndProc; // WndProc은 메시지 처리를 위한 함수의 이름
WndClass.cbClsExtra = 0; // 보통 클래스와 운도우를 위한 여분의 메모리는 사용치 않는다.
WndClass.cbWndExtra = 0; // 그러므로 값을 0을 써준다.
WndClass.hInstance = hInstance; // 응용 프로그램 인스턴스를 WinMain()의 첫번째 매개변수로 넣어줌
WndClass.hIcon = LoadIcon(NULL , IDI_APPLICATION); // 로드하는 아이콘
WndClass.hCursor = LoadCursor(NULL , IDC_ARROW); // 로드하는 커서
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 흰색바탕(WHITE_BRUSH)의 윈도우를 생성한다.
WndClass.lpszMenuName = NULL; // 아직은 메뉴도 만들지 않고 사용치 않으므로 NULL이다.
WndClass.lpszClassName = "Window Class Name"; // 윈도우 클래스 이름을 "Window Class Name 라고 하였다.
RegisterClass(&WndClass); // 커널에 등록하기 위한 함수 사용방법은 매개변수로 WNDCLASSEX의
// 주소를 넣어주면 된다.
// 윈도우를 만드는 함수 CreateWindow()
hwnd = CreateWindow( // 윈도의 핸들값 반환
"Window Class Name", // 윈도우 클래스 이름
"Window Title Name", // 만들어질 윈도우 타이틀바에 나타날 이름
WS_OVERLAPPEDWINDOW, // 이미 정의된 스타일 값중 선택할수 있다. (WS_OVERLAPPEDWINDOW)는
// 타이틀바에 최소회 , 최대화 ,닫기 버튼이 나타나며 오른쪽 마우스 버튼을
// 눌렀을 때 시스템 메뉴가 나타나는 윈도우이다.
CW_USEDEFAULT, // 생성되는 윈도우가 어느 위치에 나타나야 하는지 x값과 y좌표값으로 써준다.
CW_USEDEFAULT, // CW_USEDEFAULT는 커널에 의해 기본값을 사용하라는 의미이다.
CW_USEDEFAULT, // 생성되는 윈도우의 폭과 높이 값으로 단위는 픽셀이다.
CW_USEDEFAULT, // CW_USEDEFAULT는 커널에 의해 기본값을 사용하라는 의미이다.
NULL,
NULL,
hInstance,
NULL
);
// 윈도우를 화면에 보여줌
ShowWindow(hwnd,nCmdShow); // nCmdShow는 윈도우를 화면에 나타내는 방법으로 상수값을 제공한다.
UpdateWindow(hwnd); // 윈도우에 WM_PAINT 메시지를 보내 화면에 기본 출력을 한다.
while(GetMessage(&msg , NULL , 0 , 0))
{
TranslateMessage(&msg); // 두 메시지를 하나로 변형할때 사용한다.
DispatchMessage(&msg); // 메시지를 처리하는 함수에 메시지를 보낸다.
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam , LPARAM lParam) // 이벤트 저장되는 곳
{
HDC hdc;
PAINTSTRUCT ps;
static int hexa[MAPY][MAPX];
static int __design[3];
static int xpos, ypos;
static int score;
static int screenxpos = 100;
static int screenypos = 100;
int i, k, j;
char rbuf[4096];
if(iMsg == WM_CREATE) /* 윈도우 생성시 */
{
init(hexa, &xpos, &ypos, __design);
score = 0;
InvalidateRect(hwnd,NULL,FALSE);
SetTimer(hwnd, 1, 300, NULL);
}
if(iMsg == WM_DESTROY) /* 윈도우 종료시 */
{
KillTimer(hwnd, 1);
PostQuitMessage(0); /* 강제 종료 */
}
if(iMsg == WM_DESTROY) /* 윈도우 종료시 */
{
KillTimer(hwnd, 1);
PostQuitMessage(0); /* 강제 종료 */
}
if(iMsg == WM_PAINT)
{
hdc=BeginPaint(hwnd, &ps);
for(i=0; i<MAPY; i++)
{
for(k=0; k<MAPX; k++)
{
if(hexa[i][k] == 10)
{
continue;
}
else if(hexa[i][k] == 0)
{
TextOut(hdc, screenxpos + 8 * 2 * k, screenypos + 8 * 2 * i, "□", 2);
}
else
{
TextOut(hdc, screenxpos + 8 * 2 * k, screenypos + 8 * 2 * i, design[ hexa[i][k] ], 2);
}
}
}
EndPaint(hwnd, &ps);
}
if(iMsg == WM_TIMER)
{
k = f_downkey(hexa, &xpos, &ypos, __design);
if(k==0)
{
if(ypos == 0)
{
KillTimer(hwnd, 1);
sprintf(rbuf, "------------------------------------------------------------\n"
"HI!, THIS IS TETTRIS GAME MESSAGE BOX, NEXT TRY,,!!! \n"
"DTAE : PARK BYEONG SOOL(2016/12/06) \n"
"AUTHOR : PARK BYEONG SOOL \n"
"HISTORY : PARK BYEONG SOOL \n"
"SCAORE : %.3d \n"
"------------------------------------------------------------\n", score);
MessageBox(hwnd , rbuf,"TETTRIS CAPTION",MB_OK);
return 0;
}
else
{
while(1)
{
j=0;
if( f_check_horizontal(hexa, &score) == 0 ) j++;
if( f_check_vertical(hexa, &score) == 0 ) j++;
if( f_check_left_to_right(hexa, &score) == 0 ) j++;
if( f_check_right_to_left(hexa, &score) == 0 ) j++;
if(j == 4) break;
}
}
xpos = MAPX / 2;
ypos = 0;
__design[0] = 1 + ( rand() % 5 );
__design[1] = 1 + ( rand() % 5 );
__design[2] = 1 + ( rand() % 5 );
hexa[ypos+0][xpos] = __design[0];
hexa[ypos+1][xpos] = __design[1];
hexa[ypos+2][xpos] = __design[2];
}
InvalidateRect(hwnd,NULL,FALSE);
}
if(iMsg == WM_KEYDOWN)
{
switch(wParam)
{
case VK_ESCAPE:
KillTimer(hwnd, 1);
sprintf(rbuf, "------------------------------------------------------------\n"
"HI!, THIS IS TETTRIS GAME MESSAGE BOX, NEXT TRY,,!!! \n"
"DTAE : PARK BYEONG SOOL(2016/12/06) \n"
"AUTHOR : PARK BYEONG SOOL \n"
"HISTORY : PARK BYEONG SOOL \n"
"SCAORE : %.3d \n"
"------------------------------------------------------------\n", score);
MessageBox(hwnd , rbuf,"TETTRIS CAPTION",MB_OK);
return 0;
case VK_LEFT:
k = f_leftkey(hexa, &xpos, &ypos, __design);
break;
case VK_RIGHT:
k = f_rightkey(hexa, &xpos, &ypos, __design);
break;
case VK_DOWN:
k = f_downkey(hexa, &xpos, &ypos, __design);
break;
case VK_SPACE:
k = f_spacekey(hexa, &xpos, &ypos, __design);
break;
case VK_RETURN:
while(1)
{
k = f_downkey(hexa, &xpos, &ypos, __design);
if(k==0) break;
else InvalidateRect(hwnd,NULL,FALSE);
}
break;
}
InvalidateRect(hwnd,NULL,FALSE);
}
return DefWindowProc(hwnd,iMsg,wParam , lParam); /* 나머지는 커널이 처리하도록 메시지를 전달한다. */
}
'c 언어 > 중급과정' 카테고리의 다른 글
WINSOWS, WIN, HEXA프로그램(공통) (0) | 2019.10.31 |
---|---|
WINDOWS, WIN, HEXA프로그램(헤더) (0) | 2019.10.31 |
WINDOSW, CMD, HEXA프로그램(공통) (0) | 2019.10.31 |
WINDOWS, CMD, HEXA프로그램(메인소스) (0) | 2019.10.31 |
WINDOWS, CMD, HEXA프로그램(헤더) (0) | 2019.10.31 |