c#打印预览控件中实现用鼠标移动页面功能代码分享

时间:2021-09-30 16:08:56 

该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多看图类软件都有这种类似的功能。而.net的打印预览控件却很遗憾的没有提供这一功能,只来自己想办法来实现啦。

我的办法就是用代码来控制打印预览控件中的水平来垂直滚动条的位置,间接实现和用鼠标直接拖动滚动条一样的效果。

在实现这一功能的过程中,最大的困难是打印预览控件并没有让程序员直接调用的关于滚动条的方法或属性。所以只好向WinAPI求助了。

以下API函数和常量就是实现上述功能的关键了:


[DllImport("user32.dll")]
private static extern int SetScrollPos(IntPtr hwnd, int nBar, int nPos, bool bRedraw);
[DllImport("user32.dll")]
private static extern int GetScrollPos(IntPtr hwnd, int nBar);
[DllImport("user32.dll")]
private static extern bool PostMessage(IntPtr hWnd, int nBar, int wParam, int lParam);
[DllImport("user32", CharSet = CharSet.Auto)]
private static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos);

private const int SB_HORZ = 0x0;
private const int SB_VERT = 0x1;
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;
private const int SB_THUMBPOSITION = 4;

简单说明一下吧:

SetScrollPos:设置所指定滚动条中的滚动按钮的位置

GetScrollPos:获取指定滚动条的滚动按钮的位置

GetScrollRange:获取指定滚动条的滚动按钮的位置最大最小值

PostMessage:这个函数是关键中的关键,它负责向Windows控件发送相应的消息,以真正执行相应的操作。一些网友实现了滚动条中滑块位置的移动,但却没有引起控件中内容的移动,其原因就是因为没有调用这个函数,没有把移动内容的消息发送给控件。

SB_HORZ :代表水平滚动条

SB_VERT :代表垂直滚动条

WM_HSCROLL :代表水平滚动事件

WM_VSCROLL :代表垂直滚动事件

SB_THUMBPOSITION :至于这个常量,其含义我也不是很清楚,有知道的朋友欢迎回复给我。

好了,准备工作做好了,就可以开工了。

先声明几个变量:


bool Preview_move = false;//是否按下鼠标,表示处理移动状态。
Point MoveStart;//移动开始时,鼠标的坐标点
Point MoveEnd;//移动过程中鼠标的坐标点

在控件的MouseDown事件中,当鼠标按下时开始移动页面,并记下起始坐标点:


private void previewer_MouseDown(object sender, MouseEventArgs e)
{
    Preview_move = true;
    MoveStart = e.Location;
}

在控件的MouseUp事件中,记得当鼠标放开后要置回非移动状态:


private void previewer_MouseUp(object sender, MouseEventArgs e)
{
    Preview_move = false;


以下就是实现移动页面的关键部分了,在控件的MouseMove实现用代码间接控制控件的滚动条位置并实现页面实时移动:


private void previewer_MouseMove(object sender, MouseEventArgs e)
{
    if (!Preview_move) return;
    MoveEnd = e.Location;
    int MinH,MaxH,MinV,MaxV;
//获得鼠标在X和Y两个方向上的移动量。除以10是为是让移动页面的速度变慢一点。而前面的负号则是用来调节页面移动方向的。
    int MoveX = -(MoveEnd.X - MoveStart.X)/10;
    int MoveY = -(MoveEnd.Y - MoveStart.Y)/10;
//获取滚动条的最大最小位置和当前位置
    GetScrollRange(previewer.Handle, 0, out MinH, out MaxH);
    GetScrollRange(previewer.Handle, 1, out MinV, out MaxV);
    int PosH = GetScrollPos(previewer.Handle, 0);
    int PosV = GetScrollPos(previewer.Handle, 1);
//计算最终滚动条的位置(注意最终位置不要超出最大最小值的范围)
    int PosH1 = PosH + MoveX;
    if (PosH1 >= MinH && PosH1 <= MaxH)
    {
  SetScrollPos(previewer.Handle, SB_HORZ, PosH1, true);//设置滚动条的位置
  PostMessage(previewer.Handle, WM_HSCROLL, SB_THUMBPOSITION + 0x10000 * PosH1, 0);//告诉控件移动页面内容到相应的位置上
    }

    int PosV1 = PosV + MoveY;
    if (PosV1 >= MinV && PosV1 <= MaxV)
    {
  SetScrollPos(previewer.Handle, SB_VERT, PosV1, true);
  PostMessage(previewer.Handle, WM_VSCROLL, SB_THUMBPOSITION + 0x10000 * PosV1, 0);
    }
}

OK,一个能用鼠标实时移动页面内容的打印预览功能作好了。其实,对于.net中很多控件都可以用相似的方面实现对滚动条的控制

标签:c#,打印预览控件,鼠标移动页面
0
投稿

猜你喜欢

  • 详解怎么用Java的super关键字

    2021-10-06 08:11:14
  • ADO.NET实用技巧两则

    2021-12-26 12:48:32
  • Java Synchronized锁失败案例及解决方案

    2023-10-25 12:33:47
  • 一步步教你写一个SpringMVC框架

    2022-11-26 03:37:21
  • Android开发中计算器的sin、cos及tan值计算问题分析

    2023-11-11 08:21:40
  • Android学习笔记之应用单元测试实例分析

    2021-10-17 20:25:21
  • Android应用退出登录的实现方法

    2023-11-15 19:52:44
  • java实现数字转换人民币中文大写工具

    2023-08-16 08:48:41
  • 详解kotlin中::双冒号的使用

    2022-09-04 10:17:23
  • 点击图标进入指定浏览器将首页设置全透明解决一闪而过问题

    2023-05-11 23:43:48
  • C++中的运算符重载详解

    2022-03-22 07:20:13
  • Java数据导出功能之导出Excel文件实例

    2022-08-19 07:20:30
  • C#实现输入10个数存入到数组中并求max和min及平均数的方法示例

    2023-11-30 05:58:54
  • Android编程实现AlertDialog自定义弹出对话框的方法示例

    2022-09-13 19:34:45
  • Android开发新手常见的10个误区

    2021-07-30 02:14:10
  • Java文件读写IO/NIO及性能比较详细代码及总结

    2021-11-28 12:56:30
  • 深入了解C#设计模式之订阅发布模式

    2021-08-14 05:31:39
  • Android仿UC浏览器左右上下滚动功能

    2023-08-27 12:43:19
  • Java反射(Class类,Class对象获取)

    2021-06-27 05:55:24
  • 解决spring mvc 多数据源切换,不支持事务控制的问题

    2022-09-30 03:39:56
  • asp之家 软件编程 m.aspxhome.com