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);
在打印预览对话框中,我想通过鼠标滚动启用页面切换。由于我还是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);