API

*메세지 구동방식(이벤트 처리방식)
 -windows용 P/G의 명령문 처리방식

*이벤트
 -사용자가 어떤 처리를 위해 A/P에게 보내는 각종신호
  ( 이벤트발생 -> O/S -> A/P )

*메세지
 -사용자가 발생시킨 각종 신호를 표준화한 정보

*windows환경에서 main함수(WinMain)
 [형식]
 int    APIENTRY     WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
 리턴형 함수호출류약 함수명

*함수호출규약
 -함수호출시 미리 정의해 놓은 약속에 의해 호출하는 방식지정
 [종류]
----------------------------------------------------------------------
                 | __stdcall                   | __cdecl
======================================================================
  default        |Basic, pascal, windows       | C
----------------------------------------------------------------------
인수가매개변수에 |right->left                  | right->left 
전달하는 순서    |                             |
----------------------------------------------------------------------
매개변수의       |호출받는함수                 | 호출하는함수
메모리해제       |                             |
----------------------------------------------------------------------

 __stdcall과 같은 define값들 : WINAPI, APIENTRY 등등~

*핸들값(H가 앞에 붙은 클래스?)
 -windows용 p/g에서 구성요소중 무언가를 구분하기위해 
  o/s가붙여 놓은 정수형 번호(식별번호)
 -각 요소를 접근,제어할때 핸들값을 이용해 설정

*windows용 p/g의 기본 골력함수
----------------------------------------------------------------------
WinMain | p/g의 시작 p/g의 기본요소설정(윈도우 객체생서이/메세지루프)
----------------------------------------------------------------------
WndProc | 메세지 처리함수
        | 사용자가 발생시킨 이벤트에 따른 여러가지 설정
----------------------------------------------------------------------

*WinMain함수의 역할
 1.출력할 윈도우에 대한 속성지정
   (커서/배경색/아이콘/메세지처리함수/속성지정한 윈도우이름등등)
 2.윈도우 클래스 O/S에 등록
   register class(WndClass)
 3.등록한 클래스를 통해 메모리에 윈도우 생성
 4.메모리상에 설정된 윈도우 정보를 바탕으로 화면에 출력
 5.메세지루프
   사용자가 발생시킨 메세지를 순차적으로
   꺼내와서 메세지 처리함수에세 보낸다.
   (프로그램 종료할때까지)

 1.Brush생성
 2.생성한 Brush 정보를 O/S의 그리기 정보 구조체에 등록
 3.그리기
 4.원상복구
 5.사용자가 생성한 Brush정보 해제

----------------------------------------------------------------------

*리소스resource
 -프로그램의 구성요소중, 사용자가 직접 코딩한 데이터가 아닌
  그림형태로 제공되어 출력되는 데이터 요소
  (메뉴,아이콘,커서,문자열테이블,비트맵등등...)
 -resource script 기능을 이용하여 visual하게 편집, 생성한다.

*메뉴의 속성지정
 -선택된 메뉴에 대한 표시
 -DWORD CheckMenuItem(HMENU hmenu, 메뉴ID, 메뉴속성);

