Tôi đang làm việc trên giao diện người dùng Win32. Tôi muốn biết sự khác biệt giữa GetDC và BeginPaint. Khi nào nên sử dụng API nào và khi nào không sử dụng API nào.Sự khác biệt giữa GetDC() và BeginPaint()
Trả lời
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.
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
.
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ó.
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. –
Đú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. –
- 1. Sự khác biệt giữa $ (...) và `...`
- 2. Sự khác biệt giữa. và #
- 3. Sự khác biệt giữa $ * và $ @
- 4. Sự khác biệt giữa ". +" Và ". +?"
- 5. Sự khác biệt giữa "**/* /" và "** /"?
- 6. Sự khác biệt giữa = và: =
- 7. Sự khác biệt về sự khác biệt giữa Matplotlib giữa Agg và Cairo
- 8. Sự khác biệt giữa Html.RenderAction và Html.Action
- 9. Sự khác biệt giữa cookie và phiên?
- 10. Sự khác biệt giữa '.' và "." trong java
- 11. Sự khác biệt giữa SimpleDB và S3
- 12. C++ - Sự khác biệt giữa (*). và ->?
- 13. Sự khác biệt giữa offsetHeight và clientHeight
- 14. Sự khác biệt giữa RDLC và SSRS
- 15. Sự khác biệt giữa "\ n" và Environment.NewLine
- 16. Sự khác biệt giữa qt và PyQt4
- 17. Sự khác biệt giữa AForge và OpenCV
- 18. Sự khác biệt giữa toFixed() và toPrecision()?
- 19. sự khác biệt giữa cacao và cocoatouch
- 20. Sự khác biệt giữa smtpClient.send() và smtpClient.SendAsync()?
- 21. Sự khác biệt giữa window.location.host và window.location.hostname
- 22. Sự khác biệt giữa DTLS và TLS
- 23. Sự khác biệt giữa Mealy và Moore
- 24. sự khác biệt giữa createRfcommSocketToServiceRecord và createRfcommSocket
- 25. Sự khác biệt giữa Arrays.sort() và Arrays.parallelSort()
- 26. sự khác biệt giữa orm và pdo
- 27. Sự khác biệt giữa nproc và ulimit?
- 28. Sự khác biệt giữa apc_add và apc_store?
- 29. Sự khác biệt giữa mb_substr và substr
- 30. Sự khác biệt giữa p4diff và p4diff2
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 –
Đọ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