c++WM_PAINT
Las palabras que se muestran en el primer caso son normales. case?WM_PAINT:?
gdc?=?BeginPaint?(hwnd,?&ps);?
TextOut?(gdc,?0,?0,?s,?strlen? (s));?
break;
Las palabras que se muestran en el segundo caso siguen parpadeando. case?WM_PAINT:?
gdc?=?GetDC?(hwnd);
TextOut?(gdc,?0,?0,?s,?strlen?(s)) ;?
ReleaseDC?(hwnd,?gdc);?
break;
El motivo es:
BeginPaint() y EndPaint () puede eliminar el mensaje WM_PAINT en la cola de mensajes y hacer que el área no válida sea válida.
GetDC() y ReleaseDC() no eliminan ni hacen válida el área no válida, por lo que cuando el programa sale de WM_PAINT, el área no válida aún existe. El sistema seguirá enviando mensajes WM_PAINT, por lo que el programa seguirá procesando mensajes WM_PAINT.
BeginPaint y EndPaint le indicarán a GDI internamente que la ventana que necesita ser repintada ha sido repintada, de modo que después de que WM_PAINT se procese y se devuelva al sistema, el sistema no reenviará WM_PAINT, pero GetDC no lo indicará. el sistema El área que necesita ser redibujada en esta ventana ya ha sido dibujada. Después de devolver el programa al sistema, el sistema siempre piensa que no ha ejecutado el comando de redibujado obedientemente o que hay un error en la ejecución, por lo que cuando el mensaje está inactivo, continuará. Enviar WM_PAINT para instarlo a dibujar hará que el programa se congele.
Área no válida se refiere al área que debe volver a dibujarse. Significa no válida: el contenido actual es antiguo y está desactualizado. ?
Supongamos que A es un cuadro de diálogo emergente recientemente o que un cuadro de diálogo activado existente se coloca delante del cuadro de diálogo activo original B, lo que hace que parte o todo el cuadro de diálogo B quede cubierto. , cuando el cuadro de diálogo A se mueve o se cierra, el área donde estaba originalmente cubierto el cuadro de diálogo B vuelve a ser visible. El área cubierta se llama área inválida. ?
Solo cuando un mensaje de ventana está inactivo, el sistema se tomará el tiempo para verificar si el área no válida de la ventana no está vacía (WM_PAINT tiene la prioridad más baja. Es por eso que cuando el sistema está muy ocupado, la ventana y el escritorio a menudo se vuelven blancos, no se pueden actualizar, dejan rastros de arrastre, etc.). Si no está vacío, el sistema enviará WM_PAINT. Por lo tanto, debe usar BeginPaint y EndPaint para establecer el área no válida como vacía; de lo contrario, siempre se enviará WM_PAINT.