'KOREA University/윈도우즈프로그래밍'에 해당되는 글 3건

  1. 2009.10.30 빈 칸에 체크하기 (오델로게임)
  2. 2009.10.09 원, 네모, 선 그리기
  3. 2009.09.18 Hello, Windows!
#include <windows.h>

#define DIVISIONS 5

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR  szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("Checker1") ;
     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 = szAppName ;
    
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("Program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName, TEXT ("Checker1 Mouse Hit-Test Demo"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
    
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
    
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static int  fState[DIVISIONS][DIVISIONS] ;
     static int  cxBlock, cyBlock, Counting ;
     HDC         hdc ;
     int         x, y ;
     PAINTSTRUCT ps ;
     RECT        rect ;
    
     switch (message)
     {

     case WM_SIZE :
          Counting = 3 ;
          cxBlock = LOWORD (lParam) / DIVISIONS ;
          cyBlock = HIWORD (lParam) / DIVISIONS ;
          return 0 ;
         
     case WM_LBUTTONDOWN :
          Counting++;
          x = LOWORD (lParam) / cxBlock ;
          y = HIWORD (lParam) / cyBlock ;
         
          if (x < DIVISIONS && y < DIVISIONS && !fState [x][y])
          {
               switch(Counting%2)
               {
               case 0 :
                   fState [x][y] ^= 1 ; break;
               case 1:
                   fState [x][y] ^= 2 ; break;
               }

               rect.left   = x * cxBlock ;
               rect.top    = y * cyBlock ;
               rect.right  = (x + 1) * cxBlock ;
               rect.bottom = (y + 1) * cyBlock ;
              
               InvalidateRect (hwnd, &rect, FALSE) ;
          }
          else
               MessageBeep (0) ;
          return 0 ;
         
     case WM_PAINT :
          hdc = BeginPaint (hwnd, &ps) ;
         
          for (x = 0 ; x < DIVISIONS ; x++)
          for (y = 0 ; y < DIVISIONS ; y++)
          {
               Rectangle (hdc, x * cxBlock, y * cyBlock,
                         (x + 1) * cxBlock, (y + 1) * cyBlock) ;
                   
               if (fState [x][y] == 1)
               {
                    MoveToEx (hdc,  x * cxBlock,  y * cyBlock, NULL) ;
                    LineTo   (hdc, (x+1) * cxBlock, (y+1) * cyBlock) ;
                    MoveToEx (hdc,  x * cxBlock, (y+1) * cyBlock, NULL) ;
                    LineTo   (hdc, (x+1) * cxBlock,  y * cyBlock) ;
               }
               if (fState [x][y] == 2)
               {
                    Ellipse (hdc, x * cxBlock, y * cyBlock,
                         (x + 1) * cxBlock, (y + 1) * cyBlock) ;
               }
          }
          EndPaint (hwnd, &ps) ;
          return 0 ;
              
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}



기존 소스는 동그라미만 그려진다.
이 소스가 오델로 게임의 베이스라나...뭐래나....

첫번째 수정은,
한번 그려진 네모칸에는 더이상 그려지지 않고

두번째 수정은,
한번은 동그라미, 한번은 엑스표가 그려지게 하였다.

칸수를 더 늘리고
엑스표를 검은색 동그라미로 바꾸고
오델로 규칙을 적용하면, 오델로 게임이 완성되겠지?
Posted by 정훈승



원, 네모, 선 그리기 과제입니다.
타입을 선택할 수 없으며, 순서대로 그려집니다.
스페이스를 누르면 초기화됩니다.

Counting이라는 변수를 스태틱으로 선언해주고 초기값을 3으로 줍니다.
마우스를 한번 누를때마다 Counting이 1씩 올라갑니다.
Counting++

Counting을 3으로 나눠준 몫의 나머지로 어떤 타입으로 그릴지 정해줍니다.
Switch(Counting%3)

0은 원, 1은 네모, 2는 선

참~~~ 쉽쬬잉
Posted by 정훈승
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
    MessageBox(NULL, TEXT("Hello, Windows!"), TEXT("First Message"), 0);
    return 0;
}


프로젝트 생성할때는 반드시 윈도우즈 응용프로그램(Windows 어플리캐이션)으로 해야한다. 1학년때 배우는 C 혹은 C++을 할때, 윈도우즈 콘솔로 프로젝트 생성하는게 버릇이 된사람은 주의를 하도록 하자. PC환경에 따라 상관없을 수도 있겠지만 정석대로 하는게 아무래도 좋지 아니한가
(비주얼6.0, 2005, 2008 상관없다)

가장 기초적인 윈도우즈 프로그래밍을 위한 소스다. 위 소스를 다 입력하면 메시지막스가 튀어나온다. 콘솔창에서만(도스창) 프로그래밍하다가 윈도우로 오면 느낌이 아주 신선하다.

마지막학기에 듣는 윈도우즈프로그래밍 수업이다.
어느정도 할 줄 안다고 자만하지 않고, 최선을 다하겠다. (사실 따지고보면 존나 허접)


교재는 찰스 페졸드의 Programming Windows (5th Edition) 이다. 존나 비싸고 존나 무겁다.
찰스페졸드라는 사람은 빌게이츠와 더불어 실질적인 윈도우즈 개발자라 한다.
실제 윈도우즈 만든 사람이 쓴 책이고, 거기다 출판사도 Microsoft 다. 이 두가지 사실만으로도 간지가 흐르지 아니한가
Posted by 정훈승