728x90
반응형
728x90
반응형

HDC GetDC(HWND hWnd);

 

MSDN 명시

HDC GetDC(_In_ HWND hWnd);

 

DC는 주로 하나의 윈도우와 연관되는 출력 정보를 가진다.

GetDC 함수는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 리턴한다.

DC도 메모리를 차지하므로 할당 후 해제 원칙이 반드시 준수되어야 한다.(ReleaseDC)

 

함수가 성공적으로 실행되면 리턴되는 값은 지정된 윈도우의 클라이언트 영역에 대한 DC의 핸들을 리턴.

함수가 실패하면 리턴되는 값은 NULL.

 

ReleaseDC 함수 포스트 링크

http://blog.naver.com/kojy258/80209104883

 

사용예제 포스트 링크

http://blog.naver.com/kojy258/80209103519

 

최소지원 클라이언트 - 윈도우 2000 프로페셔널(데스크탑 전용)

최소지원 서버 - 윈도우 2000 서버(데스크탑 전용)

필요 헤더 - Winuser.h(Windows.h에 포함)

필요 라이브러리 - User32.lib

필요 DLL - User32.dll

 

GetDC( )   와  BeginPaint( ) 의 차이는 뭘까? 

 

API 에서 기본적으로 메세지루프가 돌 때 GetMessage( ) 함수에서 메세지를 읽어들이고, 삭제를 반복한다.

이러한 메세지중 WM_PAINT 메세지는 윈도우에 무효화 현상이 생길때 발생한다.

 

 
WM_PAINT 메세지란?​
 
WM_PAINT 메시지는 윈도우를 다시 그려야할 때 발생하는 메시지이다.  

WM_PAINT 메시지가 발생하는 경우로는 무효화 현상일 발생할 때 이다.

 

무효화란?

현재 그려진 이미지와 실제 이미지가 차이가 생길 뜻한다.

예를들어 다른 윈도우가 현재 윈도우를 가렸다가 치운다면 그리지 않던부분을 다시 그려줘야할 필요가 생긴다.

 

1) 윈도우가 처음 만들어져 사용자 눈에 보일 때

2) 윈도우가 다른 위도우에 가려졌다가 환원될 때

3) 윈도우의 크기를 조절할 때

4) 사용자의 함수호출에 의해 : Invalidate(), UpdateAllViews, InvalidateRect() 등

 

 

 

이때 WinProc( ) 함수에서 WM_PAINT 메세지 발생 시, BeginPaint 함수로 DC 를 얻어오는데, GetDC 로 사용할 순 없을까?

대답은 GetDC ㄴㄴ

이유인 즉, BeginDC( ) 함수가 실행될 때 내부적으로 WM_PAINT 메세지를 처리하고 윈도우를 유효화 상태로 만들기 때문.

만약 GetDC 를 사용하게 되면 WM_PAINT 메세지가 처리되지 않아 유효화 상태에서도 끈임없이 화면을 그리게 될 것이다.

 

즉, WM_PAINT 메세지가 발생 했을 때 사용하도록 만들어진 것이 BeginPaint( ) 함수.

이외에 따로 DC 만 얻어와야 할 때 쓰는 것이 GetDC 함수이다.

 

 

 

 

사용자정의 클래스에서 DC 얻기.

 

1. GetDC( ) 함수의 인자로 해당 윈도우의 핸들이 필요하다.

    따라서 핸들정보를 전역적으로 사용하기위한 변수를 하나 선언.

 

2. InitInstance( ) 함수에서 CreateWindow 함수의 반환값인 핸들을 전역변수(extern 선언된 변수) 에 저장.

 

3. GetDC( ) 함수의 인자로 전역으로 선언해논 핸들을 인자값으로 줘서 DC를 가져옴.

 

 

소멸자기준으로 동적할당 해제보다는 함수로인해서 해제하면 디버깅을 할 수 있다.

 

define에 쓰이는 extern 변수는 전체에 쓸수 있다.

 

FPS : 초당 몇프레임을 표현할지 정해주는 것이다.

 

GetTickCount : rand보다는 정교하고 난수를 가져온다. 

