2009-09-12 2 views
-1

저는 C++을 처음 접했고 게임을 만들려고합니다. 2 차원 배열의 RECT_GRID가 직사각형입니다. 2 차원 배열 GRID에 unsigned short가 있습니다. WM_CREATE 동안 사각형 배열 채우기C++의 드로잉 문제

WM_PAINT 이벤트는 배열의 모든 요소에 대해 사각형을 칠합니다. 사각형의 색은 GRID [x] [y]

의 값을 기반으로합니다. 아래 키를 누르면 GRID [1] [XMOVE]를 설정하여 직사각형 중 하나의 색을 변경합니다 ] = 다른 색상으로 변경 그러면 클라이언트 사각형이 무효화됩니다.

기본적으로 어떤 일이 발생하는지는 잠시 동안은 잘되지만 결국에는 그리기 작업이 중지됩니다. 디버그 중에 XMOVE 변수를 확인했는데 그리드 값과 물건으로 검사를했는데 모든 것이 정상입니다. 페인트 이벤트에서 for 루프를 제거하고 특정 사각형에 초점을 맞추면 결코 실패하지 않지만 약 20 회가 지나면 한 번에 모두 다시 그리기하면 그림이 그려지지 않습니다. 무엇이 이것을 일으킬 수 있습니까? 저는 C++을 처음 접했고 제대로 페인팅하지 못하고 오버 플로우 등의 원인이 될 것입니다.

누구나 잘못되었거나 적절한 방법을 설명 할 수 있다면 정말 고맙겠습니다. Google에서이 예와 같은 것을 찾을 수 없습니다. 감사

편집 :

I 3 개 세계 브러쉬 HBRUSH를 사용하고 있습니다; HBRUSH B; HBRUSH C;

내가 수정하면 항상 A = MakeBrush (NUM)라고 말합니다.

ami 브러쉬를 올바르게 사용하고 있습니까?

+1

일부 코드를 게시하면 사람들이 도울 수 있습니다! – xian

+0

코드를 알려주세요. – Partial

답변

5

GDI/C++ 초보자라면 처음에는 많은 펜과 브러쉬를 만들 것이라고 생각합니다. 이들은 Windows에서 제한된 리소스입니다. 당신은 당신이 당신의 자원에 과세하기 시작하기 전에 많은 것들을 만들 수 있습니다. 따라서 브러쉬와 펜, 윈도우 등을 한꺼번에 모두 만들어 다시 사용하거나 작업이 끝나면 올바르게 폐기하십시오. 나는 "성경"(http://www.amazon.com/Programming-Windows%C2%AE-Fifth-Microsoft/dp/157231995X/ref=sr_1_1?ie=UTF8&s=books&qid=1252788457&sr=8-1)의 사본을 받고 그 그림을 그리기 위해 그 장을 읽는 것이 좋습니다.

EDIT : 브러쉬를 올바르게 수정하는 것처럼 들리지는 않지만 MakeBrush 코드는 볼 수 없으므로 잘 모릅니다. 당신은 아마도 무대 뒤에서 많은 브러시를 만들고있을 것이며 당신은 그것을 모를 것입니다. 진지하게, Petzold의 책을 구해서 1-2 시간을 보내십시오. 나중에 머리에 더 많은 머리카락을 갖게 될 것입니다! ;-)

2

모든 GDI 예제에서 'CreatePen'또는 'CreateSolidBrush'다음에 삭제 개체가 표시됩니다. Windows에서 리소스가 제한적이기 때문입니다. 작업이 끝나면 삭제하지 않으면 리소스가 부족할 수 있습니다. 당신은 'DeleteObject 매크로'호출을 포함하는 것을 잊지 경우 사용할 수있는 모든 브러쉬를 사용한 후

PAINTSTRUCT Ps; 
HDC hDC = BeginPaint(hWnd, &Ps); 
HBRUSH NewBrush = CreateSolidBrush(RGB(250, 25, 5)); 

SelectObject(hDC, NewBrush); 
Rectangle(hDC, 20, 20, 250, 125); 
DeleteObject(NewBrush); 
EndPaint(hWnd, &Ps); 

, 당신은 문제가있는 것입니다. 시도해 보는 것이 실제로 재미 있습니다.)

+1

브러시를 삭제하기 전에 선택을 해제해야합니까? HBRUSH oldBrush = SelectObject (hDC, NewBrush); /*....drawings .. */DeleteObject (SelectObject (hDC, oldBrush)); –