亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#打印預覽控件中實現用鼠標移動頁面功能代碼分享

2020-01-24 03:01:03
字體:
來源:轉載
供稿:網友

該功能本來可以通過拉動水平和垂直滾動條來實現,但實際使用中,用戶更趨向于直接用鼠標拖動頁面來實現,很多看圖類軟件都有這種類似的功能。而.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中很多控件都可以用相似的方面實現對滾動條的控制

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产视频在线| 日韩欧美第一页| 欧美在线性视频| 亚洲国产97在线精品一区| 亚洲人精品午夜在线观看| 日韩视频―中文字幕| 国精产品一区一区三区有限在线| 国产一区二区黑人欧美xxxx| 成人av电影天堂| 亚洲男人天堂视频| 国产精品香蕉av| 55夜色66夜色国产精品视频| 久久精品国产视频| 久久99精品久久久久久青青91| 亚洲黄色成人网| 久久国产精品久久精品| 北条麻妃一区二区三区中文字幕| 2021久久精品国产99国产精品| 欧美特黄级在线| 欧美激情中文字幕在线| 亚洲欧美日韩成人| 黑人巨大精品欧美一区二区一视频| 国产成人精品999| 日韩欧美中文字幕在线观看| 国模吧一区二区三区| 中文字幕日韩av电影| 伊人青青综合网站| 欧美高清第一页| 综合久久五月天| 欧美怡春院一区二区三区| 麻豆乱码国产一区二区三区| 日韩av电影在线免费播放| 国产z一区二区三区| 欧美日韩在线观看视频| 欧美在线亚洲一区| 久久久久成人精品| 国产视频精品在线| 一区二区三区美女xx视频| 亚洲精品成人网| 红桃视频成人在线观看| 欧美影院成年免费版| 亚洲欧美制服综合另类| 中文字幕日韩在线播放| 国产在线播放不卡| 日韩中文字幕第一页| 热久久这里只有精品| 亚洲男人的天堂在线| 狠狠躁天天躁日日躁欧美| 91理论片午午论夜理片久久| 91嫩草在线视频| 欧美夫妻性生活视频| 日韩精品欧美国产精品忘忧草| 久久久亚洲国产天美传媒修理工| 国产一区私人高清影院| 国产精品尤物福利片在线观看| 亚洲第一在线视频| 精品久久久久久亚洲国产300| 欧洲美女7788成人免费视频| 日韩精品免费观看| 久久成人精品一区二区三区| 成人亚洲激情网| 欧美精品videosex性欧美| 亚洲色图五月天| 成人精品网站在线观看| 欧美在线视频一二三| 亚洲女在线观看| 91久久久久久久久久久| 久久久久久久亚洲精品| 国产成人精品一区二区三区| 色yeye香蕉凹凸一区二区av| 国产精品爽爽ⅴa在线观看| 日韩av在线影视| 亚洲久久久久久久久久| 最近2019中文字幕mv免费看| 欧美日韩免费一区| 精品国产一区二区三区久久狼黑人| 欧美性xxxx极品高清hd直播| 91精品久久久久| 亚洲欧美日韩成人| 国产精品免费一区二区三区都可以| 91香蕉国产在线观看| 亚洲人成电影在线观看天堂色| 欧美极品美女视频网站在线观看免费| 亚洲美女在线看| 色偷偷噜噜噜亚洲男人的天堂| 亚洲2020天天堂在线观看| 日韩美女在线播放| 亚洲精品第一页| 91中文精品字幕在线视频| 亚洲国产成人爱av在线播放| 亚洲欧美成人一区二区在线电影| 中文字幕亚洲一区| 亚洲人成在线一二| 在线观看日韩av| 国产成人精品在线| 国产成人97精品免费看片| 最新国产精品亚洲| 热re91久久精品国99热蜜臀| 欧美性xxxxx| 日本久久亚洲电影| 欧美午夜xxx| 成人啪啪免费看| 青青精品视频播放| 国产精品高潮呻吟久久av野狼| 中文字幕亚洲无线码a| 91久久久在线| 国产精品久久久久久久久久小说| 日韩av免费在线观看| 日韩成人中文字幕在线观看| 日本中文字幕久久看| 国产日韩精品一区二区| 国产一区二区三区直播精品电影| 亚洲精品日韩av| 亚洲tv在线观看| xxxxxxxxx欧美| 亚洲一区二区三区在线视频| 麻豆成人在线看| 久久久精品在线观看| 欧美中文字幕视频| 欧美精品在线视频观看| 久久午夜a级毛片| 日韩高清有码在线| 亚洲91av视频| 国内精品美女av在线播放| 久久久久亚洲精品成人网小说| 茄子视频成人在线| 国产日韩精品入口| 国产欧美精品在线| 51精品国产黑色丝袜高跟鞋| 高清日韩电视剧大全免费播放在线观看| 日韩电影中文 亚洲精品乱码| 青草青草久热精品视频在线网站| 国产精品男人爽免费视频1| 日韩美女写真福利在线观看| 国产精品久久久久久久一区探花| 日韩av电影国产| 亚洲欧美日韩国产精品| 日韩精品中文字幕视频在线| 91性高湖久久久久久久久_久久99| 久久久av亚洲男天堂| 国产丝袜一区二区| 国产91九色视频| 大桥未久av一区二区三区| 狠狠躁夜夜躁人人躁婷婷91| 国外成人在线播放| 欧美老少做受xxxx高潮| 久久久精品久久久久| 精品国产一区二区三区久久狼5月| 亚洲美女在线看| 北条麻妃一区二区在线观看| 欧美第一淫aaasss性| 久久久久国产一区二区三区| 久久综合九色九九| 成人免费视频97| 国产精自产拍久久久久久| 成人国产在线视频| 欧美日韩国产精品一区二区不卡中文| 国产精品欧美一区二区三区奶水| 免费成人高清视频| 亚洲电影免费观看高清| 2020久久国产精品| 成人美女av在线直播| 国产亚洲美女精品久久久| 国产成人一区二区三区小说|