天天看點

改變對話框和控件的背景及文本顔色

WM_CTLCOLOR,響應函數:CWnd::OnCtlColor

  afx_msg HBRUSH OnCtlColor(

    CDC* pDC,  //目前要繪制的控件的裝置上下文的指針

    CWnd* pWnd,  //目前要繪制的控件的指針

    UINT nCtlColor  //要繪制的控件的類型

  );

1、改變整個對話框及其上子控件的背景色

  為程式的“設定”對話框CSettingDlg添加WM_CTLCOLOR指令消息及其消息響應函數:

    

改變對話框和控件的背景及文本顔色

  在對話框類CSettingDlg類中添加私有成員變量:CBrush m_brush,并在CSettingDlg類的構造函數中利用CreateSolidBrush函數将該畫刷初始化為藍色,然後更改消息響應函數OnCtlColor函數中傳回的畫刷句柄為該自定義的畫刷句柄:

    

改變對話框和控件的背景及文本顔色

    

CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSettingDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CSettingDlg)
    m_brush.CreateSolidBrush(RGB(0,0,255));
    //}}AFX_DATA_INIT
}
           
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: Change any attributes of the DC here
    
    // TODO: Return a different brush if the default is not desired
    //return hbr;
    return m_brush;
}
           

2、僅改變某個子控件的背景及文本顔色

  OnCtlColor函數的第二個參數pWnd可以表明目前繪制的控件是哪個,通過調用CWnd類的GetDlgCtrlID函數得到該控件的ID,若該ID為我們想要改變其背景的控件的ID,則更改OnCtlColor函數的傳回畫刷句柄為自定義的畫刷句柄,否則傳回預設畫刷句柄;   

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: Change any attributes of the DC here
    
    // TODO: Return a different brush if the default is not desired
    if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){
        return m_brush;
    }
    return hbr;
}
           

  若要改變控件上的文本顔色,須在OnCtlColor函數傳回畫刷句柄之前調用SetTextColor函數修改控件上的文本顔色:    

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: Change any attributes of the DC here
    
    // TODO: Return a different brush if the default is not desired
    //修改組框
    if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){
        pDC->SetTextColor(RGB(255,0,0));  //修改文本顔色
        pDC->SetBkMode(TRANSPARENT);  //修改文本背景為透明
        return m_brush;
    }
    //修改編輯框
    if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH){
        pDC->SetTextColor(RGB(255,0,0));  //修改編輯框中文本顔色
        pDC->SetBkColor(RGB(0,0,255));  //修改編輯框背景色
        return m_brush;
    }

    return hbr;
}
           

3、改變按鈕控件的背景色及文本顔色

  若要改變按鈕控件的文本顔色,需要自定義一個派生于CButton類的按鈕類,并重寫DrawItem虛函數,在此函數中實作按鈕背景色和其上文本顔色的設定,然後将需要改變的按鈕控件對象與這個自定義的按鈕類相關聯;

  在工程名上右擊建立類:

  

改變對話框和控件的背景及文本顔色

  在該建立類上右擊添加虛函數DrawItem,并在其中重寫按鈕繪制代碼:

  

改變對話框和控件的背景及文本顔色

  

void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
    // TODO: Add your code to draw the specified item
    UINT uStyle=DFCS_BUTTONPUSH;
    ASSERT(lpDrawItemStruct->CtlType==ODT_BUTTON);
    if(lpDrawItemStruct->itemState & ODS_SELECTED){
        uStyle |= DFCS_PUSHED;
    }
    ::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,uStyle);
    CString strText;
    GetWindowText(strText);
    COLORREF crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(255,0,0));
    ::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
    ::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
    
}
           

  将“設定”對話框的【OK】按鈕關聯至新的自定義類的成員變量:

  

改變對話框和控件的背景及文本顔色

    會提示要在對話框的頭檔案中包含自定義類的頭檔案:

    #include "TestBtn.h"

  将對話框中【OK】按鈕的屬性樣式中的“所有者繪制”勾選:

  

改變對話框和控件的背景及文本顔色

  運作程式,【OK】按鈕的文本已經變成紅色;若要改變按鈕控件的背景色,須上網百度下載下傳“CButtonST”類,将該類的頭檔案.h和源檔案.cpp放到自己的工程檔案夾中,在VC中将類的這兩個檔案添加到工程;為所要改的按鈕控件添加關聯的成員變量m_btnST,選擇變量類名時沒有“CButtonST”類,先随便選擇一個,完成變量關聯後到按鈕所在對話框類的頭檔案中找到新增變量的定義,手動将其類型改為“CButtonST”,并在對話框頭檔案中包含“CButtonST”類的頭檔案;使用CButtonST類時無須更改按鈕屬性樣式為“所有者繪制”;為對話框類添加WM_INITDIALOG消息的響應函數OnInitDialog,在該函數中将按鈕的背景色和前景色初始化:

    m_btnST.SetActiveBgColor(RGB(0,0,255));  //活動狀态的背景色

    m_btnST.SetActiveFgColor(RGB(255,0,0));  //活動狀态的前景色

    m_btnST.SetInactiveBgColor(RGB(255,0,255));  //非活動狀态的背景色

    m_btnST.SetInactiveFgColor(RGB(255,255,0));  //非活動狀态的前景色

4、改變控件上的文本字型

  為程式對話框資源添加一個靜态文本控件,ID為IDC_TEXT,在程式中修改該控件的文本;

  先為對話框類CSettingDlg類添加私有成員變量:CFont m_font,并在CSettingDlg類的構造函數中将其初始化:

    

改變對話框和控件的背景及文本顔色

    

CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSettingDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CSettingDlg)
    m_font.CreatePointFont(200,"黑體");
    //}}AFX_DATA_INIT
}
           

  在CSettingDlg類的OnCtlColor函數中判斷目前繪制的若為靜态文本控件,則将自定義的字型選入裝置描述表中,該控件的文本即以新字型顯示:  

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: Change any attributes of the DC here
    
    // TODO: Return a different brush if the default is not desired

    if(pWnd->GetDlgCtrlID()==IDC_TEXT){
        pDC->SelectObject(&m_font);
    }

    return hbr;
}
           

轉載于:https://www.cnblogs.com/zhouwanqiu/p/6918860.html