成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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#中用鼠標移動頁面功能的實現

【編輯推薦】

  1. C# 2010協變和逆變的新特性
  2. Visual C# 2010新特性之dynamic類型
  3. C# 4.0新特性dynamic作用淺析
責任編輯:彭凡 來源: cnblogs
相關推薦

2009-08-28 16:03:15

C#程序實現鼠標移動

2009-09-03 16:50:35

C#鼠標形狀

2009-09-02 18:53:28

C#鼠標坐標

2009-09-02 17:29:10

C# TextBox換

2009-09-16 09:06:16

Specificati

2009-08-07 13:03:10

C#控件數組

2009-08-26 10:43:14

C#實現打印功能

2009-08-26 09:22:44

C#實現打印功能

2009-09-08 09:31:54

c# CheckBox

2009-09-03 14:55:56

C#實現DataGri

2009-09-04 09:27:48

C#調用瀏覽器

2009-09-07 15:40:06

2009-09-08 16:51:50

C#鼠標拖動

2009-09-02 18:11:24

C#鼠標

2009-09-03 18:19:35

C#鼠標右鍵

2009-09-07 18:08:25

C#鼠標指針

2009-09-02 18:34:28

C#鼠標事件

2009-08-26 13:22:24

C#打印程序

2009-08-18 09:26:07

C#線程功能

2009-09-07 06:31:32

C#窗體移動
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合久久综合久久 | 欧美在线观看一区 | 国产亚洲一区在线 | dy天堂 | 玖玖玖在线 | 成人蜜桃av | 祝你幸福电影在线观看 | 久久久久国产精品午夜一区 | 国产精品国产精品国产专区不卡 | 第四色狠狠 | 国产精品免费在线 | 欧美一区二区在线视频 | 91精品国产综合久久久久久丝袜 | 成人在线免费观看视频 | 69视频在线播放 | 97人人超碰| 国产不卡视频 | 日日操视频 | 91国内精精品久久久久久婷婷 | 精品视频在线播放 | 国产精品国产三级国产aⅴ入口 | 国产ts人妖一区二区三区 | 蜜桃视频在线观看免费视频网站www | 久久久久久久久久久久久9999 | 久久国产精品视频 | 日韩高清一区 | 亚洲国产成人精品久久 | 国产wwwcom | 人人爽人人爽 | 日韩无 | 成人小视频在线免费观看 | 久久噜| 亚洲www| 亚洲一区二区三区四区五区午夜 | 欧美一级二级在线观看 | 国产美女特级嫩嫩嫩bbb片 | 国产一区二区三区色淫影院 | 秋霞av国产精品一区 | 日本精品一区二区三区在线观看视频 | 国产精品色婷婷久久58 | 久久视频免费观看 |