WinAPI 핸들, DC, 윈도우 이벤트(1)

CJB_ny·2022년 8월 22일
0

WinAPI

목록 보기
3/79
post-thumbnail

WinAPI를 배우면 다른 운영체제

안드, IOS도 이것을 공부하면서 공부하는 방법도 배우기때문에

금방배울 수 있다는 자신감을 가져라.

잠깐 복습

여기서 윈도우 창을 만들고

그리고 반복문을 돌면서 메세지들을 처리를한다.

(메세지 반응 큐)

그중에서도 메세지가 발생을 하면은 WM_PAINT라는 메세지가 발생했을 경우에

switch case에 들어오면은

여기서 뭔가 그리는 작업을 하는 것이다.

그러면 그려져야할 상황이 발생을 한 것이다.

그러면이제 GetMessage 에서

그것을 꺼내서 처리를 하라고 보내서

어디로? msg.hwnd로 보내는데 이게

WndProc = 윈도우 프로시저 함수.

이쪽으로 보내서 WM_PAINT이기때문에 사각형을 그리는 것이다.

그렇다면 어떠한 상황일 때 WM_PAINT라는 상황이노?

이것만 체크해보도록 하자.

WM_PAINT발생하는 경우

무효화 영역

무효화 영역이 발생한 경우

무효화 영역 == invalidate Rect

만약 내 흰색창이 빨간 윈도우에 의해 가려진 경우

그러다가 내 흰색창을 클릭을 하면

이렇게 다시 덮여짐.

그때

이 부분이 '무효화 영역'이라는 것이다.

이부분은 가려졌던 부분이라 다시 채워 주어야한다는 것이라는 것이다.

근데 진짜 그럼?

확인해보면 딱히 break Point안걸린다.

근데 창을

이렇게 최소화 했다가 다시 키면은

그러면 WM_PAINT발생한다.

이게 '무효화 영역'이 발생하는 대표적인 사례이다.

옛날에는 이게 창이 살짝 가려졌다가 빨간창 설명한것처럼 그럴경우

무효화 영역이 발생했는데

window7 이후로는 이게 살짝 가려진걸로는 무효화영역 발생 안한다.

지금은 화면에 그렸던 그림데이터를 '비트맵'형태로 데아터를 가지고있기 때문에

창 살짝 가린걸로는 무효화 영역 발생 안한다.

"꼭 본인이 테스트"하길 바란다.

switch case {}

switch case 에서 이렇게 지역변수를 선언을 하면 문법오류이다.

지역변수를 선언해주고싶으면 지역 괄호 {} 를

이렇게 만들어주어야함.


왜??


그래서

프로시저 함수안에서도 {} 써서 지역변수 사용한 것이다.

윈도우 핸들

여기서 hWnd를 BeginPaint에다가 넘겨주는데

이런 화면에 창들은 window회사에서 만든 것이다.

CreateWindowW라는 함수를 사용할 수 있을 뿐이지

구현부를 볼 수 없다.

이렇게 만들어진 윈도우 객체 정보는 함부로 접근 불가능.

그런애들은 운영체제에서 관리하는 Curnel Object라고한다.

이것들은 커널에서 OS가 관리하기 때문에 내가 조작할 수 없다.

그래서

커널 오브젝트

Os가 관리하는 '커널 오브젝트'들은

사용자에게 'ID'값을 준다.

(이 ID가 어떻게 생성됬는지는 모른다)

이런 ID를 주는데 한번받은 이 ID를

CreateWindowW를 하면 HWND 타입의 hWnd가 받게된다. (ID를)

이 ID를 이용해서

ShowWindow 호출가능 (OS에서 제공해주는 함수)

이렇게하면 그냥 화면 안보인다.

이 ID받는 방법에 익숙해져야한다.

이 HDC는int하나 들고있는 구조체이다.

근데왜 정수데이터 하나들고있을 것인데 구조체로..??

다 DECLARE_HANDLE로 정의해놓음.

지금

  • HBRUSH

  • HDC

  • HPEN

등등 다 커널오브젝트 (OS에서 관리하는 오브젝트)들이기는한데

전혀다른 객체들이다.

왜? => 실수 방지를 위해서

H시리즈들은 다 해당 구조체?의 ID값을 들고있다.

예를들어 Setwindow같은 함수에

HBRUSH같은 녀석을 넣을 수 없게하려고 자료형이름을 하나하나 다 정의를 해놓은 것이다.

HWND만이 들어가야 하기 때문에.

다른 HANDLE값 집어넣으면 컴파일 에러난다.

이거 다 HANDLE형태의 자료형이고 ID 값을 받는 다는 것이다.

그래서 이 BeginPaint가 바로 Device Context를 만들어서

ID를 주는 것이다. hdc한테.

이 프로시저 함수를 보면 현재 포커싱되어있는 윈도우를

HWND hwnd로 받고있다.

그래서 WM_PAINT발생할때

이안에서 BeginPaint의 인자에 hWnd를 넘겨주어서 해당 포커싱된 윈도우를 넘겨주는 것이다.

그래서 HDC를 만들어 낼 때 hWnd를 인자로 넘겨주는 것.

그래서 Rectangle의첫번째 인자에 그 윈도우의 ID를 hdc로 넘겨준 것이다.

dc라는 것은 그러면 목적지에 해당하는 윈도우도 알면서 만들어져야하는 오브젝트이다.

DC란? Device Context

장치 Context

그리기 작업의 수행에 필요한 데이터들의 집합체이다.

그래서 우리가 윈도우에 뭔가를 그릴려면은

항상 DC가 필요하다.

DC를 가져와서 그림을 그린다 == 해당 DC가 목적지로하고있는 그림판에
그 DC안에 들어있는 '펜'정보 '브러쉬'정보를 이용해서 그림을 그리겟다라는 뜻이 되는 것이다.

지금 HDC hdc의 목적지는 hWnd(내가 가르키는 윈도우)를 목적지로 해서 '만들어진 것'이다.

근데 우리는 지금 여기서 어떤 '펜'을 써 어떤 '브러쉬'를 써라고 정해준 적이 없다.

그래서 펜과 브러쉬는 defalt값 검은색 펜과 하얀색 브러쉬로 기본 지정이 되어있다.

그래서 Rectangle호출했을 때 내부가 지금 흰색인데

이거 하얀색으로 칠해진 것이다.

원래 하얀색이라 테두리만 그린거같은데 하얀색으로 채운것이다.

색을 채운다?

이안의 픽셀하나하나를 싹다 흰색으로 채운것이다.

이거는 모니터라는 출력장치가 있기 때문에 확인이 가능한 것이다.

근데 모니터 없어도 컴퓨터 내부적으로 그대로 돌아간다.

픽셀한칸한칸이 메모리이다.

픽셀한칸 메모리 지정

픽셀한칸의 메모리 지정

R, G, B라는 1바이트씩으로 지정되어있다.

픽셀한칸은 3바이트이다.

1920 * 1080 기준 화면을 구성하는 메모리의 크기는

대충 요정도이다.

KB로 치면 6075KB, MB로 치면은 5.93MB

픽셀 한칸이 3바이트 인데 그것을 검은색으로 칠할려면

(0, 0, 0) => 빛의 삼원색 => 검은색

색상을 표현하는데 3바이트만 되어도 1600만개 어쩌구 표현색 가능.

직접 펜을 만들어서 DC에 지급

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글