当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-25

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

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C#打印出正等腰三角形实例代码
  • C# 获取打印机当前状态的方法
  • C# 实现简单打印的实例代码
  • C#实现打印与打印预览功能的思路及代码
  • C#中通过API实现的打印类 实例代码
  • java命名空间javax.print类docflavor的类成员方法:服务格式化打印数据定义及介绍
  • (急,改天请吃饭,谢)如何把jsp页面的打印按纽关联到IE的打印功能或如何用简单的实现打印页面
  • Linux c字符串中不可打印字符转换成16进制
  • 用applet实现打印,除了弹出系统自带的打印对话框,在自其前后各弹出一个”小应用程序需打印,要继续吗?“的对话框,如何去掉这两个对话
  • java命名空间javax.print类docflavor的类成员方法:客户端格式化打印数据定义及介绍
  • UNIX下如何通过并口,驱动打印机打印格式文件
  • [debian]打印机装好了,但是打印不了,怎么检查是哪里的问题呢?
  • 打印高手请进:如何得到当前正在打印的页数
  • printFinal打印插件-基于jQuery-支持打印预览 printFinal
  • 如何能够只打印,页面上的表格,页面上的上一页,下一页,还有按钮不打印
  • redhat9 如何连接到xp上共享的打印机来打印?
  • 有谁在linux串口下用ESCPOS指令控制打印机打印,碰到问题,请赐教
  • 请问UNIX系统下装上WINDOWS的打印机驱动程序,可否打印?
  • Solaris打印,lp 命令打印有长行的文本文件时后半段被截掉了,怎么办? 急!!!!!!!!!!!!!!!!!!!
  • 如何配置linux,使windows系统可以直接打印到linux的打印机上??
  • jsp页面中如何打印格式报表(不是打印页面内容)?
  • 模拟打印机排队打印效果
  • 如何能够只打印页面上的表格,页面上的上一页,下一页(是链接)和按钮不打印
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请问如何在Unix C程序中使用打印控制码?(已有打印机使用手册)
  • 各位打印过PDF文档吗?我打印的时候,经常打出乱码来,比如don't就会变成乱码,还有其它非英文字符也会变成乱码,有解决方法吗?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3