2011-04-30 35 views

Trả lời

14

GetDC chỉ cần trả về tay cầm cho bối cảnh thiết bị, có thể sử dụng bất cứ lúc nào ở bất kỳ đâu để thực hiện bản vẽ của riêng bạn. BeginPaint mặt khác chuẩn bị cửa sổ cho bức tranh, và cũng cung cấp thông tin về những gì cần được sơn (chẳng hạn như nền có cần sơn lại và khắc phục cần phải được sơn).

Ví dụ về thời điểm sử dụng? BeginPaint thường được thấy bên trong các trình xử lý WM_PAINT (MSDN: Một ứng dụng không nên gọi BeginPaint trừ khi trả lời một tin nhắn WM_PAINT. Mỗi cuộc gọi đến BeginPaint phải có một cuộc gọi tương ứng với hàm EndPaint.). GetDC có thể được sử dụng ở mọi nơi, vì vậy nếu bạn muốn vẽ trên một cửa sổ bên ngoài. Về cơ bản bất cứ lúc nào thats không có trong một trình xử lý WM_PAINT. BeginPaint và EndPaint cũng có một số ảnh hưởng đến dấu mũ. Đọc msdn để biết thêm chi tiết.

+0

Cảm ơn đầu vào có giá trị. Nếu tôi sử dụng GetDC bên trong WM_PAINT thay vì BeginPaint, nó sẽ đưa ra bất kỳ vấn đề nào –

+1

Đọc trả lời từ Hans Passant để biết chi tiết về lý do tại sao đó không phải là một ý tưởng hay. Khi bạn tạo một dự án studio trực quan mới, bạn có được BeginPaint và EndPaint đã có trong trình xử lý WM_PAINT, Tại sao bạn muốn sử dụng GetDC? – Matt

7

BeginPaint chỉ được gọi để đáp ứng với thông báo WM_PAINT. Ngữ cảnh thiết bị thu được bằng cách trỏ đến vùng không hợp lệ (được vẽ lại) của cửa sổ. Sau đó nó sẽ được phát hành bằng cách sử dụng EndPaint.

GetDC có thể được gọi bất cứ lúc nào. Ngữ cảnh thiết bị thu được bằng cách trỏ đến toàn bộ khu vực máy khách của cửa sổ. Để giải phóng nó, bạn nên gọi ReleaseDC.

7

GetDC() là không thay thế cho Begin + EndPaint(). Nếu bạn cố gắng, bạn sẽ thấy rằng giao diện người dùng của bạn bắt đầu ghi 100% lõi cpu và xử lý WM_PAINT của bạn nhận được gọi hơn và hơn nữa.

Cái lớn nhất là EndPaint(), nó xóa vùng cập nhật của cửa sổ. Giá trị của PAINTSTRUCT.rcPaint. WM_PAINT được tạo miễn là cửa sổ có hình chữ nhật bẩn, được tạo bởi một cuộc gọi InvalidateRect() bởi trình quản lý cửa sổ hoặc chương trình của bạn gọi nó rõ ràng. EndPaint() xóa nó.

+0

Cảm ơn, điều đó giải thích việc sử dụng CPU mà tôi đã nhận được mà không có EndPaint. –

+1

Đúng. EndPaint về cơ bản gọi ValidateRect. Bạn có thể trì hoãn DefWindowProc (xác nhận trực tuyến) hoặc chỉ gọi ValidateRect. –

Các vấn đề liên quan