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

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

(0)

相关推荐

  • C#基本打印事件用法实例

    本文实例讲述了C#基本打印事件用法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication3 { public partial cla

  • C#打印绘图的实现方法

    本文实例讲述了C#打印绘图的实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: String drawString = ""; Font drawFont = null; SolidBrush drawBrush = null; float x = 0F; float y = 0F; StringFormat drawFormat = new StringFormat(); string test = ""; public string Tes

  • C# 实现简单打印的实例代码

    主窗体代码如下: 复制代码 代码如下: public partial class PrintFileForm : Form    {        public PrintFileForm()        {            InitializeComponent();            PrintFile prinFile = new PrintFile();            prinFile.Print();        }    } 打印文件类如下: 复制代码 代码如下

  • C#中通过API实现的打印类 实例代码

    复制代码 代码如下: using System;using System.Collections;using System.Text;using System.Runtime.InteropServices; using System.Security; using System.ComponentModel; using System.Drawing.Printing; namespace PrinterAPI{ public class Printer  {   private Printe

  • C# 获取打印机当前状态的方法

    要获得打印机的状态,应该定义一个联合. 复制代码 代码如下: enum PrinterStatus { 其他状态= 1, 未知, 空闲, 正在打印, 预热, 停止打印, 打印中, 离线} 其中的"正在打印"和"打印中"是同一个意思,至于为什么会是这样,目前还不知道. 在程序中添加System.Management的引用:using System.Management; 然后编写获取打印机状态的函数如下: 复制代码 代码如下: /// <summary> 

  • C#实现打印与打印预览功能的思路及代码

    在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下. 打印操作通常包括以下四个功能: 1 打印设置 设置打印机的一些参数,比如更改打印机驱动程序等; 2 页面设置 设置页面大小纸张类型等 3 打印预览 类似于word中的打印预览 4 打印 实现打印功能的核心是PrintDocument类这个类属于Syste

  • C#使用控制台列出当前所有可用的打印机列表

    本文实例讲述了C#使用控制台列出当前所有可用打印机列表的方法.分享给大家供大家参考.具体如下: // The initial C# code for the WMI query was generated by WMI Code //Generator, Version 5.00, http://www.robvanderwoude.com/wmigen.php using System; using System.Management; using System.Collections; na

  • C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法

    本文实例讲述了C#使用前序遍历.中序遍历和后序遍历打印二叉树的方法.分享给大家供大家参考.具体实现方法如下: public class BinaryTreeNode { public BinaryTreeNode Left { get; set; } public BinaryTreeNode Right { get; set; } public int Data { get; set; } public BinaryTreeNode(int data) { this.Data = data;

  • C#打印出正等腰三角形实例代码

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 打印正三角{    class Program    {        static void Main(string[] args)        { Console.WriteLine("请输入要打印的行数:");            int n=Convert.ToInt3

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

    该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多看图类软件都有这种类似的功能.而.net的打印预览控件却很遗憾的没有提供这一功能,只来自己想办法来实现啦. 我的办法就是用代码来控制打印预览控件中的水平来垂直滚动条的位置,间接实现和用鼠标直接拖动滚动条一样的效果. 在实现这一功能的过程中,最大的困难是打印预览控件并没有让程序员直接调用的关于滚动条的方法或属性.所以只好向WinAPI求助了. 以下API函数和常量就是实现上述功能的关键了: 复制代

  • Android实现ListView控件的多选和全选功能实例

    本文实例讲述了Android实现ListView控件的多选和全选功能.分享给大家供大家参考,具体如下: 主程序代码 MainActivity.Java package yy.test; import java.util.ArrayList; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.vi

  • JS实现浏览器打印、打印预览示例

    目前正在做浏览器端采用JS方式实现打印这么一个功能,JS打印实现的方法很多,但是兼容各个浏览器实现打印预览的功能有些棘手,现将实现的内容及遇到的问题记录下来,希望有大牛看到所提的问题后可以给予解答,在此感谢啦. 1.JS实现打印的方式 方式一:window.print() window.print();会弹出打印对话框,打印的是window.document.body.innerHTML中的内容,下面是从网上摘到的一个局部打印的例子,该例子的不足是打印会修改页面的内容. <!DOCTYPE ht

  • 基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作

    本篇文章主要介绍如何实现Web页面内容的打印预览和保存操作的相关知识,一起学习吧! 1.Web页面打印的问题 在此之前,我一般使用比较好用的LODOP来执行打印的操作,这个在我之前有很多文章都有涉及,这个控件是一个ActiveX的控件,需要下载安装后就可以在页面是进行打印的排版设计,预览,打印等操作,还是很方便的一个控件,因此都很适合普通内容的打印,证件的套打等操作. 不过随着浏览器技术的更新,这个插件在Chrome或者FireFox上好像不受支持了,基本上摒弃了这种插件的处理方式了.例如如果我

  • JavaScript 实现打印,打印预览,打印设置

    WebBrowser是IE内置的浏览器控件,无需用户下载. 一.WebBrowser控件 <object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object> 二.WebBrowder控件的方法 //打印 WebBrowser1.ExecWB(6,1); //打印设置 WebBrowser1.ExecWB(8,1); //打印预览 WebBrow

  • JS 打印功能代码可实现打印预览、打印设置等

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

  • javascript打印大全(打印页面设置/打印预览代码)

    复制代码 代码如下: <HTML><HEAD><TITLE>javascript打印-打印页面设置-打印预览代码</TITLE> <META http-equiv=Content-Type content="text/html; charset=gb2312" /> <SCRIPT language=javascript> function printsetup(){ // 打印页面设置 wb.execwb(8,1

  • Bootstrap 3.x打印预览背景色与文字显示异常的解决

    我首先测试了一段如下的代码,发现打印预览时的确无法显示背景色. <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Regonline</title> <link href="css/bootstrap.css" rel="stylesheet" /> &l

  • asp.net使用Repeater控件中的全选进行批量操作实例

    本文实例讲述了asp.net使用Repeater控件中的全选进行批量操作的方法.分享给大家供大家参考.具体分析如下: 今天在Repeater控件中碰到一个全选的操作,于是上网查了一下,找到一个觉得比较好,便记录下来, 界面代码简化之后(全选操作): 复制代码 代码如下: <script type="text/javascript"> function SelectAll(parentChk, ChildId, bigControlID) { var oElements =

随机推荐