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, 0, 0)) //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));
}