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

2015.11.13_개인업무일지_[Win32API #2]_이량경

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

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


main.c


main2.c



<배경색 바꾸기>

WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);


<커서 바꾸기>

WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);


<윈도우의 타이틀 바꾸기>

- L을 반드시 붙여야 한다.


- 영어기준으로 아스키코드면 됫다. 다른나라에서 아스키 코드때문에 유니코스가생김.

- 2바이트 체제로 아스키코드도 포괄한다. 언어 최신일수록 유니코드로 처리한다.
- 옛날부터 시스템자체가 char에 맞춰져있다.
- Wchar 을 만들었다.
- " " 따옴표하면 아스키코드/ 유니코드냐 를 컴파일러가 단정지을수 없다. 윈32는 대체로Wchar에 맞춰져있다
- 일단 " " 하면 char로 인지해서 깨진다. L" "로 Wchar임을 명시한다.

✔ First
- Fi가 한문자 (1바이트여야 하는데 2바이트)
- strcpy 로 할때는 char로 인지하는데
- Win32API는 2바이트로 인지한다. : Wchar 로 인지하게 해달라 하는 것이 앞에 대문자L을 붙이는 것이다.

✔ 방식1)
- Fi, rs, t 3바이트로 인지한다
- Wchar로 인지하는게 앞에 L" "붙인 방식
* 가장 편한 방식

✔ 방식2). 
- TEXT ("First")

* 권장한다. 다른데서 호환성 문제가 안생긴다.

✔ 방식3)
- _T ("First")
- MFC 
- 실행이 안된다...

✔ 유니코드의 반대개념은 아스키코드가 아니고 멀티코드다
- 멀티코드 : 영어 처리할때 1바이트
- 한글 2바이트
- 유니코드 2바이트

<윈도우의 크기 바꾸기>


<실행박스 좌표 지정>

- 좌표에서 100을 0으로 바꾸면 위치는 화면의 가장 왼쪽 상단을 기준으로 실행창이 열린다.

- 100,100 위치점

   


<WS_OVERLAPPEDWINDOW>

- WS_OVERLAPPEDWINDOW 에는 모든게 define 되어있다.


- WS_OVERLAPPEDWINDOW 옵션을 잠시 끄고 아래 옵션을 추가해본다.

- 기본적으로 WS_CAPTION | WS_SYSMENU 옵션은 넣고 원하는 옵션을 추가하면 된다.



- 윈32시절부터 빌게이츠가 다만들어 놨다.(프로그램 끝판 대장)

- Vertical: 세로
- Horizon : 가로

✔ Device Context: DC
* ASM배울때 Context 구조체에 프로세스 상태 저장했었다.
- 장치의 상태를 저장하는 것. : 디바이스는 뭔지 알수없다. 
* 그래픽 상태를 읽어오는 함수가 있고, 읽어온것을 폐기하는 함수가 있다.

✔ 그래픽을 관장하는 장치 GDI
- 회사마다 성능이 다르다 - 그래픽 카드 (셀수없이 많다)

예를 들면) 그래픽 카드마다 게임을 만들수 없다. 예전에는 종류에 따라 다만들었다. 해상도가 맞지 않으면 다운이 안되는 이유. 이것을 극복한것이 게임을 자바로 만들면 가상머신에 맞게끔만 만들면 됨.
가상머신에 A폰을 심으면 가상머신이 화면해상도에 맞게 확대/축소. 게임회사는 게임을 한번만 만들어도 됨. 

* 자바 가상머신의 : 최고의 장점
* 위피 : 자바가상머신같은.. 지금은 사용안한다. 지금은 안드로이드.

최대의 단점 : 모든 기기에 최적화 하지 못한다
- 가로1000에 맞췄는데 폰이 2000이면 화면이 계단현상이 일어난다. 
- 확대하면 디지털이 깨진다. 확대하면 아날로그는 연해진다.
***
아이폰은 모두 C로 개발한다. 아이폰은 그래픽을 (UI작업) 모델 별에 맞게 다 만든다. 최적화가 잘되어있다.

