2010-05-06 33 views
7

Là người mới đến MFC, tôi thấy rất nhiều bối cảnh thiết bị (DC). Tôi mơ hồ hiểu rằng đó là một cái gì đó để làm với bản vẽ, nhưng các chi tiết cụ thể không được giải thích rất tốt bất cứ nơi nào mà tôi có thể tìm thấy. Điều gì tạo ra một "bối cảnh thiết bị tương thích" có nghĩa là, và tại sao nó quan trọng? SelectObject làm gì, và làm thế nào tôi phải thực hiện một DC tương thích đầu tiên?Hiểu ngữ cảnh thiết bị

Trả lời

11

Ngữ cảnh thiết bị chỉ là một nơi mà bản vẽ xảy ra, vì vậy nếu bạn có hai DC khác nhau, bạn sẽ vẽ ở hai vị trí khác nhau. Loại giống như một tập tin xử lý.

Ngữ cảnh thiết bị có thể ám chỉ đến bất động sản trên màn hình, hoặc ảnh bitmap chỉ nằm trong bộ nhớ, và có lẽ cả những nơi khác nữa, đó chỉ là hai điều mà tôi có thể nghĩ đến vào lúc này.

Ngữ cảnh tương thích là những ngữ cảnh có cùng tổ chức pixel cơ bản, theo đó có nghĩa là số bit trên mỗi pixel, byte cho mỗi pixel, tổ chức màu sắc, v.v. Các ngữ cảnh thiết bị bitmap của bộ nhớ có thể có bất kỳ tổ chức nào mà bạn muốn, nhưng ngữ cảnh màn hình của bạn sẽ liên quan đến bộ đệm trên card đồ họa của bạn, tùy thuộc vào chế độ, vv.

Có bối cảnh tương thích có nghĩa là hiệu quả của nó để chuyển dữ liệu hình ảnh giữa chúng, vì ít hoặc không có bản dịch dữ liệu được yêu cầu. Ở cực khác, nếu bạn có 256 bảng màu, bản đồ 8 bit và bạn cố gắng ghi nó vào màn hình có 8 bit mỗi RGBA trên mỗi pixel, mỗi điểm ảnh cuối cùng sẽ yêu cầu xoa bóp đáng kể khi được sao chép và sao chép không tương thích bitmap chậm hơn rất nhiều. Theo tài liệu Win32 SDK, ít nhất BitBlt() và StretchBlt() "chuyển đổi định dạng màu nguồn để phù hợp với định dạng đích", vì vậy nó có thể được thực hiện.

Điều tra CreateCompatibleDC() và CreateCompatibleBitmap() làm điểm bắt đầu để tạo các ngữ cảnh vẽ tương thích với các ngữ cảnh hiện có.

SelectObject() kiểm soát tài nguyên nào hiện đang hoạt động trong ngữ cảnh thiết bị. Ngữ cảnh có bút, cọ vẽ, phông chữ và bitmap hiện tại. Điều này làm cho nhiều cuộc gọi GDI khác đơn giản hơn bằng cách cho phép bạn chỉ định ít thông số hơn. Ví dụ, bạn không cần phải chỉ định phông chữ khi bạn sử dụng TextOut(), nhưng nếu bạn muốn thay đổi phông chữ, đó là nơi SelectObject() đi vào. Nếu bạn nạp SelectObject() một tay cầm vào một phông chữ thì trả về giá trị là một xử lý đối với phông chữ có hiệu lực và các hoạt động tiếp theo sử dụng phông chữ mới. Hành vi giống nhau đối với các loại tài nguyên, bút mực, bàn chải khác, v.v.

+0

Cảm ơn! Một số câu hỏi tiếp theo về điều đó, sau đó: Bạn có thể sử dụng DC không tương thích và vẫn có chương trình làm việc (mặc dù chậm hơn nhiều) không? Và SelectObject ở đâu đi vào khái niệm Tương thích với ngữ cảnh thiết bị? – Smashery

+0

@Smashery: đã chỉnh sửa một chút để giải quyết tốt hơn các vấn đề đó. – JustJeff

+0

Cảm ơn - một câu trả lời rất rõ ràng và hữu ích! – Smashery

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