当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > C#中用鼠标移动页面功能的实现

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

ASP.NET 中的 C#中用鼠标移动页面功能的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 130 ::
收藏到网摘: n/a

项目中需要实现以下功能:

打印预览控件中,可以用鼠标拖动页面,以查看超出显示范围之外的部分内容。

该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多看图类软件都有这种类似的功能。而.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中很多控件都可以用相似的方面实现对滚动条的控制。