728x90
반응형
728x90
반응형
BOOL DrawFocusRect(HDC hdc, CONST RECT *lprc);

점선의 포커스 활성화 이미지를 그린다.



int FillRect(HDC hdc, CONST RECT *lprc, HBRUSH hbr);

특정 브러쉬로 내부를 채운다.



int FrameRect(HDC hdc, CONST RECT *lprc, HBRUSH hbr);

1픽셀의 브러쉬로 외곽선을 채운다.



BOOL InverRect(HDC hdc, CONST RECT *lprc);

Rect영역을 반전 시킨다.



BOOL SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom);

Rect 영역 설정



BOOL SetRectEmpty(LPRECT lprc);

비운다.



BOOL CopyRect(LPRECT lprcDst, CONST RECT *lprcSrc);

복사한다.



BOOL InflateREct(LPRECT lprc, int dx, int dy);

RECT 확장하기.



BOOL IntersectRect(LPRECT lprcDst, CONST rect *lprcSrc1, CONST rect *lprcSrc2);

Rect1, Rect2의 교집합 Rect를 구한다.



BOOL UnionRect(LPRECT lprcDst, CONST rect *lprcSrc1, CONST rect *lprcSrc2);

Rect1, Rect2의 합집합 Rect를 구한다.



BOOL SubtractRect(LPRECT lprcDst, CONST rect *lprcSrc1, CONST rect *lprcSrc2);

Rect1에서 Rect2를 뺀 Rect를 구한다.



BOOL OffsetRect(LPRECT lprc, int dx, int dy);

Rect를 x,y 만큼 이동한다.



BOOL IsRectEmpty(CONST RECT *lprc);

Rect가 비어있는지 검사한다.



BOOL EqualRect(CONST RECT *lprc1, CONST RECT *lprc2);

Rect1 과 Rect2가 같은지 비교한다.



BOOL PtInRect(CONST RECT *lprc, POINT pt);
Rect 영역 안에 Point좌표가 있는지 검사한다.
728x90
반응형
728x90
반응형

GetCurPos()

 ; 전체화면 기준으로 현재 마우스 커서 좌표를 얻어오는 함수

 

ScreenToClient()

 ; 전체화면 기준으로 얻은 커서 좌표를 해당 윈도우 기준으로 변환해주는 함수

 

1024 by 768 윈도우 기준으로 게임을 개발할때

마우스 포인터를 얻기위해 GetCurPos를 쓰면, 전체화면 기준으로 좌표가 리턴되기 때문에

내 해상도가 1024 by 768보다 높다면 좌표계의 불일치가 발생하게 되므로,

ScreenToClient()를 이용해 좌표계를 변환하여 사용하면 된다

728x90
반응형
728x90
반응형

포멧을 가진 문자열을 생성하기 위해서 sprintf함수를 많이 사용합니다.

 

요즘은 글로벌한 시대라 wide string을 많이 사용하기 때문에 sprintf의 wide string 버전 함수가 필요할 때가 많습니다.

 

그런데 swprintf 와 wsprintf 함수가 존재합니다. 두 함수는 동일한 목적을 가진 함수 입니다.

 

이 두 함수의 차이점은 아래와 같습니다.

 

 - swprintf 는 VC++ 라이브러리에 포함된 함수로서 우리가 사용해야 할 함수 입니다.

 - wsprintf 는 WinAPI에 포함된 라이브러리이고, format string 파라메터 중에 지원하지 않는 부분이 있습니다. 예를 들어 "*" 같은 width 특수화를 지원하지 않습니다.

 

swprintf를 사용하는 것이 옳겠습니다.

 

그리고 VS2005 부터는 이 함수의 secure 버전인 swprintf_s 를 사용하는 것이 좋습니다.

_s가 붙으면 버퍼의 크기를 파라메터로 받아 버퍼를 넘어설 때 exception을 발생시켜 줍니다. 또한 format string이 유효하지 않을 때도 exception을 발생 시켜 주도록 되어 있습니다.

exception이 발생하니까 그냥 swprintf를 써야 겠다고 생각하는 프로그래머가 있다면 바보같은 선택이니 왜 여기서 exception을 발생시켜주도록 변경되었을 지를 잘 생각해 보시기 바랍니다

