티스토리 뷰

기타

타이틀바 드래그 시 멈춤 현상

따분한놈 2014. 3. 7. 01:26

좀 오래 됐지만 우선 정리..

예전에 요청중에 타이틀 바 드래그시 멈춤 현상? 이라고 해야 하나.

어쨋든 요새 게임은 드래그 해도 계속 렌더링되는 게임들이 있다보니.

회사분이 왜 우리는 안되냐고 해달라고 막 쪼르길래 ㅠ.

뒤지고 뒤져보니 보통 세가지 방법이 있다.


1. 윈도우 타이틀바 없애고 유아이로 대체하고 닫기버튼,최소화버튼 등을 따로 처리

2. 메세지 처리 부분만 스레드로 별도 처리

3. 어찌 어찌 메세지막고 해서 MoveWindow함수로 하기..

 

1번째는 애초에 이건 아니다 싶어서 포기.

 

2번째 방법을 쓰니 문제들이 많았었는데.

우선 윈도우를 생성한 스레드와 PeekMessage의 스레드가 다를 경우 메세지가 제대로 나오지가 않아서 문제가 있었다.

시간이 꽤 지나서 기억이 가물가물한데;;

그래서 했던게 같은 생성과 메세지 처리를 같은 스레드에서 하고 렌더링, 업데이트부분만 다른 스레드에서 처리하니 되긴하는데..

서버쪽 IOCP와의 문제로 인한 뻗는 현상..

그 외에 스레드세이프하지 않아서 문제가 생겨서 포기

 

3번째 방법은 우선 타이틀바에서 드래그하는 이벤트를 알아오는 일인데.

WM_NCHITTEST 이거 였나 이걸로 타이틀바가 먼지를 알수가 있는데.

문제는 이상하게 메세지가 잘 안올때가 있다... 그래서 우회한 방법이

우선 마우스가 비영역 클라이언트에 있을때 마우스 클릭시에 처리를 하는 방법이었다.

그렇게 클릭시에 PostMessage로 특정한 메세지를 예를 들어 99999이런식으로 날려서

PeekMessage를 거치기 전에 잡아서? 렌더링,업데이트를 해버린다.

거기서 드래그시에 MoveWindow (머 이거 말고 다른 함수썻지만)로 이동해버린다.

그럼 모두 해피해피~

 

나중에 새로고친 제일 깔끔한 방법이

WM_NCMOUSEMOVE에서 최소화버튼,최대화버튼,닫기버튼이 있는 영역을 대충 제외한 부분에서 이동시 bool변수를 하나둬서 체크하게 하게 하였는데, 문제가 이 메세지가 왔을때 비영역클라의 위치를 제대로 가져오지 못하였다. 분명 HTCAPTION이 와야하는데 이상한게 와서 직접 마우스 위치를 계산해서 타이틀바에 있을시에 체크하였고 체크된 상태에서 마우스 클릭시 SetCapture하고 마우스 버튼 업시에 ReleaseCapture를 한다.

그리고 업데이트 단에서 SetWindowPos로 움직이니 만사오케이

'기타' 카테고리의 다른 글

Visual Studio 옵션 /MP  (0) 2014.07.25
카메라 흔들기  (0) 2014.07.10
그래픽 카드 알아내기  (0) 2014.02.19
Visualstudio 2012 Warning : MSB8012  (0) 2014.02.14
Awesomium  (0) 2013.10.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함