如何更改 mfc 应用程序的背景属性

Posted

技术标签:

【中文标题】如何更改 mfc 应用程序的背景属性【英文标题】:How to change the background properties of an mfc application 【发布时间】:2018-05-03 13:10:45 【问题描述】:

当前用户界面

新用户界面

我想更改 MFC 应用程序中按钮的背景颜色。我在 MFC 中创建了我的用户界面(UI)。我从工具箱中添加了每个控件。但问题是我想更改按钮和窗口的背景和前景属性。这怎么可能?

请帮我更改MFC中控件的属性。在windows应用程序中,我们可以直接更改属性窗口中的属性。 但在 MFC 应用程序的情况下,这是不可能的。

请帮助我..我在 MFC 应用程序开发方面没有足够的经验..... 在此先感谢.......................

来自 dialer.h 的代码

   class CButtonDialer : public CButton

// Construction
public:
    CButtonDialer();

// Attributes
public:
    CButton m_button;

//  CButton IDC_KEY_1;
    CBrush m_brush;

// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //AFX_VIRTUAL(CButtonDialer)
    public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);


// Implementation
public:
    virtual ~CButtonDialer();
// Generated message map functions
protected:
    //AFX_MSG(CButtonDialer)
        // NOTE - the ClassWizard will add and remove member functions here.
    //AFX_MSG
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    CFont m_FontLetters;
    CMapStringToString m_map;
    HTHEME m_hTheme; 


    void OpenTheme()  m_hTheme = OpenThemeData(m_hWnd, L"Button"); 
    void CloseTheme() 
        if (m_hTheme)  CloseThemeData(m_hTheme); m_hTheme = NULL; 
    
    DECLARE_MESSAGE_MAP()

    virtual void PreSubclassWindow();
    afx_msg LRESULT OnThemeChanged();
    afx_msg void OnMouseMove(UINT,CPoint);
    afx_msg void OnSize(UINT type, int w, int h);
;

dialer.cpp 文件中的代码

#include "stdafx.h"
#include "ButtonDialer.h"
#include "Strsafe.h"
#include "const.h"

/////////////////////////////////////////////////////////////////////////////
// CButtonDialer

CButtonDialer::CButtonDialer()

    //255,255,255
    m_brush.CreateSolidBrush(
        (173, 41, 41));
    m_map.SetAt(_T("1"),_T(""));
    m_map.SetAt(_T("2"),_T("ABC"));
    m_map.SetAt(_T("3"),_T("DEF"));
    m_map.SetAt(_T("4"),_T("GHI"));
    m_map.SetAt(_T("5"),_T("JKL"));
    m_map.SetAt(_T("6"),_T("MNO"));
    m_map.SetAt(_T("7"),_T("PQRS"));
    m_map.SetAt(_T("8"),_T("TUV"));
    m_map.SetAt(_T("9"),_T("WXYZ"));
    m_map.SetAt(_T("0"),_T(""));
    m_map.SetAt(_T("*"),_T(""));
    m_map.SetAt(_T("#"),_T(""));


CButtonDialer::~CButtonDialer()

    CloseTheme();



BEGIN_MESSAGE_MAP(CButtonDialer, CButton)
    ON_WM_THEMECHANGED()
    ON_WM_MOUSEMOVE()
    ON_WM_SIZE()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CButtonDialer message handlers

void CButtonDialer::PreSubclassWindow()

    OpenTheme();

    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    LOGFONT lf;
    GetObject(hFont, sizeof(LOGFONT), &lf);
    lf.lfHeight = 14;
    StringCchCopy(lf.lfFaceName,LF_FACESIZE,_T("Microsoft Sans Serif"));
    m_FontLetters.CreateFontIndirect(&lf);

    DWORD dwStyle = ::GetClassLong(m_hWnd, GCL_STYLE);
    dwStyle &= ~CS_DBLCLKS;
    ::SetClassLong(m_hWnd, GCL_STYLE, dwStyle);


LRESULT CButtonDialer::OnThemeChanged() 

    CloseTheme();
    OpenTheme();
    return 0L;


void CButtonDialer::OnSize(UINT type, int w, int h)

    CButton::OnSize(type, w, h);


void CButtonDialer::OnMouseMove(UINT nFlags,CPoint point)

    CRect rect;
    GetClientRect(&rect);
    if (rect.PtInRect(point)) 
        if (GetCapture() != this) 
            SetCapture();
            Invalidate();
        
    
    else 
        ReleaseCapture();
        Invalidate();
    
    CButton::OnMouseMove(nFlags, point);