728x90
반응형

'back-end > C & API' 카테고리의 다른 글

window api RECT 관련 API 함수들  (0) 2023.07.21
window api GetCurPos, ScreenToClient  (0) 2023.07.21
리스트 간단 설명 요약  (0) 2023.07.21
c언어에서 리스트란?  (0) 2023.07.21
STL 란?  (0) 2023.07.21
728x90
반응형
  • 삼각 함수 -
  • 각도를 이용할때 필요하다 (발사체의 각도를 알기위해 사용 , 혹은 캐릭터의 대각선 이동)
  • Sin(사인) , Cos(코사인) , Tan(탄젠트) - 탄젠트는 나중에 다룬다.
  • 위 3개는 중등 수학 내용이므로 생략
  • 사인 , 코사인 의 비율 그래프
  • 위 그래프는 빗변의 길이가 1일때 , 기준각의 각도에 따른 코사인 , 사인의 값을 나타낸 그래프이다.
  • 공학용 계산기를 이용하여 , 사인과 코사인 의 값을 쉽게 구할수 있다.
  • 빗변은 1이라는 가정을 하는 이유는 사인과 코사인의 비율이 빗변 기준이기 때문에 - 항등원 - 비율이 된다.
  • 즉 각도를 알면 X와 Y의 변위량을 구할수있다 .
  • #include 를 포함하고 아래와 같은 함수로 X,Y의 변위량을 구할수있다.
  • A(각도-라디안) 만큼 D(빗변)만큼 이동했을때 변위량
  • delta X = Cos(A) x D
  • delta Y = Sin (A) x D - 이떄 , 얻어오는 값은 데카르트 좌표계가 아니기에 - 로 바꿔주어서 원하고자 하는 값을 얻는다.
  • 디그리 (Degrees) : 우리가 일반적으로 알고있는 각도이다.
  • 라디언 (Radians) : 라디언은 호의 길이로 , 180 도에 대한 라디언은 우리가 알고있는 파이(3.141592~) 이다

즉 1 Rad = PI / 180 이다 .

약 : 0.017453 29251994329576923690768489 쯤 됨

  • 두점을 주고 각을 찾기 -
  • arc 코사인 , 사인을 이용해서 찾는다.
  • 빗변 d , 밑변 x , 높이 y 기준 으로 아래와 같은 공식이 된다.
  • acos( x / d ) , asin( y / d ) , atan( y / x )
  • 예외 처리 -> y의 값에 따라 (+-) 각도가 바뀐다. - 아래 그림과 같은 상황이면 비교가 같아진다.
  • 무슨말이냐면 , 단순히 빗변 d , 밑변 x , 높이 y 기준으로만 판단 하기 때문에 , 180도 까지만 판단을 할수있다.
  • 즉 Y 축에 따른 예외 처리를 해주어서 360도에 대한 각을 구해준다.
  • 그림 1
  • 요약
  • 전체적인 흐름
  • 두점을 안다 -> 서로의 거리를 안다 . 목표지점에서 시작지점을 뺀다 ( End - Start = 두 점 사이의 거리 )
  • 위 공식으로 각 점(X,Y) 사이의 변이량을 구한다 (deltaX , deltaY) -*delta는 변이량을 의미
  • 대각선 (빗변)의 거리를 구한다
  • distance(빗변) = sqrt( deltaX * deltaX + deltaY * deltaY );
  • 각을 구한다 ( 공식을 사용 )
  • float angle = acos( deltaX / distance );
  • 각도에 대한 변이량을 구한다
  • float deltaX = cos( Radians ) * distance(이동량);
  • float deltaY = -sin( Radians ) * distance(이동량);
728x90
반응형

'back-end > C & API' 카테고리의 다른 글

싱글톤 define 에 선언해서 편하게쓰기  (0) 2023.07.20
직선의방정식  (0) 2023.07.20
동치 연산자  (0) 2023.06.22
shorten url 축약주소 함수  (0) 2023.06.22
DX SDK d3dx9.h 를 참조할 수 없을 때  (0) 2023.06.22

+ Recent posts

728x90
반응형