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

Posted

技术标签:

【中文标题】MFC:如何通过鼠标滚轮启用页面更改以进行打印预览?【英文标题】:MFC: how to enable page change via mouse wheeling for print preview? 【发布时间】:2020-04-13 18:10:40 【问题描述】:

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

【问题讨论】:

Printing and Print Preview 提供文档以及Print Preview Architecture 的概述。 【参考方案1】:

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

BOOL MyPreviewView::OnMouseWheel(UINT /*flags*/, short delta, CPoint /*point*/)

    OnVScroll(UINT((delta < 0) ? SB_LINEDOWN : SB_LINEUP), 0, nullptr);
    return TRUE;

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

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

请随时要求进一步澄清和/或解释。

【讨论】:

谢谢!它工作得很好,但我可以要求一些改进:(a)如何一次推进一页?现在,使用您的代码,每个滚动刻度都会前进几页(在我的情况下大约 30 页),并且(b)我似乎无法回滚到第一页。当我回滚到第 30 页左右时,再回滚一个刻度会将我带到最后一页?? @user180574 也许尝试使用SB_LINEDOWNSB_LINEUP 以获得更精细的滚动。这可能很好,在这种情况下,您必须多次调用OnVScroll。更多信息here. @user180574 如果LINE_ 版本有效,请告诉我,以便我可以相应地编辑我的答案。 @user180574 让我们先解决 (a) - 如果我们得到排序,我们可以解决 (b)。 @user180574 PAGELINE 术语令人困惑 - SB_LINEUP 用于单击滚动条末端的向上箭头,而 SB_PAGEUP 用于单击栏本身,在拖动器和栏的末端之间。后者的实际页数可能会随文档的整体大小(# 页)而变化。【参考方案2】:

这是对Adrian Mole's Answer现有答案的补充

如果您还没有使用自定义类,这是该类的完整实现:​​

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
    

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

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

【讨论】:

以上是关于MFC:如何通过鼠标滚轮启用页面更改以进行打印预览?的主要内容,如果未能解决你的问题,请参考以下文章

CefSharp如何进行页面的缩放(即Ctrl+滚轮)

js中如何禁用鼠标滚轮事件?急,在线等!

如何更改 PyQtGraph ImageView 中的鼠标滚轮行为?

VC 鼠标滚轮事件控制绘图的问题

QML PathView:通过鼠标滚轮更改路径视图的当前索引

用js实现页面图片,以鼠标位置为中心,滚轮缩放图片