日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#中用鼠標(biāo)移動頁面功能的實(shí)現(xiàn)

該功能本來可以通過拉動水平和垂直滾動條來實(shí)現(xiàn),但實(shí)際使用中,用戶更趨向于直接用鼠標(biāo)拖動頁面來實(shí)現(xiàn),很多看圖類軟件都有這種類似的功能。而.net的打印預(yù)覽控件卻很遺憾的沒有提供這一功能,只來自己想辦法來實(shí)現(xiàn)啦。

10年的景縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整景縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“景縣網(wǎng)站設(shè)計”,“景縣網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

呵呵,不過辦法總是有的。

我的辦法就是用代碼來控制打印預(yù)覽控件中的水平來垂直滾動條的位置,間接實(shí)現(xiàn)和用鼠標(biāo)直接拖動滾動條一樣的效果。

在實(shí)現(xiàn)這一功能的過程中,最大的困難是打印預(yù)覽控件并沒有讓程序員直接調(diào)用的關(guān)于滾動條的方法或?qū)傩?。所以只好向WinAPI求助了。

以下API函數(shù)和常量就是實(shí)現(xiàn)上述功能的關(guān)鍵了:

[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:設(shè)置所指定滾動條中的滾動按鈕的位置

GetScrollPos:獲取指定滾動條的滾動按鈕的位置

GetScrollRange:獲取指定滾動條的滾動按鈕的位置最大最小值

PostMessage:這個函數(shù)是關(guān)鍵中的關(guān)鍵,它負(fù)責(zé)向Windows控件發(fā)送相應(yīng)的消息,以真正執(zhí)行相應(yīng)的操作。一些網(wǎng)友實(shí)現(xiàn)了滾動條中滑塊位置的移動,但卻沒有引起控件中內(nèi)容的移動,其原因就是因?yàn)闆]有調(diào)用這個函數(shù),沒有把移動內(nèi)容的消息發(fā)送給控件。

SB_HORZ :代表水平滾動條

SB_VERT :代表垂直滾動條

WM_HSCROLL :代表水平滾動事件

WM_VSCROLL :代表垂直滾動事件

SB_THUMBPOSITION :至于這個常量,其含義我也不是很清楚,有知道的朋友歡迎回復(fù)給我。

好了,準(zhǔn)備工作做好了,就可以開工了。

先聲明幾個變量:

       bool Preview_move = false;//是否按下鼠標(biāo),表示處理移動狀態(tài)。
       Point MoveStart;//移動開始時,鼠標(biāo)的坐標(biāo)點(diǎn)
       Point MoveEnd;//移動過程中鼠標(biāo)的坐標(biāo)點(diǎn)

在控件的MouseDown事件中,當(dāng)鼠標(biāo)按下時開始移動頁面,并記下起始坐標(biāo)點(diǎn):

       private void previewer_MouseDown(object sender, MouseEventArgs e)
       {
           Preview_move = true;
           MoveStart = e.Location;
       }

在控件的MouseUp事件中,記得當(dāng)鼠標(biāo)放開后要置回非移動狀態(tài):

       private void previewer_MouseUp(object sender, MouseEventArgs e)
       {
           Preview_move = false;
       }

以下就是實(shí)現(xiàn)移動頁面的關(guān)鍵部分了,在控件的MouseMove實(shí)現(xiàn)用代碼間接控制控件的滾動條位置并實(shí)現(xiàn)頁面實(shí)時移動:

       private void previewer_MouseMove(object sender, MouseEventArgs e)
       {
           if (!Preview_move) return;           
           MoveEnd = e.Location;
           int MinH,MaxH,MinV,MaxV;
//獲得鼠標(biāo)在X和Y兩個方向上的移動量。除以10是為是讓移動頁面的速度變慢一點(diǎn)。而前面的負(fù)號則是用來調(diào)節(jié)頁面移動方向的。
           int MoveX = -(MoveEnd.X - MoveStart.X)/10;
           int MoveY = -(MoveEnd.Y - MoveStart.Y)/10;
//獲取滾動條的最大最小位置和當(dāng)前位置
           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);//設(shè)置滾動條的位置
               PostMessage(previewer.Handle, WM_HSCROLL, SB_THUMBPOSITION + 0x10000 * PosH1, 0);//告訴控件移動頁面內(nèi)容到相應(yīng)的位置上
           }

           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,一個能用鼠標(biāo)實(shí)時移動頁面內(nèi)容的打印預(yù)覽功能作好了。其實(shí),對于.net中很多控件都可以用相似的方面實(shí)現(xiàn)對滾動條的控制。

您正在閱讀的是《C#中用鼠標(biāo)移動頁面功能的實(shí)現(xiàn)》


網(wǎng)頁名稱:C#中用鼠標(biāo)移動頁面功能的實(shí)現(xiàn)
網(wǎng)址分享:http://www.5511xx.com/article/cocpcgi.html