有没有可以使所有的控件实现扁平效果?我见过有一个程序中所有的控件都有扁平效果,即鼠标放上去之后控件的下边缘和右边缘会出现立体效果!!(或者整个控件的边缘都出现立体效果)怎么实现的?有谁知道?应该是一个外部代码? 请注意是所有控件!!!!!!应该是有现成的类或是一些现成的代码!!!

解决方案 »

  1.   

    CButtonST可以实现你想要的所有功能
    下载地址
    http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=301搂主给分吧
      

  2.   

    我做上个项目时重写了Edit,Button,CombBox三个控件,如果需要,Email其实写出来的效果就是回到了从前的二维界面……
      

  3.   

    贴出部分代码:
    // MyEdit.h : header file
    //
    #define FE_MOUSEOVER 1
    #define FE_MOUSEOUT 2/////////////////////////////////////////////////////////////////////////////
    // CMyEdit windowclass CMyEdit : public CEdit
    {
    // Construction
    public:
    CMyEdit();
    bool m_bFlatStyle;
    bool m_bDrawGripper;
    bool m_bDrawSeperator;// Attributes
    public:
    bool m_bLBtnDown;
    COLORREF m_clrHilite;
    COLORREF m_clrShadow;
    COLORREF m_clrDkShad;
    COLORREF m_clrButton;// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyEdit)
    //}}AFX_VIRTUAL// Implementation
    public:
    void SetIndent(int margin);
    void DrawEdit(int style, COLORREF clrTopLeft, COLORREF clrBottomRight);
    virtual ~CMyEdit(); // Generated message map functions
    protected:
    //{{AFX_MSG(CMyEdit)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnPaint();
    afx_msg void OnSysColorChange();
    afx_msg void OnTimer(UINT nIDEvent);
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_MYEDIT_H__11086D8D_DD05_4977_A8E9_0BE5CCE562B8__INCLUDED_)
      

  4.   

    #include "stdafx.h"
    #include "Manerger.h"
    #include "MyEdit.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CMyEditCMyEdit::CMyEdit()
    {
    m_clrHilite = GetSysColor(COLOR_BTNHIGHLIGHT);
    m_clrShadow = GetSysColor(COLOR_BTNSHADOW);
    m_clrDkShad = GetSysColor(COLOR_3DDKSHADOW);
    m_clrButton = GetSysColor(COLOR_BTNFACE);
    m_bDrawGripper = TRUE;
    m_bDrawSeperator = TRUE;
    m_bFlatStyle = TRUE;
    }CMyEdit::~CMyEdit()
    {
    }
    BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
    //{{AFX_MSG_MAP(CMyEdit)
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_MOUSEMOVE()
    ON_WM_PAINT()
    ON_WM_SYSCOLORCHANGE()
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CMyEdit message handlersvoid CMyEdit::OnMouseMove(UINT nFlags, CPoint point) 
    {
    SetTimer(1, 10, NULL);
    CEdit::OnMouseMove(nFlags, point);
    }void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    m_bLBtnDown = true;
    CEdit::OnLButtonDown(nFlags, point);
    }void CMyEdit::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    m_bLBtnDown = false;
    CEdit::OnLButtonUp(nFlags, point);
    }void CMyEdit::OnTimer(UINT nIDEvent) 
    {
    POINT pt;
    GetCursorPos(&pt);
    CRect rcItem;
    GetWindowRect(&rcItem); static bool bPainted = false; if(!rcItem.PtInRect(pt)) {
    KillTimer(1);
    DrawEdit(FE_MOUSEOUT, m_clrButton, m_clrButton);
    return;
    }
    else {
    DrawEdit(FE_MOUSEOVER, m_clrShadow, m_clrHilite);
    }
    CEdit::OnTimer(nIDEvent);
    }void CMyEdit::OnPaint() 
    {
    Default();
    DrawEdit(FE_MOUSEOUT, m_clrButton, m_clrButton);
    }void CMyEdit::OnSysColorChange() 
    {
    CEdit::OnSysColorChange();
    m_clrHilite = GetSysColor(COLOR_BTNHIGHLIGHT);
    m_clrShadow = GetSysColor(COLOR_BTNSHADOW);
    m_clrDkShad = GetSysColor(COLOR_3DDKSHADOW);
    m_clrButton = GetSysColor(COLOR_BTNFACE);
    }void CMyEdit::DrawEdit(int style, COLORREF clrTopLeft, COLORREF clrBottomRight)
    {
    CRect rcItem;
    CRect rcGripper;
    CRect rcSeperator; GetClientRect(&rcItem);
    GetClientRect(&rcGripper);
    GetClientRect(&rcSeperator); CDC* pDC = GetDC();
    COLORREF clrBlack;
    clrBlack = RGB(0, 0, 0); if(m_bFlatStyle)
    {
    pDC->Draw3dRect(rcItem, clrTopLeft, clrBottomRight);
    rcItem.InflateRect(1,1);

    if (!IsWindowEnabled()) {
    pDC->Draw3dRect(rcItem, m_clrHilite, m_clrHilite);
    }

    else {
    pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton);
    } rcItem.InflateRect(1,1);
    pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton);
    rcItem.InflateRect(1,1);
    pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton);
    rcItem.InflateRect(1,1);
    pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton);

    rcItem.DeflateRect(4, 4); pDC->MoveTo (rcItem.left -1,rcItem.top-1);
    pDC->LineTo(rcItem.right,rcItem.top-1);
    pDC->LineTo(rcItem.right,rcItem.bottom);
    pDC->LineTo(rcItem.left -1,rcItem.bottom);
    pDC->LineTo(rcItem.left -1,rcItem.top-1); if (!IsWindowEnabled()) {
    return;
    }

    if(style == FE_MOUSEOVER)
    {
    pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton); //added this
    rcItem.top -= 1; //added this
    rcItem.left -= 1;
    rcItem.bottom += 1;
    rcItem.right += 1; //added this
    pDC->Draw3dRect(rcItem, m_clrShadow, m_clrHilite); //was hilite, shadow
    }
    }
    else 
    {
    pDC->Draw3dRect(rcItem, clrBlack, clrBlack);
    rcItem.InflateRect(1, 1);
    pDC->Draw3dRect(rcItem, clrBlack, clrBlack);
    pDC->Draw3dRect(rcItem, clrBlack, clrBlack);
    rcItem.InflateRect(1,1); pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton);
    rcItem.InflateRect(1,1);
    pDC->Draw3dRect(rcItem, m_clrButton, m_clrButton);
    rcItem.DeflateRect(4, 4);

    if(m_bDrawGripper)
    {
    rcGripper.top = rcItem.top - 2;
    rcGripper.bottom = rcItem.bottom + 2;
    rcGripper.left -= 6;
    rcGripper.right = rcGripper.left + 2;
    pDC->Draw3dRect(rcGripper, clrBlack, clrBlack);
    rcGripper.left -= 3;
    rcGripper.right -= 3;
    pDC->Draw3dRect(rcGripper, clrBlack, clrBlack);
    } if(m_bDrawSeperator)
    {
    rcSeperator.top = rcItem.top - 2;
    rcSeperator.bottom = rcItem.bottom + 2;
    rcSeperator.left = rcItem.right + 4;
    rcSeperator.right = rcSeperator.left + 2;
    pDC->Draw3dRect(rcSeperator, clrBlack, clrBlack);
    }
    } ReleaseDC(pDC);
    }void CMyEdit::SetIndent(int margin)
    {
    SetMargins(margin, 1);
    }
      

  5.   

    楼主所看到的程序应该是
    http://www.codeguru.com/controls/CoolControlsLibrary.shtml
    其基本思想是通过给控件的窗口函数挂钩,用自己的绘制方法来实现的,由于控件的多样性,其代码量相当大,值得学习。
      

  6.   

    需要提醒搂主的是,所有控件都实现此效果是不可能的,这个程序也只是做到了改写它所支持的Windows标准控件而已。这样的界面在Windows XP下面就显得丑陋,不合时宜了。