본문 바로가기
코스웨어/15년 스마트컨트롤러

2015.11.12_개인업무일지_[Win32API #1]_이량경

by 알 수 없는 사용자 2015. 11. 13.
728x90
반응형
<Win32API #1>✔ 

================================================================

http://www.soen.kr/


<기본형이다>
----------------------------------------------------------------
#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, 000)) {
    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,     // 윈도우 모양을 좌우한다.
                         /* 창의 크기를 좌우한다 */
CW_USEDEFAULT,           // X좌표 (원은 좌표 4개필요(가로크기, 세로크기, 반지름, 중심))
CW_USEDEFAULT,           // Y좌표
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