【解決方法】クライアントウィンドウを再描画する

[ad_1]

クライアント領域のボタンをクリックしてクライアント領域を再描画できるようにしたいと考えています。
私の主な問題は、それが適切に動作しないように見えることです。
ボタンを押した後にちらつくのがわかります。

私が試したこと:

私はもう試した。

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

ビジュアルスタジオ2017。
あらゆる貢献を歓迎します

解決策 1

私の知る限り、電話はすべきではない InvalidateRect 内部 OnDraw 最終的にはスケジュールが変更されるため、 OnDraw また。

解決策 2

CPallini が述べたように、OnDraw ハンドラー内で InvalidateRect 呼び出しを行う必要はありません。 そうすることで、無限ループに陥ることになります。 ループを停止するには、少なくとも、そこで Clicked を false に設定します。

ちらつきの原因は、Invalidate() の呼び出しです。これは、デフォルトの引数 Erase が true に設定されており、これはウィンドウ全体を消去することを意味します。 これにより、OnEraseBkgnd が呼び出され、ウィンドウ全体が背景色で塗りつぶされ、その後 OnDraw メソッドが呼び出されます。 これらすべてによりちらつきが発生します。

ちらつきを回避するには (少なくとも) 2 つの方法があります。 1 つは、Invalidate を呼び出して false を渡し、背景を消去しないようにする方法です。 これは、OnDraw メソッドがすべての前景イメージを完全に描画する場合にのみ機能しますが、通常はそうではありません。 もう 1 つの方法は、メモリ デバイス コンテキストに描画することです。 MFC には、これを支援する CMemDC という組み込みクラスがあります。 ここには、Keith Rule によって書かれた、非常にうまく機能するメモリ DC の簡単な実装に関する記事もあります。 このために、OnDraw ハンドラーは背景も描画する必要があり、描画されたことを示すために TRUE を返すだけで、実際には何も行わない OnEraseBkgnd ハンドラーが必要になります。

解決策 3

ユーザー インターフェイス スレッドに Modless ダイアログが表示されるという問題が発生しています。 Create でアクティブ化したダイアログが、別のダイアログと重なって表示されます。 縮小したり拡大したりしても、重なったダイアログは拡大します。 これを解決するにはどうすればよいですか

[ad_2]

コメント

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