----------------------------------------------------------------------
*비트맵(bitmap)
 -작은 점들의 2차원 배열형식의 비트에 영상정보를 저장하고 있는것
 -이미지정보저장(픽셀당 표현할수있는 색상수, 이미지크기, 
                 해상도, 색상단면등등~)

 [비트맵출력]
 1.리소스파일추가
 -비트맵파일(insert/import) 256컬러초과는 편집안됨
 2.rc파일로부터 비트맵정보 읽어내기
 -HBITMAP LoadBitmap(HINSTANCE, "비트맵ID");
 3.메모리에 비트맵 정보 올리기
 -메모리에 DC설정(DC를 직접 생성)
 -HDC Create(CompatibleDc(HDC);
 -메모리에 지정 한 수와 DC와 똑같은 출격정도를 만드는 함수
 4.메모리DC가 비트맵정보 저장
 -SelectObject(메모리DC,비트맵핸들)
 5.bmp보여주기
 -메모리DC선택하고 있는 영상정보를 화면에 출력
  Bool BitBlt(출력할곳의 DC, x, y, width, hsight,
              출력할 데이터의 DC, x, y, 출력mode);
 6.생성한 DC정보 삭제
 -DeleteDC(HDC);
----------------------------------------------------------------------
*GDI객체의 정보 알아내기
 int GetObject(객체 핸들,저장할곳의크기,각객체별로저장할구조체번지);

*이미지크기변경(축소/확대)
 BOOL StrechBit(출력할 곳의 DC,x,y,w,h,출력할 곳의 데이터,x,y,w,h,출력모드);

*가상bitmap정보설정
 CreateCompatibleBitmap
 -해당DC와 호환되는(같은출력정보) 비트맵 영역을 메모리에 만드는 함수
----------------------------------------------------------------------
폰트(FONT)
 -같은 활자체, 크기, 장식, 굵기를 갖는 글자들의 모임
 -폰트객체를 이용하여 사용자가 지정한 논리적인 폰트 설정

 [폰트종류]
 래스트폰트  :비트맵 형태로 표현
 벡터  폰트  :선분 ..
 투루타입폰트:선분 + 곡선 ..

 [폰트객체생성]
 HFONT CreateFont(14개인수);
 *논리폰트 : 사용자가 정의한 폰트
 *물리폰트 : system에 설치된 폰트
 -사용자가 논리적인 폰트를 지정하면 폰트매퍼는 물리적인 폰트중에
  가장 비슷한 형태의 폰트 출력

 HFONT CreateFontIndirect(LPLOGFONT);
 -폰트의 속성을 한꺼번에 기억할수 있는 LOGFONT 구조체에 값을 
  지정한 후에 , 폰트 객체 생성
----------------------------------------------------------------------
*컨트롤
 -사용자와의 특정 데이터를 주고 받을수 있는 인터페이스 도구
 -주로, 대화상자안에 위치하며, 한 화면에 여러개의 
  데이터를 동시에 입력받기 위해 사용
 -모양이나 동작방식이 정해져 있기때문에 OS에 의해 제공된다.
 -차일드윈도우
 [컨트롤생성]
 -HWND CreateWindow("botton","컨트롤안에 출력할 문자열",윈도우style+각컨트롤 style,
                    x,y,w,h, 부모윈도핸들,(HMENU)ID,g_hInst,NUll);
----------------------------------------------------------------------
 [관련메세지]
 WM_COMMAND
 -컨트롤에 사용자가 이벤트발생시 보내지는 메세지

 [메세지]
 -일반메세지
  :윈도우관련메세지(WS_ : 모든윈도우 관련 메시지)
  :특정컨트롤에만 발생시킬수 있는 메세지(BM_ :버튼용 ,EM_ ,CB_ :콤보박스등등)
 -사용자정의 메세지
  :사용자가 지정하여 사용할수 있는 메세지 
  :OS에서 설정한 메세지 값과 겹치면 안된다.
     WM_USER+ ? -_-;;;;;
 -통지메세지(notify message)
  :컨트롤에서 자신의 상태가 변경됐을때
   그 상태를 알리기 위해 부모윈도로 보내는 메세지
----------------------------------------------------------------------
*버튼메세지(부모윈도우 -> 버튼)
 -부모윈도우에서 버튼에게 메세지를 보내 이미 저장된 특정 동작을 수행하게끔 설정
 -OS에 등록된 윈도우(컨트롤)들은 각 동작 방식대로 이미 등록된 메시지 처리함수가 있다.
 -부모윈도에서 자식윈도에 명령설정시
  SendMessage()함수에 의해 메세지를 본낸다.
----------------------------------------------------------------------

*콤보박스
 -클래스명 : "combobox"
 -에디트+리스트box
 -style : CBS_SIMPLE       : 박스가 항상 펼쳐짐
          CBS_DROPDOWN     : 필요시 펼쳐짐
          CBS_DROPDOWNLIST : 입력불가, 필요시 펼쳐짐
 -리스트box에 설정한 메세지 똑같이 적용 CB_****
----------------------------------------------------------------------
*선택한 항목 넘기기
 1.선택한 항목의 index알아내기
  LB_GETSELCOUNT 선택한 항목의 총갯수 알아내기
  LB_GETSEEITEMS 다중선택리스트박스설정시 지정한(lParam) 정수형 배열에
                 선택한 항목의 index를 차례대로 기억시키는 메시지처리)
  LB_DELETESTRING 지정한 Index의 문자열 삭제할때 보내는 메세지
                 이때 리스트박스는 하나의 항목을 지우면 자동으로 밑에 항목이 
                 위로 땡겨진다. 따라서 여러개의 항목을 지울때는 뒤에서 부터 지운다.
                                                                      
