2009-10-28 73 views

Trả lời

29

Bạn có thể thực hiện ON_WM_CTLCOLOR trong lớp thoại của bạn, mà không cần phải tạo ra một lớp mới CStatic có nguồn gốc từ:

BEGIN_MESSAGE_MAP(CMyDialog, CDialog) 
    //{{AFX_MSG_MAP(CMyDialog) 
    ON_WM_CTLCOLOR() 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor) 
{ 
    switch (nCtlColor) 
    { 
    case CTLCOLOR_STATIC: 
     pDC->SetTextColor(RGB(255, 0, 0)); 
     return (HBRUSH)GetStockObject(NULL_BRUSH); 
    default: 
     return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    } 
} 

Chú ý rằng đoạn mã trên bộ nội dung của tất cả các điều khiển tĩnh trong hộp thoại. Nhưng bạn có thể sử dụng biến số pWnd để lọc các điều khiển bạn muốn.

+0

Bạn nói đúng. Đây là một cách khác để làm điều đó. Tôi vừa đề cập đến cách tôi nghĩ là tốt hơn. Trong trường hợp thứ hai này, bạn phải thêm mã vào mỗi hộp thoại mà bạn muốn hiển thị các nhãn bằng màu khác. –

+1

Vâng, tôi đồng ý, trong trường hợp này theo cách của bạn là cách tốt hơn. Cách của tôi có thể được sử dụng nếu ai đó muốn thực hiện một cải tiến lớn trong toàn bộ hộp thoại (hoặc ứng dụng). – djeidot

+2

Sự trở lại (HBRUSH) GetStockObject (NULL_BRUSH); sẽ gây ra một vấn đề sơn (hoặc một nền trong suốt 'tính năng' sôi nổi). Bạn có thể muốn quay trở lại (HBRUSH) GetStockObject (WHITE_BRUSH); –

7

tiếc là bạn sẽ không tìm thấy phương thức SetTextColor trong lớp CStatic. Nếu bạn muốn thay đổi màu văn bản của CStatic, bạn sẽ phải viết mã nhiều hơn một chút.

Theo ý kiến ​​của tôi, cách tốt nhất là tạo lớp CStatic có nguồn gốc riêng của bạn (CMyStatic) và có cacth thông báo thông báo ON_WM_CTLCOLOR_REFLECT.

BEGIN_MESSAGE_MAP(CMyStatic, CStatic) 
    //{{AFX_MSG_MAP(CMyStatic) 
    ON_WM_CTLCOLOR_REFLECT() 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
{ 
    pDC->SetTextColor(RGB(255,0,0)); 

    return (HBRUSH)GetStockObject(NULL_BRUSH); 
} 

Rõ ràng bạn có thể sử dụng biến thành viên và phương thức setter để thay thế màu đỏ (RGB (255,0,0)).

Trân trọng.

+1

Cám ơn giải pháp của bạn. Nó hoạt động với một số tác dụng phụ không mong muốn. Bây giờ điều khiển tĩnh của tôi có màu nền điều khiển khác với chế độ xem chính của tôi, cũng có, nền văn bản màu trắng. – Sheen

6

Chỉ cần một theo dõi các vấn đề bức tranh (nền trong suốt), mà do * return (HBRUSH) GetStockObject (NULL_BRUSH); *

Dễ dàng thay đổi như sau:

HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 

if (nCtlColor == CTLCOLOR_STATIC && 
    pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd() 
) pDC->SetTextColor(RGB(255, 0, 0));  

return hBrush; 

Hy vọng điều này giúp.

2

Từ các câu trả lời được đưa ra ở đây và các địa điểm khác, không rõ cách tạo lớp dẫn xuất được sử dụng thay cho CStatic xử lý màu.

Vì vậy, sau đây là những gì làm việc cho tôi, sử dụng MSVS 2013 Phiên bản 12.0.40629.00 Cập nhật 5. Tôi có thể đặt điều khiển "Văn bản tĩnh" trong trình chỉnh sửa tài nguyên, sau đó thay thế loại biến thành viên bằng TColorText.

Trong .h-file:

class TColorText : public CStatic 
{ 
protected: 
    DECLARE_MESSAGE_MAP() 

public: 
    // make the background transparent (or if ATransparent == true, restore the previous background color) 
    void setTransparent(bool ATransparent = true); 
    // set background color and make the background opaque 
    void SetBackgroundColor(COLORREF); 
    void SetTextColor(COLORREF); 

protected: 
    HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); 

private: 
    bool MTransparent = true; 
    COLORREF MBackgroundColor = RGB(255, 255, 255); // default is white (in case someone sets opaque without setting a color) 
    COLORREF MTextColor = RGB(0, 0, 0); // default is black. it would be more clean 
             // to not use the color before set with SetTextColor(..), but whatever... 
}; 

trong cpp-file:

void TColorText::setTransparent(bool ATransparent) 
{ 
    MTransparent = ATransparent; 
    Invalidate(); 
} 

void TColorText::SetBackgroundColor(COLORREF AColor) 
{ 
    MBackgroundColor = AColor; 
    MTransparent = false; 
    Invalidate(); 
} 

void TColorText::SetTextColor(COLORREF AColor) 
{ 
    MTextColor = AColor; 
    Invalidate(); 
} 

BEGIN_MESSAGE_MAP(TColorText, CStatic) 
    ON_WM_CTLCOLOR_REFLECT() 
END_MESSAGE_MAP() 

HBRUSH TColorText::CtlColor(CDC* pDC, UINT nCtlColor) 
{ 
    pDC->SetTextColor(MTextColor); 
    pDC->SetBkMode(TRANSPARENT); // we do not want to draw background when drawing text. 
            // background color comes from drawing the control background. 
    if(MTransparent) 
    return nullptr; // return nullptr to indicate that the parent object 
        // should supply the brush. it has the appropriate background color. 
    else 
    return (HBRUSH) CreateSolidBrush(MBackgroundColor); // color for the empty area of the control 
} 
1

Rất hữu ích.

https://msdn.microsoft.com/de-de/library/0wwk06hc.aspx

tương tự để

HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
if (nCtlColor == CTLCOLOR_STATIC && 
    pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd() 
) pDC->SetTextColor(RGB(255, 0, 0));  
return hBrush; 
Các vấn đề liên quan