2010년/6월

5월 6일 C++(자동차) 윈도우즈API(틀)

뽀얀햄스터 2010. 5. 6. 11:09

자동차 상태 행동 구조체~!

리눅스에서 메뉴얼  man printf 하면 printf의 메뉴얼 볼수있다.

인터페이스에서 즉 함수들의 이름이 그 인자 값이 다 같은경우 구조적으로 동일해서

구조적 프로그램이라고 한다.

void Set_Color(car *)
void Set_Active(car *)
void Set_Handle(car *)
void Set_Emer(car *)
void state(car *)
void Set_cName(car *)
void Set_Price(car *)
void Set_vendor(car *)

저함수들의 이름들을 다 인터페이스라고 한다 그리고 인자값이 전부 car * 로 동일하다  이런경우 구조적 프로그래임이라고 한다.

자동차 car.c
#include "main.h"
char ACar_Color[COLOR_END][10]=
{
  "RED",
  "BLACK",
  "WHITE",
  "BLUE",
  "GRAY"

};
char ACar_Emer[Em_END][10]=
{
  "EON",
  "EOFF"
};
char ACar_Handle[Han_END][10]=
{
  "LEFT",
  "RIGHT",
  "CENTOR"
};
char ACar_Active[ACT_END][10]=
{
  "FORWARD",
  "BACKWARD",
  "STOP"
};
void Set_Color(struct car * obj)
{
    cout<<"컬러입력"<<endl;
  
    int icnt;
    for(icnt=RED;icnt<COLOR_END;++icnt)
    {  
      cout<<icnt+1<<"번은" <<ACar_Color[icnt]<<endl;
    }
    cin>>icnt;
    if(icnt>RED)
    {
      if(icnt<=COLOR_END)
      {
        (*obj).iColor=(Car_Color)(icnt-1);
      }
    }
    else
    {  
      cout<<"잘못입력하셨습니다"<<endl;
      Set_Color(obj);
    }  
  }
void Set_Active(struct car * obj)
{
  cout<<"동작입력"<<endl;
  int icnt;
  for(icnt=FORWARD;icnt<ACT_END;++icnt)
  {  
    cout<<icnt+1<<"번은" <<ACar_Active[icnt]<<endl;
  }
  cin>>icnt;
  if(icnt>FORWARD&&icnt<=ACT_END)
  {
    (*obj).Active=(Car_Active)(icnt-1);
  }
  else
  {
      cout<<"잘못입력하셨습니다"<<endl;
      Set_Active(obj);
  }  
}
void Set_Handle(struct car * obj)
{
  cout<<"회전입력"<<endl;
  
  int icnt;
  for(icnt=LEFT;icnt<Han_END;++icnt)
  {  
    cout<<icnt+1<<"번은" <<ACar_Handle[icnt]<<endl;
  }
  cin>>icnt;
  if(icnt>LEFT&&icnt<=Han_END)
  {
     (*obj).Handle=(Car_Handle)(icnt-1);
  }
  else
  {
    cout<<"잘못입력하셨습니다"<<endl;
    Set_Handle(obj);
  }
}
void Set_Emer(struct car * obj)
{
  cout<<"Emer"<<endl;
  
  int icnt;
  for(icnt=EON;icnt<Em_END;++icnt)
  {  
    cout<<icnt+1<<"번은" <<ACar_Emer[icnt]<<endl;
  }
  cin>>icnt;
  if(icnt>EON&&icnt<=Em_END)
  {
    (*obj).Emer=(Car_Emer)(icnt-1);
  }
  else
  {
    cout<<"잘못입력하셨습니다"<<endl;
    Set_Emer(obj);
  }

}
void Set_cName(struct car * obj)
{
  cout<<"자동차이름을 입력하세요"<<endl;
  cin>>(*obj).cName;


}
void Set_iPrice(struct car * obj)
{
  int icnt;
  cout<<"자동차가격을 입력하세요"<<endl;
  cin>>icnt;
  (*obj).iPrice=icnt;;

}
void Set_vendor(struct car * obj)
{
  cout<<"제조회사를 입력하세요"<<endl;
  cin>>(*obj).vendor;

}
void State(struct car *obj)
{
  cout<<endl;
  cout<<"자동차이름은:"<<(*obj).cName<<endl;
  cout<<"자동차가격은 :"<<(*obj).iPrice<<"원"<<endl;
  cout<<"자동차 색상은 :"<<ACar_Color[(*obj).iColor]<<endl;
  cout<<"자동차 동작은 :"<<ACar_Active[(*obj).Active]<<endl;
  cout<<"자동차 핸들회전은:"<<ACar_Handle[(*obj).Handle]<<endl;
  cout<<"자동차 Emer 은 :"<<ACar_Emer[(*obj).Emer]<<endl;
  cout<<"제조회사는 :"<<(*obj).vendor<<endl;
  cout<<endl;
}
void input_car(struct car *p)
{
  Set_cName(p);
  Set_iPrice(p);
  Set_vendor(p);
  Set_Color(p);
  Set_Active(p);
  Set_Handle(p);
  Set_Emer(p);
}
=============================================
============================================================
main.c
#include "main.h"
int main()
{
  car NewCar;
  input_car(&NewCar);  
  State(&NewCar);
  return 0;

}
===========================================
===========================================
main.h
#include<iostream>
using
 namespace std;