----------------------------------------------------------------------
*대화상자(dialog)
 -팝업윈도우
 -컨트롤을 배치시켜 사용자로부터 데이터를 입력받거나
  데이터를 보여주기위해 설계된 윈도우
 -리소스 스크립트에 의해 디자인(리소스 자원)
 [대화상자 종류]
 
 -모달형(modal)
  :대화상자를 닫기전에는 다른메뉴 선택이나 명령문 처리를 할수 없는
   형태의 대화상자
   [생성]
   int DialogBox(HINSTANCE,"대화상자ID",소유윈도우핸들,메세지처리함수명);
   BOOL EndDialog(대화상자핸들,종료시 지정한 버튼 ID);
   -대화상자출력, 운영, 종료
   -enddiaog함수가 호출되어 종료시 지정한 ID값을 return해주면 종료.

  -모델리스형(modeless)
  :대화상자를 열어놓은 상태에서 다른메뉴 선택이나 명령문 처리를 할수 있는
   형태의 대화상자
  [모델리스대화상자]
  HWND CreateDialog(HINSTANCE,"대화상자ID", HWND, 대화상자프로시져)
  -지정한 대화상자 관련 정보를 메모리에 생성한 후 그 핸들을 return
  ShowWindow(HWND,보이기모드);
  BOOL DestroyWindow(HWND);


*대화상자프로시져
 -대화상자에서 발생하는 메세지 처리 함수
 [타입]
 BOOL CALLBACK 함수명(HWND, UINT, WPARAM, LPARAM);
 -사용자가 처리하면 return TRUE;
  사용자가 처리하지않으면 return FALSE; 
  이렇게 하면 OS가 알아서 처리
----------------------------------------------------------------------
*tab order 지정
 -tab key에 의해 입력받을 순서지정
 -첫번째 taborder를 갖는 컨트롤의 출력시 마우스 포커스를 갖는다.
 -layout메뉴 -> tab order(ctrl+D)

 [대화상자 컨트롤관한 통신관련함수]
 HWND GetDlgItem(HWND,ID);
 UINT GetDlgItemText(HWND,hDlg,ID, 저장할곳, 최대크기);
      SetDlgItemText
      GetDlgItemInt(HWND,ID,
                    BOOL *,         //사용자가 지정한 4번째 옵션이 맞는지틀린지여부
                                    //결과값체크할 변수의 주소지정
                    양수값체크유무);//
----------------------------------------------------------------------
*WM_INITDIALOG
 //다이얼로그 초기화 설정~!!!

*파일입출력작업
 [설정작업]
 -파일열기  c에서는 : FILE *fp=fopen("파일명","작업모드");      
          api에서는 : HANDLE CreateFile(~~~~~~~);

 -파일쓰기/읽기

*공통대화상자
 -사용자가 자주 사용되는 대화상자를 미리 만들어 OS차원에서 제공하는 대화상자
 -색상, 폰트, 프린터(인쇄), 파일열기/저장 (모달다이얼로그 란다.)
 -찾기/바꾸기 (모델리스)

*콤보box에 보여줄 파일명과 파일형식은 \0으로 구분해준다.
    "콤복박스에 출력할 문자\0*.txt"; <=이게 한쌍

----------------------------------------------------------------------
*스레드
 -하나의 P/G에서 작업단위별로 독립적으로 수행되도록 설정한 것.