✔ DC의 필요성
- 선을 긋기위해 많은 정보가 필요하다. 그리라고 하면 만들어둔 정보를 가져와서 그리면 된다.
- 색깔을 바꾼다면 정보 중에 색이 들어간 부분을 바꾸면 된다.

<정의 해두고 해당항목만 변경해서 사용.>

- 윈도우 한테 그리기 정보를 가져온다. (다 만들어둿다) 바꾸지 않으면 기본적으로 그려진다.
- 화면에 글자 그림을 그리는것이 부담간다 겹쳐져서 안보이는부분은 안그린다.
- 창을 다시 클릭하면 가려진부분만 그린다.

✔ WndProc 업그레이드하는게 윈도우 짜는것

<문자열 출력>
- 마우스 왼쪽 버튼 입력시 문자 출력

- case 문에서 R을 붙여주면 마우스 오른쪽 버튼 입력시 문자 출력


✔  마우스는 아무것도 안하는 상태 -> 문자출력시 상태를 지정하면된다.
- 누르는 순간의 상태 
- 누르고있는 상태
- 눌렀다가 뗄때 상태

* DC 디바이스 상태를 읽어오는것 장치를 획득해서 변수에 넣음. 잊어버리지 않기 위한 변수가 된다.



- 구조체다.F12 타고 가면 구조체를 확인할수 있다.(있다는 것을 알면된다.)

✔ GetDC 와 releaseDC와 셋트 메뉴다. 이사이에서 HDC를 그린다.
- TEXTOUT 그리는것.
- 첫번째 인자 hdc 때문에 getDC가 필요하다.
- 문자 100,100 내부에서의 위치 : 창기준이다. 창내부에서 컨텍스트를 할당(bar는 기준점 제외)



✔ 마지막 인자 숫자 15 : 문자열 길이
- 한글 4글자면 4다 (용량을 말하는게 아니고 글자 갯수를 친다)
- 이미 L" "으로 2바이트로 셋해두었다. 


✔ strlen : 글자 갯수 반환 
* Dos에서 안녕하세요 11 
✔ PAINT(화면에 글자를 그리는 함수)



- 글자를 그래픽처럼 그린다.
- 창이 뜰때 그림을 다시 그리기 때문에 창을 최소화했다가 다시 열면 문자가 안보인다.
- 화면에만 떠있을뿐 기록되어있는게 아니다. 캔버스 
- 지우개 처럼 지워진다. 창의 크기를 바꿔도 지워진다.

- 내부적으로 PAINT가 호출된다: 윈도우로부터 PAINT가 호출된다. PAINT를 처리하는 부분을 변경하면 됨)


...예전에는 다른창이 올라와도 지워졌다.

- PAINT 자주 호출된다. : 빨리 처리해야 되서 

- HDC에서는 PAINT를 써야한다.



<SetTextAlign>



<DrawText>
- TextOut보다 조금 더 복잡한 (기능이 많은) 문자열 출력 함수
- int 형 4개 가 들어있다. 이구조체에서 인자를 넘김. 윈도우에서는 RECT구조체를 사용한다. 




 코드상 char str[]=char *str = 로 변경 또는

Property에서 멀티코드로 옵션 변경



 3.3 - 가. 그래픽 출력




 컴파일 할때 IvalidateRect 라이브러리 붙여 컴파일
- 도스에서는 라이브러리를 사용할건지 직접 넣는 다. 쉬운방법 
- 컴파일할때 옵션을 주는 방법.

3-3- 다. 메시지 버프 소리도 낼수 있다.


양자컴퓨터 : 내부 전기상태 4가지.
우리는 2진법 0n off뿐인데
양자 컴퓨터는 중간단계가 있다. - 폰노이만 구조다.

포커스 : 창이 초점을 가진다

 len : 일반 문자열
- 지역변수일경우 : 한글자씩만 입력된다 그래서 static 으로 정적변수로만듬.

