如何更改 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);
在初始化表单的方法(OnInitDialog
、Create
等)上添加一行
m_btnRead.SetFaceColor(RGB(0, 255, 255));
现在你已经完成了!
【讨论】:
@sergiol.sir 你能ping我吗,我的skype id:tomy王子 确实,设置按钮的背景颜色不是很有帮助! @sergiol.是否有任何选项可用于更改属性窗口中的背景颜色 我认为这对于一个新人来说会很容易。 让我们continue this discussion in chat。以上是关于如何更改 mfc 应用程序的背景属性的主要内容,如果未能解决你的问题,请参考以下文章