下载的一个关于XP风格按钮示例
对话框启动时按钮没有边界,鼠标在上面的时候就有边界了
我想知道画边界是怎么实现的,找了半天没找到

解决方案 »

  1.   

    DWORD CWinXPButtonST::OnDrawBorder(CDC* pDC, CRect* pRect)
    {
    return BTNST_OK;
    }
    这个是为了不画边界,是吗?
      

  2.   

    自己从CButton派生一个下来吧,在网上找找“任意形状按钮”之类的
    应该有很多这种源码
      

  3.   

    CWinXPButtonST就是派生的类
    关键问题是我不知道它在哪里绘制边界
    MOUSEMOVE吗?没有找到
      

  4.   

    ^_^。。不清楚。。
    不过,我按照《windows程序设计》
    上的一个例子(用Custom Control注册一个类),
    稍加扩充来模拟XP风格按钮。
      

  5.   

    DWORD CWinXPButtonST::OnDrawBorder(CDC* pDC, CRect* pRect)
    {
    CPen penBorder;
    penBorder.CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    CPen* pOldPen = pDC->SelectObject(&penBorder);
    return BTNST_OK;
    }
    本来以为这样应该就可以了,但是却没有效果,依然没有边界
      

  6.   

    要3个函数。
    首先重载CButton类。
    然后添加变量
    UINT m_BitmapNow;//将要显示的位图ID好
    BOOL m_bMouseCaptured;//标记鼠标是否移动到按钮上
    同时将OnLbuttonUp()
    {
    return TRUE;//直接
    }
    然后是OnMouseMove()
    {
            CRect m_Rect;
    GetClientRect(&m_Rect);
    /*你的绘图代码*/
    //鼠标在窗口外,释放鼠标捕获
    if (!m_Rect.PtInRect(point))
    {
    if (!m_bMouseCaptured) 
    return;
    ReleaseCapture();
    }
    else
    {
    //鼠标在窗口内,设置鼠标捕获
    if (m_bMouseCaptured) return;
    SetCapture();

    CWnd::OnMouseMove(nFlags, point);
    }
    还有就是改 
    void CMyButton::OnCaptureChanged(CWnd *pWnd)
    {
    //当鼠标标记改变是,改变标记变量同时改变背景位图ID
    if (m_bMouseCaptured)
    {
    m_bMouseCaptured=FALSE;//鼠标移出
    m_BitmapNow=IDB_DOWN1;//此处是开始鼠标已移动到窗口上现在移出,还原为原来位图
    }
    else
    {
    m_bMouseCaptured=TRUE;//鼠标移入
    m_BitmapNow=IDB_DOWN2;//鼠标进入,改变显示位图ID
    }
    CWnd::OnCaptureChanged(pWnd);
    InvalidateRect(&m_Rect);/此处调用OnPaint();重绘按钮
    }
      

  7.   

    CDC::DrawFocusRect( LPCRECT lpRect ); 
    这外函数看能行不