Pregunta

Soy algo nuevo en c ++ y estoy tratando de crear un juego. Tengo una matriz 2d RECT_GRID de rectángulos. Tengo un GRID de matriz 2D de corto sin signo. Lleno la matriz de rectángulo durante WM_CREATE

El evento WM_PAINT pinta rectángulos para todos los elementos de la matriz. El color del rectángulo se basa en el valor de GRID [x] [y]

Lo hice así cuando se presiona la tecla hacia abajo. Cambia el color de uno de los rectángulos al configurar GRID [1] [XMOVE] = a un color diferente luego invalida el rectángulo del cliente

Básicamente, lo que sucede es que funciona bien por un tiempo, pero eventualmente deja de dibujar cosas. Verifiqué mi variable XMOVE durante la depuración, verifiqué los valores de la cuadrícula y esas cosas y todo está bien. Cuando elimino el bucle for del evento de pintura y me concentro en 1 rectángulo específico, nunca falla, pero si trato de volver a dibujarlos todos a la vez, después de unas 20 veces, deja de pintar cosas. Que podria causar esto? Soy nuevo en c ++ y apuesto a que no estoy pintando correctamente y causando un desbordamiento o algo así.

Si alguien pudiera explicar qué está pasando mal, o una forma adecuada de hacerlo, realmente lo agradecería. No pude encontrar nada como este ejemplo en Google. Gracias

EDITAR:

Estoy usando 3 pinceles globales CEPILLO A; CEPILLO B; CEPILLO C;

y cuando los modifico, siempre digo A = MakeBrush (NUM);

¿estoy usando los pinceles correctamente?

¿Fue útil?

Solución

Mi primera suposición, si eres un novato total de GDI / C ++, es que probablemente estés creando muchos bolígrafos y pinceles. Estos son recursos restringidos en Windows. Solo puede crear tantos antes de comenzar a gravar sus recursos. Por lo tanto, haga sus Pinceles, Bolígrafos y Ventanas, etc. de una vez y reutilícelos, o deséchelos adecuadamente cuando haya terminado. Recomiendo obtener una copia de " la Biblia " ( http://www.amazon.com/Programming-Windows%C2%AE-Fifth -Microsoft / dp / 157231995X / ref = sr_1_1? Ie = UTF8 & amp; s = books & amp; qid = 1252788457 & amp; sr = 8-1 ) y leyendo los capítulos sobre el dibujo.

EDITAR : no parece que esté modificando sus pinceles correctamente, pero como no puedo ver el código de MakeBrush, no lo sé. Probablemente estés creando muchos pinceles detrás de escena y ni siquiera lo sabes. En serio, obtenga una copia del libro de Petzold y pase una o dos horas. ¡Terminarás con más vello en la cabeza más tarde! ;-)

Otros consejos

Notarás que en todos los ejemplos de GDI, a 'CreatePen' o 'CreateSolidBrush' le seguirá un objeto de eliminación. Esto se debe a que son recursos limitados en Windows, y puede quedarse sin ellos si no los elimina cuando haya terminado.

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);

Si olvida incluir la llamada 'DeleteObject', tendrá problemas después de usar todos los pinceles disponibles. Es realmente divertido probar =)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top