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中很多控制元件都可以用相似的方面實現對滾動條的控制。
相關文章
- 滑鼠雙擊頁面實現自動滾動效果
- 如何在CSS中對映的滑鼠位置,並實現通過滑鼠移動控制頁面元素效果CSS
- 移動端上滑實現翻頁功能
- 移動端頁面鍵盤出現“搜尋”按鍵且實現提交功能
- C#實現頁面載入C#
- 移動端頁面功能之——長按事件事件
- 如何關閉移動web頁面縮放功能Web
- C#實現網頁截圖功能C#網頁
- 三種方式實現平滑滾動頁面到頂部的功能
- jquery實現返回頁面頂部功能。jQuery
- Jquery 實現頁面倒數計時的功能jQuery
- 原生JavaScript實現頁面回到頂部的功能JavaScript
- 滑鼠移動到button顏色改變的實現
- CSS滑鼠移動圖片切換功能CSS
- 移動端活動頁面搭建
- js滑鼠移動實現圖片立體滾動效果JS
- 根據userAgent實現跳轉到移動或者pc頁面程式碼
- 小程式頁面動態配置實現
- WPF手動實現切換頁面
- vue實現後臺管理系統頁面功能和頁面路由許可權的控制Vue路由
- CSS 實現 : 滑鼠移動上去顯示 div,移開隱藏 divCSS
- 分頁功能的實現
- asp.net frameset 框架頁面伸縮功能實現ASP.NET框架
- React框架實現移動頁面翻譯是一種什麼體驗?React框架
- ASP.Net頁面瀏覽器“後退”功能的實現ASP.NET瀏覽器
- 「移動端」Web頁面適配Web
- 移動前端除錯頁面–weinre前端除錯
- 移動前端調式頁面--weinre前端
- CSS實現頁面切換時的滑動效果CSS
- .Net中用ajax控制元件實現功能(例)控制元件
- 移動端頁面滾動--解決方法
- angualr實現滑鼠拖拽排序功能排序
- 移動Web單頁應用開發實踐——頁面結構化Web
- 通過滑鼠的移動來實現層的隱藏與顯示
- C#實現滑鼠、鍵盤鉤子C#
- HTML5頁面移動端自適應佈局的實現示例程式碼HTML
- 關於利用jQuery實現愛奇藝裡面的滑鼠移入改變當前頁面的功能的實現原理jQuery
- 雙十一移動端頁面總結