Redibujar la ventana del cliente

programación


Quiero poder hacer clic en un botón en el área del cliente y volver a dibujar el área del cliente.
Mi principal problema es que parece que no consigo que funcione correctamente.
lo que obtengo es un parpadeo después de presionar el botón.

Lo que he probado:

He intentado.

C++
void CButtonTestView::OnButtonClicked()
{
	AfxMessageBox(L"Button clicked");
	Clicked = TRUE;
	Invalidate();
	UpdateWindow();
}

void CButtonTestView::OnDraw(CDC* pDC)
{
	CButtonTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	// TODO: add draw code for native data here
	pDC->TextOutW(800, 100, _T("Button test"));

	if (Clicked)
	{
		InvalidateRect(nullptr, TRUE);
	}
}

estudio visual 2017.
Cualquier aporte se agradece

Solución 1

Hasta donde yo sé no deberías llamar InvalidateRect adentro OnDraw porque al final esto se reprograma OnDraw de nuevo.

Solución 2

Como mencionó CPallini, no necesita la llamada InvalidateRect dentro de su controlador OnDraw. Al hacerlo de esa manera, te estás preparando para un bucle sin fin. Como mínimo, establezca Clicked en falso para detener el bucle.

La causa del parpadeo es la llamada a Invalidate() porque tiene un argumento predeterminado, borrar, establecido en verdadero, lo que significa que borra toda la ventana. Eso hace que se llame a OnEraseBkgnd, que llena toda la ventana con el color de fondo y luego se llama al método OnDraw. Todo esto da como resultado un parpadeo.

Hay (al menos) dos formas posibles de evitar el parpadeo. Una es llamar a Invalidate y pasarle false para que no borre el fondo. Eso sólo funcionará si su método OnDraw dibuja completamente toda la imagen de primer plano y normalmente no lo hace. Otra forma es dibujar en el contexto de un dispositivo de memoria. MFC tiene una clase integrada llamada CMemDC para ayudar con esto. También hay un artículo aquí escrito por Keith Rule con una implementación simple de una memoria DC que funciona muy bien. Para esto, su controlador OnDraw también debe dibujar el fondo y desea tener un controlador OnEraseBkgnd que simplemente devuelva VERDADERO para indicar que se dibujó pero en realidad no hace nada.

Solución 3

Tengo un problema con el diálogo Modless que se muestra en el hilo de la interfaz de usuario. El cuadro de diálogo al activar con Crear muestra el modo superpuesto con otro cuadro de diálogo. Incluso si reduzco o expando el cuadro de diálogo superpuesto también crece. Cómo resuelvo esto

コメント

タイトルとURLをコピーしました