欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【C#中用鼠标移动页面功能的实现】,下面是详细的分享!
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中很多控件都可以用相似的方面实现对滚动条的控制。
以上所分享的是关于C#中用鼠标移动页面功能的实现,下面是编辑为你推荐的有价值的用户互动:
相关问题:C#鼠标移动显示不同页面
答:用webBrowser来载入网页,在网页的javascript中实现, 像QQ资讯、迅雷资讯、阿里旺旺资讯、暴风影音资讯,全都是通过载入网页来实现的。 >>详细
相关问题:C# 鼠标点击按钮就可实现按钮的移动
答:在按钮的单击事件里面写: //new一个随机的坐标 Random r = new Random(); //this.Size.Width 表示整个窗体的宽度 int X = r.Next(0, this.ClientSize.Width - button2.Size.Width); int Y = r.Next(0,this.ClientSize.Height - button2.Size.He... >>详细
相关问题:C#中怎么用代码去控制鼠标的移动轨迹
答:在代码中加入以下外部函数声明: [System.Runtime.InteropServices.DllImport("user32")] private static extern int mouse_event(int dwFlags,int dx,int dy, int cButtons, int dwExtraInfo); const int MOUSEEVENTF_MOVE = 0x0001; const int... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
