Gambar ulang jendela klien

pemrograman


Saya ingin dapat mengklik tombol di area klien dan menggambar ulang area klien.
Masalah utama saya adalah sepertinya saya tidak bisa berfungsi dengan baik.
yang saya dapatkan adalah kedipan setelah tombol ditekan.

Apa yang saya coba:

Saya sudah mencoba.

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 visual 2017.
Kontribusi apa pun dihargai

Solusi 1

Sejauh yang saya tahu Anda tidak boleh menelepon InvalidateRect di dalam OnDraw karena, pada akhirnya, ini menjadwal ulang OnDraw lagi.

Solusi 2

CPallini menyebutkan, Anda tidak memerlukan panggilan InvalidateRect di dalam handler OnDraw Anda. Anda menyiapkan diri Anda untuk putaran tanpa akhir dengan melakukan hal itu. Paling tidak, setel Clicked ke false di sana untuk menghentikan perulangan.

Penyebab kedipan tersebut adalah pemanggilan Invalidate() karena memiliki argumen default, delete, disetel ke true yang berarti menghapus seluruh jendela. Itu menyebabkan OnEraseBkgnd dipanggil yang mengisi seluruh jendela dengan warna latar belakang dan kemudian metode OnDraw dipanggil. Semua ini menghasilkan kedipan.

Ada (setidaknya) dua cara yang mungkin untuk menghindari kedipan. Salah satunya adalah memanggil Invalidate dan meneruskan false agar tidak menghapus latar belakang. Itu hanya akan berfungsi jika metode OnDraw Anda benar-benar menggambar semua gambar latar depan dan biasanya tidak. Cara lain adalah dengan menggambarkan konteks perangkat memori. MFC memiliki kelas bawaan yang disebut CMemDC untuk membantu dalam hal ini. Ada juga artikel di sini yang ditulis oleh Keith Rule dengan implementasi sederhana dari memori DC yang bekerja dengan sangat baik. Untuk ini, pengendali OnDraw Anda juga harus menggambar latar belakang dan Anda ingin memiliki pengendali OnEraseBkgnd yang hanya mengembalikan TRUE untuk menunjukkan bahwa itu telah digambar tetapi sebenarnya tidak melakukan apa pun.

Solusi 3

Saya mengalami masalah dengan dialog Modless yang ditampilkan di thread Antarmuka Pengguna. Dialog aktivasi dengan Create menampilkan mode tumpang tindih dengan dialog lain. Bahkan jika saya mengecilkan atau memperluas dialog yang tumpang tindih juga bertambah. Bagaimana cara mengatasi ini

コメント

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