Vẽ lại cửa sổ máy khách

lập trình


Tôi muốn có thể nhấp vào một nút trong khu vực khách hàng và vẽ lại khu vực khách hàng.
Vấn đề chính của tôi là tôi dường như không thể làm cho nó hoạt động bình thường.
những gì tôi nhận được là nhấp nháy sau khi nhấn nút.

Những gì tôi đã thử:

Tôi đã thử.

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 trực quan 2017
Mọi đóng góp đều được đánh giá cao

Giải pháp 1

Theo như tôi biết thì bạn không nên gọi InvalidateRect bên trong OnDraw bởi vì, cuối cùng, việc này sẽ dời lại lịch trình OnDraw lại.

Giải pháp 2

CPallini đã đề cập, bạn không cần lệnh gọi InvalidateRect bên trong trình xử lý OnDraw của mình. Bạn đang tự đặt ra cho mình một vòng lặp vô tận khi làm theo cách đó. Ít nhất, hãy đặt Đã nhấp thành sai trong đó để dừng vòng lặp.

Nguyên nhân gây ra hiện tượng nhấp nháy là lệnh gọi Invalidate() vì nó có đối số mặc định là delete, được đặt thành true, nghĩa là nó sẽ xóa toàn bộ cửa sổ. Điều đó khiến OnEraseBkgnd được gọi để lấp đầy toàn bộ cửa sổ bằng màu nền và sau đó phương thức OnDraw được gọi. Tất cả điều này dẫn đến nhấp nháy.

Có (ít nhất) hai cách có thể để tránh hiện tượng nhấp nháy. Một là gọi Invalidate và chuyển false cho nó để nó không xóa nền. Điều đó sẽ chỉ hoạt động nếu phương pháp OnDraw của bạn vẽ hoàn toàn tất cả hình ảnh nền trước và chúng thường không hoạt động. Một cách khác là vẽ vào bối cảnh thiết bị bộ nhớ. MFC có một lớp tích hợp có tên CMemDC để trợ giúp việc này. Ngoài ra còn có một bài viết ở đây được viết bởi Keith Rule với cách triển khai đơn giản bộ nhớ DC hoạt động rất tốt. Để làm điều này, trình xử lý OnDraw của bạn cũng phải vẽ nền và bạn muốn có trình xử lý OnEraseBkgnd chỉ trả về TRUE để cho biết nó đã được vẽ nhưng thực tế nó không làm gì cả.

Giải pháp 3

Tôi gặp sự cố với hộp thoại Modless được hiển thị trong chuỗi Giao diện người dùng. Hộp thoại kích hoạt bằng Tạo đang hiển thị chế độ chồng chéo với một hộp thoại khác. Ngay cả khi tôi thu nhỏ hoặc mở rộng hộp thoại chồng chéo cũng phát triển. Làm cách nào để giải quyết vấn đề này

コメント

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