개발 일지/메이플 스토리

winapi 공부중 (hInstance랑 hWnd차이, GetDC랑 beginPaint차이

hackee 2017. 11. 23. 09:28

<171122>

 

wm_paint : 화면 가려졌으니 다시그려라.

DC : 화면 출력위해 꼭 필요

DC얻는 두가지 방법

#1. GetDC로 얻고  ReleaseDc로  해제하고.

HDC hdc;
hdc = GetDC(hWnd); // 해당 창에 대해 DC얻어와라

ReleaseDC(hWnd, hdc); // 해당창의 이 HDC반납

#2. WM_PAINT 메시지 루틴에서 사용

-GetDC대신  BeginPaint로 얻음.
핸들 해제할땐 EndPaint.


 


 

 

<171123>

 

#1.    hInstance랑 hWnd차이

 

 

 


 

#2. GetDC랑  BeginPaint() 차이.

 

 

 

 

 


 

 

 

winapi에서 게임루프를 만드려면 2가지중 택 [WinMain에서 GetMessage를 쓰냐  PeekMessage를 쓰냐에 따라 나뉨]

 

GetMessage 시  WM_TIMER이용해서  WM_PAINT에서 렌더.  WM_TIMER에서 업데이트 및 invalidRect로 WM_PAINT호출

PeekMessage시  해당 루프내에서 update랑 render.

 

 

 


#. 더블버퍼링

 

 

 


#픽셀과  창 사이즈의 개념

 

800 x 600 이라 했을때 만들어지는 윈도우 창 크기

 

  HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, 800, 600, nullptr, nullptr, hInstance, nullptr);

 

이때 만들어진 창 크기를 내가 임의로 늘릴수 있는데.

이 창 크기랑 픽셀과의 관계

 

윈도우 창 크기를 늘리면 픽셀수도 바뀌는건지.

픽셀수가 유지된다면  각 픽셀의 크기가 바뀌는건지..

 

px... 의 개념..

 

 

 

★ 일단  창 크기 세팅부터.

CreateWindow에  800,600넣어도  실제 작업영역 공간이 800,600이 아님.  

제목표시줄 높이랑,  양옆 테두리 길이 포함된게 800,600이여서.

 

http://blog.naver.com/PostView.nhn?blogId=gustncjswp95&logNo=150140369368

 

★ 작업영역 크기 설정

http://www.silverwolf.co.kr/cplusplus/4908

http://egloos.zum.com/maxtrain/v/2696881

 

 

AdjustWindowRect() /?

https://stackoverflow.com/questions/11783086/get-exact-window-region-size-createwindow-window-size-isnt-correct-size-of-wi

 

모니터 상 좌표 / 윈도우 창 좌표 / 클라이언트 영역

 

영역!????  종류가 있나봐.

클라이언트 영역 / 윈도우 영역 등등 알아보자

윈도우의 크기는 메뉴바와 클라이언트를 둘러싼 프레임 등을 포함한 크기를 말한다.

윈도우의 크기 중에서 실제로 사용자에게 콘텐츠를 제공하는 캔버스가 되는 영역은 클라이언트 영역이다. 하지만 원하는 클라이언트 크기로 윈도우를 생성하면 원하는 클라이언트 크기가 확보되지 않는다. 클라이언트를 둘러싼 녀석들이 있기 때문에...

이럴 때는 원하는 클라이언트 크기를 이용해서 윈도우의 크기를 계산해주는 함수 AdjustWindowRect()를 사용하면 된다.



출처: http://blackbags.tistory.com/entry/윈도우-크기-조절하기 [BB project]

 

 

★  GetWindowRect :  윈도우 화면 좌표값으로 위치정보 반환

★  GetClientRect : 윈도우 클라이언트 영역내에서 좌표값으로 반환.

http://ospace.tistory.com/29

 


# bitmap과 dc에 대한 개념 설명

 

 

DC는 스케치북이다.

 

화면에 보여지는 윈도우든,  종이에 출력하는 프린터든  스케치북을 갖고 있다.

우린 스케치북에 원하는걸 그리면,  윈도우는 스케치북에 그려진걸  윈도우에 뿌리든, 프린터의 종이에 그려주든 알아서 해준다. 이게바로 DC.

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=1052&ref=554

 

 

 




#WINAPI 변수 명명법(헝가리안 표기법?)  /  추가 데이터형


 

 

 

 



#키보드 메시지 입력받기.


1) WM_KEYDOWN , WM_CHAR

키보드 메시지를 누르면 -> 해당 키 메시지 발생 -> 처리.

한순간에 하나밖에 안됨.  


wParam 에 누른 키 정보 담김


동시에 여러개를 누른 키보드 메시지가 전달되려면 GetKeyState , GetAsyncKeyState사용.

키입력에 바로 반응하려면 GetAsyncKeyState사용.



# FPS


    while (msg.message != WM_QUIT)

    {

        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))

        {

            TranslateMessage(&msg);

            DispatchMessage(&msg);

        }

else

{

MainGame.Update();

MainGame.Render();

}

    }


이렇게 짰떠니 MainGame의 update와 render 계속 호출....  fps개념 검색. (winapi game fps)

참고 : http://data-forge.blogspot.kr/2013/09/fps.html


GetTickCount() :  윈도우가 시작돼서 지금까지 흐른 시간 1/1000초 단위로 DWORD형으로 리턴.






GetAsyncKeyState의 반환값은 아래와같이 4가지로 나뉩니다. 


반환값

설명 

0 (0x0000)

이전에 누른 적이 없고 호출 시점에서 안눌린 상태

0x8000 

이전에 누른 적이 없고 호출 시점에서 눌린 상태

0x8001 

이전에 누른 적이 있고 호출 시점에서 눌린 상태

1 (0x0001)

이전에 누른 적이 있고 호출 시점에서 안눌린 상태


이전에 누른 적이 없고 호출 시점에서 눌린 상태, 즉 키가 눌려진 시점에서 0x8000을 반환합니다. 만약 이전에도 누른 적이 있고 호출 시점에서도 눌렸으면 0x8001을 반환합니다. 이전에 키를 눌렀으면 0x0001을 반환하고, 눌리지 않았다면 0x0000을 반환합니다. 혹시, GetAsyncKeyState(VK_UP) & 0x8000 이런 코드를 보신적이 있으신가요? 0x8000과 GetAsyncKeyState 반환값을 AND 연산하는 이유는 정확한 시점에서 키의 상태를 확인하기 위함입니다. 만약에 키를 눌러 GetAsyncKeyState 함수가 0x8000을 반환한다면 이를 0x8000으로 AND 연산하여 키가 눌렸을때는 0x8000이 나옵니다. 그러나 눌려진 적이 있으면 GetAsyncKeyState 함수는 0x0001을 반환한다고 했었습니다. 0x0001에다 0x8000을 AND 연산하게되면 0이 나오게 됩니다. (만약에 AND 연산하지 않았을 경우에는 눌러진 적이 있는 상태도 참이 되어 동작을 수행할 것입니다.)

출처: http://blog.eairship.kr/156 [누구나가 다 이해할 수 있는 프로그래밍 첫걸음]