Redessiner la fenêtre client

la programmation


Je veux pouvoir cliquer sur un bouton dans la zone client et redessiner la zone client.
Mon principal problème est que je n’arrive pas à le faire fonctionner correctement.
ce que j’obtiens, c’est un scintillement après avoir appuyé sur le bouton.

Ce que j’ai essayé :

J’ai essayé.

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

studio visuel 2017.
Toute contribution est appréciée

Solution 1

Pour autant que je sache, tu ne devrais pas appeler InvalidateRect à l’intérieur OnDraw parce qu’au final, ça reprogramme OnDraw encore.

Solution 2

Un CPallini l’a mentionné, vous n’avez pas besoin de l’appel InvalidateRect dans votre gestionnaire OnDraw. Vous vous préparez à une boucle sans fin en procédant de cette façon. À tout le moins, définissez Clicked sur false pour arrêter la boucle.

La cause du scintillement est l’appel à Invalidate() car il a un argument par défaut, delete, défini sur true, ce qui signifie qu’il efface toute la fenêtre. Cela provoque l’appel de OnEraseBkgnd qui remplit toute la fenêtre avec la couleur d’arrière-plan, puis la méthode OnDraw est appelée. Tout cela entraîne un scintillement.

Il existe (au moins) deux manières possibles d’éviter le scintillement. La première consiste à appeler Invalidate et à lui transmettre false afin qu’il n’efface pas l’arrière-plan. Cela ne fonctionnera que si votre méthode OnDraw dessine complètement toute l’image de premier plan, ce qui n’est généralement pas le cas. Une autre façon consiste à s’inspirer du contexte d’un périphérique de mémoire. MFC dispose d’une classe intégrée appelée CMemDC pour vous aider. Il y a aussi ici un article écrit par Keith Rule avec une implémentation simple d’un DC mémoire qui fonctionne très bien. Pour cela, votre gestionnaire OnDraw doit également dessiner l’arrière-plan et vous souhaitez avoir un gestionnaire OnEraseBkgnd qui renvoie simplement TRUE pour indiquer qu’il a été dessiné, mais il ne fait rien.

Solution 3

J’ai un problème avec la boîte de dialogue Modless affichée dans le fil de discussion de l’interface utilisateur. La boîte de dialogue lors de l’activation avec Créer affiche le mode superposé avec une autre boîte de dialogue. Même si je réduis ou agrandis, la boîte de dialogue superposée s’agrandit également. Comment résoudre ça

コメント

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