static WCHAR str[256];
  int len;
  switch (iMessage) 
  {
    case WM_CHAR:
      len = lstrlen(str);
      str[len] = (WCHAR)wParam;
      str[len + 1= 0;
      InvalidateRect(hWnd, NULL, FALSE);
      return 0;
  }

 키를 누르면 WM_CHAR발생함.
- 창이 내려갔다가 올라오면 글자가 지워짐. 아스키코드는 wParam 으로 전달된다.
- 마우스일경우 x,y 좌표 들어감.

- 이것을 버퍼에 쌓으면 글자가 들어가서 출력되니 화면에 적는 것처럼 보이지만 static변수에 적고 있는것.
- 아스키 코드만 오는게 아니고 정보는 꽤 많다.

- lParam : long
- WParam : word

 InvalidateRect 무효화 영역 - 겹쳐서 안보이는 영역

 validate 유효화 영역 - 겹쳤다가 치웠을때 다시 그리는 영역

* 게임 만들때 사용
- 호랑이가 있다 옆으로 간다.지나간자리는 배경으로 다시그려야 한다.호랑이가 있는 자리는 무효화 영역. 
- 뭔가 지나가면 무효화가 발생하고 WM_Paint발생(윈도우가 넣어준다). 
- 단, 마우스 커서는 WM_Paint를 발생시키지 않는다.
- 창을 잡고 흔들면 CPU사용량이 올라간다.

* 윈도우에서 무효화 처리를 할때 윈도우가 하는데 우리가 내부적으로 WM_PAINT 를 만들방법은 InvalidateRect 함수를 사용하는 수밖에 없다..

* 0을 넣고 게임이 움직이면 눈으로 보인다. 눈에 안보이게 할려면 2개를 그린다.
- 호랑이가 있던 영역 호랑이가 이동한 영역. 
- 게임오류가 발생하면 케릭터가 사각으로 보이는 현상. 
- rect구조체에 좌표 위치 0.0 , 1.1 을 넣어줘야 한다.

 TRUE 는 배경을 지우고 다시 그림 
- 창에 문자를 입력하고 '스페이스바'를 입력하면 문자열이 지워진다.

 FALSE 배경을 지우지 않은채 다시 그림
- 창에 문자를 입력하고 '스페이스바'를 입력하면 입력했던 문자첫번째부터 덮어 써진다.
case WM_CHAR:
      if ((TCHAR)wParam == 32)
      {
        str[0= 0;
      }
      else
      {
        len = lstrlen(str);
        str[len] = (WCHAR)wParam;
        str[len + 1= 0;
      }
      InvalidateRect(hWnd, NULL, TRUE);
      // 윈도우한테 나를 한번 더 그려 달라고 메시지(WM_PAINT)를 보냄
      return 0;

✔ WM_KEYDOWN
* WM_KEYDOWN 메시지는 wParam 에 문자 코드가 아닌 가상 키코드를 전달.
-가상키코드: 시스템에 장착된 키보드의 종류에 상관없이 키를 입력받기 위해 만들어진 코드값.

- 글자입력 WM_CHAR

* 가상키코드
- wparma을 타고 vk_ 키가 눌려졌다는 메시지가 오는것 


<A를 화면에서 상하 좌우로 이동 하는 예제>

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  static int x = 100;
  static int y = 100;
  switch (iMessage)
  {
  case WM_KEYDOWN :
    switch (wParam)
    {
      
      case VK_LEFT:
        if (8 > x)
        {
          x = 0;
          break;
        }
        x = x - 8;
        break;
      case VK_RIGHT:
        x = x + 8;
        break;
      case VK_UP:
        if (8 > y)
        {
          y = 0;
          break;
        }
        y = y - 8;
        break;
      case VK_DOWN:
        y = y + 8;
        break;
    }
    InvalidateRect(hWnd, NULL, TRUE);
    return 0;
  
  case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    TextOut(hdc, x, y, "A"1);
    EndPaint(hWnd, &ps);
    return 0;
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  }
  return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}





728x90