如何實現C#中用鼠標移動頁面的功能_.Net教程
推薦:解析.NET調PHP Web Service的典型例子最近一個項目由
項目中需要實現以下功能:
打印預覽控件中,可以用鼠標拖動頁面,以查看超出顯示范圍之外的部分內容。
該功能本來可以通過拉動水平和垂直滾動條來實現,但實際使用中,用戶更趨向于直接用鼠標拖動頁面來實現,很多看圖類軟件都有這種類似的功能。而.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中很多控件都可以用相似的方面實現對滾動條的控制。
分享:淺析8月編程語言榜:.Net前景如何?Tiobe近日公布了2009年8月的編程語言排行榜,51CTO注意到本期榜單中有Objective-CHE第一次進入前二十名并取代之前的Lua,而Java、C、C 依然以絕對優勢占據前三甲的位置。本期我們將重點關注微軟的.NET平臺,以及新近推出的F#、Small Basic語言。 C# 4.0借Vis
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-如何實現C#中用鼠標移動頁面的功能
。