Jury-rig Ответов: 2

Перерисовать окно клиента


Я хочу иметь возможность нажать кнопку в клиентской области и перерисовать клиентскую область.
Моя главная проблема заключается в том, что я не могу заставить его работать должным образом.
то, что я получаю, - это мерцание после нажатия кнопки.

Что я уже пробовал:

Я пытался.
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);
	}
}


visual studio 2017.
Любой вклад будет оценен по достоинству

Richard MacCutchan

Простой ответ заключается в том, что вы должны никогда вызов InvalidateRect из вашего OnDraw метод.

2 Ответов

Рейтинг:
1

CPallini

Насколько я знаю тебе не стоит звонить InvalidateRect внутри OnDraw потому что, в конце концов, это переносится OnDraw снова.


Рейтинг:
1

Rick York

А CPallini упоминалось, вам не нужно вызывать функцию invalidaterect внутри вашего обработчика функцию onDraw. Вы настраиваете себя на бесконечный цикл, делая это таким образом. По крайней мере, set щелкнул там на false, чтобы остановить цикл.

Причиной мерцания является вызов Invalidate (), поскольку он имеет аргумент по умолчанию erase, установленный в true, что означает, что он стирает все окно. Это приводит к вызову OnEraseBkgnd, который заполняет все окно цветом фона, а затем вызывается метод OnDraw. Все это приводит к мерцанию.

There are (at least) two possible ways to avoid the flicker. One is to call Invalidate and pass false to it so it doesn't erase the background. That will only work if your OnDraw method completely draws all of the foreground image and they usually don't. Another way is to draw into a memory device context. MFC has a built-in class called CMemDC to help with this. There is also an article here written by Keith Rule with a simple implementation of a memory DC that works very well. To this your OnDraw handler has to also draw the background and you want to have an OnEraseBkgnd handler that just returns TRUE to indicate it was drawn but it actually does nothing.