MFC:如何通过鼠标滚动启用页面更改以进行打印预览?

MFC: how to enable page change via mouse wheeling for print preview?

在打印预览对话框中,我想通过鼠标滚动启用页面切换。由于我还是MFC编程的初学者,所以我没有代码可以入手。我发现的最接近的问题是这个问题(对于 C#),但还没有明确的答案:https://www.codeproject.com/Questions/555242/5bc-23-5dplusprintpreviewdialogplusandplusmousewhe.

如果您正在使用 MFC 的 CPreviewView class,那么您可以从中派生一个自定义的 class,您可以在其中覆盖 OnMouseWheel 成员。在您的覆盖中,您将调用 OnVScroll 处理程序向上或向下移动,就像您单击了滚动条的 up/down 箭头一样:

BOOL MyPreviewView::OnMouseWheel(UINT /*flags*/, short delta, CPoint /*point*/)
{
    OnVScroll(UINT((delta < 0) ? SB_LINEDOWN : SB_LINEUP), 0, nullptr);
    return TRUE;
}

此外,您需要将 ON_WM_MOUSEWHEEL() 添加到派生的 class' 消息映射中:

BEGIN_MESSAGE_MAP(MyPreviewView, CPreviewView)
    //...
    ON_WM_MOUSEWHEEL()
    //...
END_MESSAGE_MAP()

随时要求进一步澄清and/or解释。

这是对

现有答案的补充

如果您还没有使用自定义 class,这是 class:

的完整实现

MyPreviewViewEx.h

// CMyPreviewViewEx view

class CMyPreviewViewEx : public CPreviewViewEx
{
    DECLARE_DYNCREATE(CMyPreviewViewEx)

protected:
    CMyPreviewViewEx()              {}           // protected constructor used by dynamic creation
    virtual ~CMyPreviewViewEx()     {}

    DECLARE_MESSAGE_MAP()
public:
    afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
    static void MyPrintPreview(CView* pView);
};

MyPreviewViewEx.cpp

// CMyPreviewViewEx
IMPLEMENT_DYNCREATE(CMyPreviewViewEx, CPreviewViewEx)

BEGIN_MESSAGE_MAP(CMyPreviewViewEx, CPreviewViewEx)
    ON_WM_MOUSEWHEEL()
END_MESSAGE_MAP()


// CMyPreviewViewEx message handlers

BOOL CMyPreviewViewEx::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
    OnVScroll(UINT((zDelta < 0) ? SB_LINEDOWN : SB_LINEUP), 0, nullptr);
    return TRUE;
}

// Override AFXPrintPreview
void CMyPreviewViewEx::MyPrintPreview(CView* pView)
{
    ASSERT_VALID(pView);

    CPrintPreviewState *pState= new CPrintPreviewState;

    if (!pView->DoPrintPreview(IDD_AFXBAR_RES_PRINT_PREVIEW, pView, RUNTIME_CLASS(CMyPreviewViewEx), pState))
    {
        TRACE0("Error: OnFilePrintPreview failed.\n");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        delete pState;      // preview failed to initialize, delete State now
    }
}

在视图 class 中,根据需要进行更改

// AFXPrintPreview(pView);
CMyPreviewViewEx::MyPrintPreview(pView);