728x90
반응형
<기본형이다>
----------------------------------------------------------------
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = L"First";
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = 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)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, 0, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = L"First";
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = 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)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, 0, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
----------------------------------------------------------------
LRESULT long
CALLBACK
- 컴파일 하면 없어진다.콜백은 지워도 동작한다,
- 운영체제가 이함수를 호출한다. 우리가 내부적으로 호출하는게 아니다.
* 함수호출 규약
- 이함수의 호출방식은 cdecl /stdcall 를 적게끔해도었다.
WndProc
- 왼쪽값 (int 형이다) 윈도우 헤드에 디파인 되어있다. 반환값을 말함.
( Handler Window (번호라서 int), UINT
, Word Param <16bit당시 : 2byte를 뜻함>..unsgined int typedef 되어있다.
, Long (16bit당시 4byte) )
*인자값의 의미는 나중에 본다.
전역변수 global_handler instcane(자료형의 약자)
LPSTR long pointer string zero(널포인터) 문자열 포인터 변수 char *
APIENTRY 포인트(C아님)
- 컴파일하면 사라진다
- cdecl /std로 define 되어있을 것이다. 컴파일러한테 알린다.(stdcall 되어있다.)
(?, 사용안함. 전에 사용하던것이 남음
, 문자열 CmdParam 프로그램 실행할때 인자
, Show 창을 화면에 보일것인지 안보일것인지 )
MSG 메시지
WNDCLASS 구조체
- 찾아보면 struct로 되어있다 * 아주중요한 구조체다
g_hInst = hInstance
- 다른 함수가 hInstance 공유할수 있게 해준다.
*** 전역 변수에 WinMain의 첫번째 인자로 넣고 있는데 이것의 효과 - 전역변수로 처리함으로 공유하게 된다.***
- 전역변수의 공유가 끝나면 구조체에 값을 집어 넣는다.
- 이구조체는 윈도우 정보를 다 가지고 있다. 그러나 멤버 구조체들에 모두 쓰레기 값이 들어있다.
- 구조체를 모두 초기화 하고 있다.
hbrBackground 창에 대한 색
hCursor 커서 : 화살표 IDC_ARROW
hicon
- 예를 들면 메모장 맨위 아이콘 그림. (기본을 제공한다) IDI_APPLICATION
hInstance
- 이구조체 안에 윈도우의 첫번째 인자를 반드시 넣어주어야 한다.
- 넣으면 윈도우가 알아서 사용한다.
lpointer function WndProc = WndProc
- = 함수 주소를 넣는다
* 커서가 올라가는 것을 어플리케이션이 알수 있을까?
- 그림판은 커서가 올라와있는 것을 알고 있다.
- 운영체제가 알려준다->창들한테 메시지를 보낸다
- 메시지를 받아야 한다. 이구조체에 운영체제가 메시지를 받을 함수의 이름을 기재해놓은 것이다.
- 함수의 원형을 위에 써놓은 이유가 여기서 사용하기 위함.
lpszClassName = lpszClass
- 실행중인 덩어리를 클레스라고 하는데 창이 클래스를 구분한다.
- 클래스의 소속을 구분하기 위함. 이클래스는 First가 된다.
* 찾기 : 메모장 것
* 모달리스 : 뒤에가 클릭되면 무슨창 - 이것은 메모장의 클래스
lpszMenuName
- 창을 만들면 메뉴가 있다. 메뉴이름 추가
style 윈도우 가로세로 크기를 바꾸는 것이 가능한것.
RegisterClass
- 이것을 등록하는 것이 registerClass다. 이 구조체를 윈도우한테 이대로 등록해
- 셋팅한 구조체는 등록하면 쓸모가 없다.
hWnd=CreateWindow(
lpszClass, // 클래스?
lpszClass, // 창제목 (메모장 실행하면 메모장 적힌것)
WS_OVERLAPPEDWINDOW, // 윈도우 모양을 좌우한다.
lpszClass, // 클래스?
lpszClass, // 창제목 (메모장 실행하면 메모장 적힌것)
WS_OVERLAPPEDWINDOW, // 윈도우 모양을 좌우한다.
/* 창의 크기를 좌우한다 */
CW_USEDEFAULT, // X좌표 (원은 좌표 4개필요(가로크기, 세로크기, 반지름, 중심))
CW_USEDEFAULT, // Y좌표
CW_USEDEFAULT, // 가로크기
CW_USEDEFAULT, // 세로크기
NULL,
(HMENU)NULL, // 메뉴
hInstace,
NULL );
CW_USEDEFAULT, // 가로크기
CW_USEDEFAULT, // 세로크기
NULL,
(HMENU)NULL, // 메뉴
hInstace,
NULL );
ShowWindow ( hWnd, nCmdShow )
- 두번째 인자가 WinMain의 4번째 인자 : false 를 넣으면 창이 안보인다.
- WinMain의 4번째 인자와 연결시켜 놔서 결정은 윈도우가 한다.
* 잘못하면 이것은 실행창이 안뜬다. 의도적으로 숨기고자 할때 사용?
* 도스창이 닫힌채로 실행중이다..
창이 생성되고 움직임에 대한 처리
while 안끝나게 하는게 의무이다.
GetMessage
* 윈도우가 보내는 메시지를 받는 함수
- 그러나 초고속으로 while문이 돌고있다. 다시말해 윈도우가 초고속으로 메시지를 보내고있음.
- 숫자가 바뀜 = 움직인다 = 메시지가 바바받 오고있다.
* 원형큐 = 메시지 큐 라고 한다 (모양을 원형으로 가짐)
- 포스트 잇(메시지)을 붙인다. 초고속으로 붙인다. 메시지를 다 처리하기전에 다붙이고 덮어쓰고 있다.
- 처리못한 부분은 버려진다 = 일반운영체제 - 범용 * 가장 최근것이 중요하다.
* 메시지 가장 오래된것을 처리한다.
- 원형 연결리스트... 인것이다. 끝을 만나면 시작과 연결
(&Message , // 전달된 메시지를 놔두는 위치
TranslateMessage(&Message) // 키보드 입력 처리, 윈도우 내부함수가있어 1차로 넣어준다
dispatchMessage(&Message) // 윈도우 처리하고 남는 쓰레기를 넘기는 함수.
- 메시지 : 운영체제가 거르고 > 애플리케이션에 전달 : callback (밑에 WndProc이 호출)
- int APIENTRY WinMain(위) : 모양을 어캐 만들지 껍데기
WndProc
- LRESULT CALLBACK WndProc(아래) : 실제 핵심이다. 일은 무엇을 할지 여기서 결정 한다.
switch(메시지 번호)
DESTROY : 창을 닫으라
- 0메시지를 발생시키고 100메시지를 다시 자신에게 보낸다.
(내가 내한테 보내는 메시지?)getMessage 에 0이 전달되고 창이 닫힌다.
* x를 눌렸다는 WM(WindowMessage define 값이다.)_DESTROY
- 에 의해 윈도우에 새로운 큐를 만든다.
- 이 처리를 해주지 않으면 동적할당 해제도 없이 그냥 종료 된것.
* free할 시간을 버는 것. 창닫는것 메시지로 처리하게 만듬.
- DESTROY가 처리할것 말고는 윈도우한데 다시 보내버린다.
return 0 조건을 사용하는데 닫기가 0이면 while 종료.
return Message.wParam 정상종료인지 윈도우에 남는다.
return(DefWindowProc(hWnd, iMessage, wParam, lParam))
* RTOS : 저명령을 반드시 처리. 실시간으로 큐를 처리해야 한다.!(미사일 추적) - 특수용
큐 : FIFO
스택 : FILO
728x90
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151112 윤재희 API #1 WinAPI 기본형 코드 (4) | 2015.11.13 |
---|---|
2015-11-12 Win32 API 개인 업무일지 - 천정호 (6) | 2015.11.13 |
20151112_주재민_API_01 (4) | 2015.11.13 |
20151112_임현수_업무일지_WIN32API#1 (6) | 2015.11.13 |
20151112_안향진_API_01 (5) | 2015.11.13 |
20151112-김재홍-win32API_1일차-첫번째예제 (3) | 2015.11.13 |
20151112 - WinAPI 첫시간 일지 엄민웅 (5) | 2015.11.13 |
20151112_박서연_WinAPI_1 (4) | 2015.11.12 |