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_LINEDOWN
和SB_LINEUP
以获得更精细的滚动。这可能太很好,在这种情况下,您必须多次调用OnVScroll
。更多信息here.
@user180574 如果LINE_
版本有效,请告诉我,以便我可以相应地编辑我的答案。
@user180574 让我们先解决 (a) - 如果我们得到排序,我们可以解决 (b)。
@user180574 PAGE
和 LINE
术语令人困惑 - 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:如何通过鼠标滚轮启用页面更改以进行打印预览?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改 PyQtGraph ImageView 中的鼠标滚轮行为?