enum Car_Emer
{
  EON,
  EOFF,
  Em_END
};

enum Car_Handle
{
  LEFT,
  RIGHT,
  CENTOR,
  Han_END
};
enum Car_Color
{
  RED,
  BLACK,
  WHITE,
  BLUE,
  GRAY,
  COLOR_END
};
enum Car_Active
{
  FORWARD,
  BACKWARD,
  STOP,
  ACT_END
};
struct car
{
  char cName[20];  
  int iPrice;
    Car_Color iColor;
  char vendor[10];
  Car_Active Active;
  Car_Handle Handle;
  Car_Emer Emer;
};
void State(struct car *obj);
void input_car(struct car *p);
void Set_Color(struct car *obj);
void Set_Active(struct car *obj);
void Set_Handle(struct car *obj);
void Set_Emer(struct car *obj);
void Set_cName(struct car *obj);
void Set_iPrice(struct car *obj);
void Set_vendor(struct car *obj);
extern "C" char ACar_Color[COLOR_END][10];
extern "C" char ACar_Emer[Em_END][10];
extern "C" char ACar_Handle[Han_END][10];
extern "C" char ACAr_Active[ACT_END][10];


==========================================================
==========================================================
유니코드

char  => TCHAR
char* =>LPSTR
const char * =>LPCTSTR

클래스 정의
WNDCLASS
정의한 클래스 등록
Registerclass(&)
메모리에 윈도우 생성 hWnd=CreateWindow
보여주기 ShowWindow(hWnd,nCmdShow)

#include <windows.h> //API에 관한 함수들과 원형 사용하는 상수들이 정의되어있다.

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//메세지 처리함수 생성
HINSTANCE g_hInst;
//hInstance인수는 기억 부류가 지역변수이므로 전역변수 g_hInst에 대입함
LPCTSTR lpszClass = TEXT("First");
//윈도우 클래스를 정의하는데 사용하면 윈도우의 타이틀 바에 표시

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lPSZCmdParam, int nCmdShow)
//프로그램의 시작점인 main이 아니고 API는 WinMain 으로 시작한다.
//APIENTRY 지정자는 윈도우즈의 표준 호출 규약인 _stdcall을 사용한다는 뜻
//hInstance 프로그램의 인스턴스 핸들
//hPrevInstance 바로 앞에 실행 된 현재 프로그램의 인스턴스 핸들 없을경우 NULL이며 win32에서 항상 NULL이다
//16비트와의 호환성을 위해서만 존재하므로 신경(X)
//lpszCmdParam 명령행으로 입력된 프로그램인수 도스에서 argv[]인수에 해당하며 열 파일의 경로 전달
//nCmdShow 프로그램이 실행될 형태이며 최소화,보통 모양을 전달
{
 HWND hWnd; 
 MSG Message; //MSG 구조체 선언
 WNDCLASS WndClass; 
 //WNDCLASS구조체 선언
 
/*
 typedef struct tagWNDCLASSW {
    UINT        style;   윈도우의 스타일을정의한다.  어떤형태를 가질 것인가지정하는 멤버이며 
             CS_HREDRAW와 CS_VREDRAW이 두값을OR 연산로연결해서 사용  수직 수평크기가 변할경우 윈도우를 다시 그린다는 뜻
    WNDPROC     lpfnWndProc; 윈도우의 메시지 처리 함수를 지정함 메시지가 발생할때 마다 호출되어 WndProc함수가 처리하게 정해져있다.
    int         cbClsExtra;  
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
*/

 g_hInst = hInstance; //전역변수에 hInstance 선언.

 WndClass.cbClsExtra = 0;
 WndClass.cbWndExtra = 0;
 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 WndClass.hInstance = hInstance;
 WndClass.lpfnWndProc = WndProc;
 WndClass.lpszClassName = lpszClass;
 WndClass.lpszMenuName = NULL;
 WndClass.style = CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, (HMENU)NULL, hInstance, NULL);
 ShowWindow(hWnd,nCmdShow);

 while(GetMessage(&Message, NULL, 00)) //OS에서 들어오는 메세지를 처리하는 부분
 {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM IParam)
{
 switch (iMessage)
 {
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }

 return(DefWindowProc(hWnd, iMessage, wParam, IParam));
}