首先把mfcbutton的颜色重绘为渐变,点击按钮获得焦点时按钮会闪烁,有一瞬间变为白色,然后又变回原来的渐变颜色,请问这个是怎么解决?
#pragma once
#include "afxbutton.h"
class CMainButton :
public CMFCButton
{
public:
CMainButton();
~CMainButton();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg void OnPaint();
afx_msg void OnSetFocus(CWnd* pOldWnd); DECLARE_MESSAGE_MAP()
};
#include "stdafx.h"
#include "MainButton.h"BEGIN_MESSAGE_MAP(CMainButton, CMFCButton)
ON_WM_SETFOCUS()
END_MESSAGE_MAP()CMainButton::CMainButton()
{
}
CMainButton::~CMainButton()
{
}void CMainButton::OnPaint()
{
CMFCButton::OnPaint();}void CMainButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CMFCButton::DrawItem(lpDrawItemStruct);
CRect rect;
GetClientRect(rect);
CClientDC dc(this);
for (int i = 0; i < rect.Width(); i++)
{
int r, g, b;
r = 144 - i * 57 / rect.Width();
g = 175 - i * 49 / rect.Width();
b = 247 + i * 6 / rect.Width();
dc.FillSolidRect(i, 0, 1, rect.Height(), RGB(r, g, b));
}}void CMainButton::OnSetFocus(CWnd* pOldWnd)
{
CMFCButton::OnSetFocus(pOldWnd);
CRect rect;
GetClientRect(rect);
CClientDC dc(this);
dc.FillSolidRect(rect, RGB(255, 255, 255));
}
#pragma once
#include "afxbutton.h"
class CMainButton :
public CMFCButton
{
public:
CMainButton();
~CMainButton();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg void OnPaint();
afx_msg void OnSetFocus(CWnd* pOldWnd); DECLARE_MESSAGE_MAP()
};
#include "stdafx.h"
#include "MainButton.h"BEGIN_MESSAGE_MAP(CMainButton, CMFCButton)
ON_WM_SETFOCUS()
END_MESSAGE_MAP()CMainButton::CMainButton()
{
}
CMainButton::~CMainButton()
{
}void CMainButton::OnPaint()
{
CMFCButton::OnPaint();}void CMainButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CMFCButton::DrawItem(lpDrawItemStruct);
CRect rect;
GetClientRect(rect);
CClientDC dc(this);
for (int i = 0; i < rect.Width(); i++)
{
int r, g, b;
r = 144 - i * 57 / rect.Width();
g = 175 - i * 49 / rect.Width();
b = 247 + i * 6 / rect.Width();
dc.FillSolidRect(i, 0, 1, rect.Height(), RGB(r, g, b));
}}void CMainButton::OnSetFocus(CWnd* pOldWnd)
{
CMFCButton::OnSetFocus(pOldWnd);
CRect rect;
GetClientRect(rect);
CClientDC dc(this);
dc.FillSolidRect(rect, RGB(255, 255, 255));
}
wndcls.hbrBackground = (HBRUSH)backGrush.m_hObject;
要重写CMFCButton的创建函数。另外有一个建议,用GDI++可以直接用渐变刷子,不用一点点描。
检查:
void CMainButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
afxDump << "OnMouseMove\n";
//
CButton::OnMouseMove(nFlags, point);
}
mousedown 会 setfocus 你画了 焦点
mouseup 你又 改变了 焦点 图。
这2个图 应该 是 兼容的