首先把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));
}

解决方案 »

  1.   

    OnEraseBkgnd(CDC* pDC) return TRUE;
      

  2.   

    注册窗口类时不要这一项就不会画窗口
    wndcls.hbrBackground = (HBRUSH)backGrush.m_hObject;
    要重写CMFCButton的创建函数。另外有一个建议,用GDI++可以直接用渐变刷子,不用一点点描。
      

  3.   

    GDI+ 渐变颜色   LinearGradientBrushLinearGradientBrush是用来渐变效果的,使用的初始化参数是矩形区域,开始颜色,结束颜色,颜色变化方向,它能够形成比较统一的渐变效果,对比PathGradientBrush的渐变,它的特点是它与周围的颜色渐变频率是一样的,设置LinearGradientBrush的区域大小时,可以想象一个大的有渐变色的长方形,压在多边形上面,并根据多边形的边界裁剪。
      

  4.   

    GDI+渐变颜色确实比我一点点描好多了,多谢,但是我在DrawItem打完断点后,只要鼠标点击或滑倒按钮上就会触发DrawItem,不知道这个问题是什么造成的?
      

  5.   

    "只要鼠标点击或滑倒按钮上就会触发DrawItem"
    检查:
    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);
    }
      

  6.   

    我要做的效果是点击时,按钮获得焦点显示高亮,但是现在总会点击后闪烁了一下变成获得焦点时设置的颜色,之后马上又变回渐变颜色,也就是DrawItem运行了多次,覆盖掉了按钮获得焦点时设置的颜色
      

  7.   

    OnSetfocus() 怎么写的 ?
      

  8.   

    点击后 调用 OnSetfocus() ?, 那么 点击 本身的 响应呢 ?
      

  9.   

    点击 是 mousedown 和 mouseup 的 组合
    mousedown 会 setfocus 你画了 焦点
    mouseup 你又 改变了 焦点 图。
    这2个图 应该 是 兼容的