CMFCVisualManager 类的 OnDrawMenuShadow 方法用于绘制菜单的阴影。以下是一个简单的示例,展示如何重写 OnDrawMenuShadow 方法以自定义菜单阴影的绘制:
class CMyVisualManager : public CMFCVisualManager
{
public:
    virtual void OnDrawMenuShadow(CDC* pDC, const CRect& rectClient, const CRect& rectExclude, int nDepth, int iMinBrightness, int iMaxBrightness, CBitmap* pBmpSaveBottom, CBitmap* pBmpSaveRight, BOOL bRTL);
};

void CMyVisualManager::OnDrawMenuShadow(CDC* pDC, const CRect& rectClient, const CRect& rectExclude, int nDepth, int iMinBrightness, int iMaxBrightness, CBitmap* pBmpSaveBottom, CBitmap* pBmpSaveRight, BOOL bRTL)
{
    // 在这里添加你自己的绘制逻辑
    // 使用 pDC 绘制到指定的 rectClient 区域
    // rectExclude 表示要排除的区域
    // nDepth 表示阴影的深度,iMinBrightness 和 iMaxBrightness 表示阴影的最小和最大亮度
    // pBmpSaveBottom 和 pBmpSaveRight 是保存底部和右侧阴影的位图
    // bRTL 表示是否是右到左的布局

    // 举例:简单绘制一个阴影效果
    if (nDepth > 0)
    {
        CRect rectShadow = rectClient;

        if (!rectExclude.IsRectEmpty())
        {
            rectShadow = rectClient;
            rectShadow.DeflateRect(0, 0, 0, nDepth);
            rectShadow.IntersectRect(rectShadow, rectExclude);
        }

        int nStep = (iMaxBrightness - iMinBrightness) / nDepth;
        int nBrightness = iMaxBrightness;

        for (int i = 0; i < nDepth; i++)
        {
            CRect rectFill = rectShadow;
            rectFill.top = rectFill.bottom - 1;
            pDC->FillSolidRect(rectFill, RGB(nBrightness, nBrightness, nBrightness));

            rectFill = rectShadow;
            rectFill.left = rectFill.right - 1;
            pDC->FillSolidRect(rectFill, RGB(nBrightness, nBrightness, nBrightness));

            rectShadow.DeflateRect(1, 1);
            nBrightness -= nStep;
        }
    }
}

在上述示例中,CMyVisualManager 是自定义的 CMFCVisualManager 派生类,通过重写 OnDrawMenuShadow 方法,可以实现自定义的菜单阴影绘制逻辑。具体的绘制效果和样式会根据你的需求而变化。


转载请注明出处:http://www.zyzy.cn/article/detail/20527/MFC/CMFCVisualManager