//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); /* 나머지는 커널이 처리하도록 메시지를 전달한다. */

}

+ Recent posts