2012-09-18 39 views
6

Làm thế nào để vẽ văn bản bằng màu trong suốt bằng WinAPI? Theo cách thông thường, tôi đã sử dụng SetBkMode (hDC, TRANSPARENT), nhưng bây giờ tôi cần phải sử dụng bộ đệm đôi. Bằng cách này, hình ảnh vẽ chính xác, nhưng văn bản rút ra không chính xác (với nền đen).Làm thế nào để vẽ văn bản với nền trong suốt bằng cách sử dụng c + +/WinAPI?

case WM_PAINT: 
{ 
    hDC = BeginPaint(hWnd, &paintStruct); 
    SetBkMode(hDC, TRANSPARENT); 

    HDC cDC = CreateCompatibleDC(hDC); 
    HBITMAP hBmp = CreateCompatibleBitmap(hDC, width, height); 
    HANDLE hOld = SelectObject(cDC, hBmp); 

    HFONT hFont = (HFONT)SelectObject(hDC, font); 
    SetTextColor(cDC, color); 
    SetBkMode(cDC, TRANSPARENT); 

    TextOut(cDC, 0, 0, text, wcslen(text)); 

    SelectObject(cDC, hFont); 

    BitBlt(hDC, 0, 0, width, height, cDC, 0, 0, SRCCOPY); 

    SelectObject(cDC, hOld); 
    DeleteObject(hBmp); 
    DeleteDC(cDC); 

    EndPaint(hWnd, &paintStruct); 
    return 0; 
} 

Trả lời

2

Khi bạn tạo bitmap, màu không được chỉ định. Tài liệu không cho biết nó được khởi tạo như thế nào, nhưng chắc chắn là màu đen (tất cả các số không) có vẻ như vậy. Vì bạn đang vẽ văn bản trên bitmap, nền của bitmap vẫn đen. Sau đó, bạn sao chép toàn bộ bitmap vào DC và tất cả các pixel sẽ xuất hiện cùng với nền văn bản.

Để khắc phục điều này, bạn phải sao chép nền mong muốn vào bitmap trước khi vẽ văn bản.

+0

Cách này hoạt động) Không như tôi mong đợi, nhưng hoạt động. một số vùng có nền đen, nhưng tôi nghĩ, tôi có thể sửa chúng. – Alexander

8

SetBkMode(dc, TRANSPARENT) sẽ vẫn hoạt động tốt. Hãy chắc chắn rằng bạn đang sử dụng đúng DC xử lý khi vẽ để đệm của bạn trở lại.

+0

Tôi đã sử dụng chức năng này cho cả DC, native, mà tôi nhận được bởi BeginBaint (...) và tương thích, mà tôi nhận được bởi CreateCompatibleDC (...) ... – Alexander

+0

Bạn cần sử dụng nó cho cùng một DC bạn đang vẽ văn bản. API vẽ văn bản nào bạn đang gọi? Bạn đang vẽ loại DC và bitmap nào? – tenfour

+0

Những gì tôi làm: tạo dc tương thích, tạo bitmap tương thích, chọn đối tượng, setbkmode, vẽ (với dc tương thích), bitblt, chọn đối tượng, xóa đối tượng, xóa dc. Hình ảnh vẽ chính xác, nhưng văn bản vẽ với nền đen (( – Alexander

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