1. 程式人生 > >改變對話框和控件的背景及文本顏色

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

文件夾 png desire urn idc line 行程 msg odt

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;
}

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