a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

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

2020-01-24 03:01:03
字體:
供稿:網(wǎng)友

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

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

在實現(xiàn)這一功能的過程中,最大的困難是打印預覽控件并沒有讓程序員直接調(diào)用的關(guān)于滾動條的方法或?qū)傩浴K灾缓孟騑inAPI求助了。

以下API函數(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)鍵,它負責向Windows控件發(fā)送相應的消息,以真正執(zhí)行相應的操作。一些網(wǎng)友實現(xiàn)了滾動條中滑塊位置的移動,但卻沒有引起控件中內(nèi)容的移動,其原因就是因為沒有調(diào)用這個函數(shù),沒有把移動內(nèi)容的消息發(fā)送給控件。

SB_HORZ :代表水平滾動條

SB_VERT :代表垂直滾動條

WM_HSCROLL :代表水平滾動事件

WM_VSCROLL :代表垂直滾動事件

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

好了,準備工作做好了,就可以開工了。

先聲明幾個變量:

復制代碼 代碼如下:

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

在控件的MouseDown事件中,當鼠標按下時開始移動頁面,并記下起始坐標點:

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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


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

復制代碼 代碼如下:

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产亚洲综合精品 | 密室大逃脱第六季大神版在线观看 | 午夜国产一级片 | 久久ri资源网| 一区二区在线免费观看 | 欧美大片网站 | 欧美色影院 | 性瘾调教校园h | 国产精品自产拍 | 午夜看片 | 毛片免费观看视频 | 在线观看不卡一区 | 久久国产一区 | www.色哟哟 | 91国内外精品自在线播放 | 黄色av影院| 亚洲一区二区在线 | 久久一区二区av | 中文字幕三级 | 亚洲一区二区精品视频 | 一区二区三区四区 | www.白白色 | 久草在线| 精品久久久久一区二区国产 | 国产精品久久嫩一区二区免费 | 狠狠色狠狠色合久久伊人 | 亚洲性在线观看 | 中文字幕电影在线 | 欧美专区在线 | 自拍偷拍一区二区三区 | 国产乱码精品一区二区三区忘忧草 | 天天综合网91 | 97久久久国产精品 | 九色在线 | 伊人二区 | 啪啪网免费 | 欧美国产日韩另类 | 国产精品久久久免费看 | 97色资源| 三级欧美在线 | 亚洲久久 |