void CButtonDialer::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 

    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);       //Get device context object
    CRect rt;

    rt = lpDrawItemStruct->rcItem;      //Get button rect
    dc.FillSolidRect(rt,dc.GetBkColor());
    dc.SetBkMode(TRANSPARENT);

    CRect rtl = rt;
    UINT state = lpDrawItemStruct->itemState;   //Get state of the button

    if (!m_hTheme) 
        UINT uStyle = DFCS_BUTTONPUSH;
        if ( (state & ODS_SELECTED) ) 
            uStyle |= DFCS_PUSHED;
            rtl.left+=1;
            rtl.top+=1;
        
        dc.DrawFrameControl(rt, DFC_BUTTON, uStyle);
     else 
        UINT uStyleTheme = RBS_NORMAL;
        if ( (state & ODS_SELECTED) ) 
            uStyleTheme = PBS_PRESSED;
         else if (GetCapture()==this) 
            uStyleTheme = PBS_HOT;
        
        DrawThemeBackground(m_hTheme, dc.m_hDC,
            BP_PUSHBUTTON, uStyleTheme,
            rt, NULL);
    

    CString strTemp;
    GetWindowText(strTemp);     // Get the caption which have been set

    rtl.top += 4;
    CString letters;
    COLORREF crOldColor;
    if (m_map.Lookup(strTemp,letters)) 
        rtl.left+=15;
        dc.DrawText(strTemp,rtl,DT_LEFT|DT_TOP|DT_SINGLELINE);      // Draw out the caption
        HFONT hOldFont = (HFONT)SelectObject(dc.m_hDC, m_FontLetters);
        // Do your text drawing
        rtl.left += 13;
        rtl.top += 4;
        rtl.right -=4;
        crOldColor = dc.SetTextColor(RGB(148, 167, 70));
        dc.DrawText(letters,rtl,DT_LEFT | DT_TOP | DT_SINGLELINE);
        dc.SetTextColor(crOldColor);
        // Always select the old font back into the DC
        SelectObject(dc.m_hDC, hOldFont);
     else 
        //127,127,127
        crOldColor = dc.SetTextColor(RGB(148, 167, 70));
        dc.DrawText(strTemp,rtl,DT_CENTER|DT_TOP|DT_SINGLELINE);        // Draw out the caption
        dc.SetTextColor(crOldColor);
    

    if ( (state & ODS_FOCUS ) )       // If the button is focused
    
        int iChange = 3;
        rt.top += iChange;
        rt.left += iChange;
        rt.right -= iChange;
        rt.bottom -= iChange;
        dc.DrawFocusRect(rt);
    
    dc.Detach();


BOOL CButtonDialer::OnEraseBkgnd(CDC* pDC)

    CRect rect;
    GetClientRect(&rect);
    //255,255,255
    CBrush myBrush(RGB(173, 41, 41));    // dialog background color
    CBrush *pOld = pDC->SelectObject(&myBrush);
    BOOL bRes = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
    pDC->SelectObject(pOld);    // restore old brush
    return bRes;                       // CDialog::OnEraseBkgnd(pDC);

【问题讨论】:

参见CMFCButton 及其SetFaceColor 方法。 是否有任何选项可用于更改属性窗口中的背景颜色。 我有一些疑问。请帮助我。我无法解决解决方案。提前致谢。 【参考方案1】:

您需要为WM_ERASEBKGND message 提供消息处理程序并自己绘制背景。

【讨论】:

@Mark.让我检查一下 你的回答就像一门可以杀死蜘蛛的大炮! @sergiol Windows API 是完全原始的,这就是它的完成方式。不过,我已经很多年没有广泛使用 MFC,我不知道您在回答中提到的 CMFCButton。我敢肯定,如果您查看源代码,这正是它正在做的事情。 @Mark.是否有任何选项可用于更改属性窗口中的背景颜色 @MarkRansom : 所做的是在PreSubclassWindow 中将按钮声明为BS_OWNERDRAW 并在DrawItem 中定义绘图行为【参考方案2】:
    在资源编辑器上放置一个普通按钮。 在您使用它的表单的 .h 文件中,声明一个 CMFCButton 变量,如 m_btnRead

    在表单的DoDataExchange 方法中添加一行

    DDX_Control(pDX, IDC_BUTTON_READ, m_btnRead);
    

    在初始化表单的方法(OnInitDialogCreate 等)上添加一行

    m_btnRead.SetFaceColor(RGB(0, 255, 255));
    

现在你已经完成了!

【讨论】:

@sergiol.sir 你能ping我吗,我的skype id:tomy王子 确实,设置按钮的背景颜色不是很有帮助! @sergiol.是否有任何选项可用于更改属性窗口中的背景颜色 我认为这对于一个新人来说会很容易。 让我们continue this discussion in chat。

以上是关于如何更改 mfc 应用程序的背景属性的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中运行时更改编辑框属性

如何在 mfc 中更改 CImage 对象的背景颜色?

C ++ MFC更改单选框的背景颜色

更改 MFC 应用程序的背景颜色

MFC:如何更改整个编辑框的背景颜色?

在 MFC 控件中更改背景和标题的颜色