亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c#打印預(yù)覽控件中實(shí)現(xiàn)用鼠標(biāo)移動(dòng)頁面功能代碼分享

 更新時(shí)間:2013年12月09日 09:36:00   作者:  
項(xiàng)目中需要實(shí)現(xiàn)以下功能:打印預(yù)覽控件中,可以用鼠標(biāo)拖動(dòng)頁面,以查看超出顯示范圍之外的部分內(nèi)容,下面就是實(shí)現(xiàn)代碼

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

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

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

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

復(fù)制代碼 代碼如下:

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

GetScrollPos:獲取指定滾動(dòng)條的滾動(dòng)按鈕的位置

GetScrollRange:獲取指定滾動(dòng)條的滾動(dòng)按鈕的位置最大最小值

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

SB_HORZ :代表水平滾動(dòng)條

SB_VERT :代表垂直滾動(dòng)條

WM_HSCROLL :代表水平滾動(dòng)事件

WM_VSCROLL :代表垂直滾動(dòng)事件

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

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

先聲明幾個(gè)變量:

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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


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

復(fù)制代碼 代碼如下:

private void previewer_MouseMove(object sender, MouseEventArgs e)
{
    if (!Preview_move) return;
    MoveEnd = e.Location;
    int MinH,MaxH,MinV,MaxV;
//獲得鼠標(biāo)在X和Y兩個(gè)方向上的移動(dòng)量。除以10是為是讓移動(dòng)頁面的速度變慢一點(diǎn)。而前面的負(fù)號(hào)則是用來調(diào)節(jié)頁面移動(dòng)方向的。
    int MoveX = -(MoveEnd.X - MoveStart.X)/10;
    int MoveY = -(MoveEnd.Y - MoveStart.Y)/10;
//獲取滾動(dòng)條的最大最小位置和當(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);
//計(jì)算最終滾動(dòng)條的位置(注意最終位置不要超出最大最小值的范圍)
    int PosH1 = PosH + MoveX;
    if (PosH1 >= MinH && PosH1 <= MaxH)
    {
  SetScrollPos(previewer.Handle, SB_HORZ, PosH1, true);//設(shè)置滾動(dòng)條的位置
  PostMessage(previewer.Handle, WM_HSCROLL, SB_THUMBPOSITION + 0x10000 * PosH1, 0);//告訴控件移動(dòng)頁面內(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,一個(gè)能用鼠標(biāo)實(shí)時(shí)移動(dòng)頁面內(nèi)容的打印預(yù)覽功能作好了。其實(shí),對(duì)于.net中很多控件都可以用相似的方面實(shí)現(xiàn)對(duì)滾動(dòng)條的控制

相關(guān)文章

  • C# 抓取網(wǎng)頁內(nèi)容的方法

    C# 抓取網(wǎng)頁內(nèi)容的方法

    C# 抓取網(wǎng)頁內(nèi)容的方法,需要的朋友可以參考一下
    2013-04-04
  • C#使用selenium實(shí)現(xiàn)爬蟲

    C#使用selenium實(shí)現(xiàn)爬蟲

    這篇文章介紹了C#使用selenium實(shí)現(xiàn)爬蟲的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#/VB.NET中從?PDF?文檔中提取所有表格

    C#/VB.NET中從?PDF?文檔中提取所有表格

    這篇文章主要介紹了C#/VB.NET中從PDF文檔中提取所有表格,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • c#操作sql server2008 的界面實(shí)例代碼

    c#操作sql server2008 的界面實(shí)例代碼

    這篇文章主要介紹了c#操作sql server2008 的界面實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • C#實(shí)現(xiàn)獲取本地內(nèi)網(wǎng)(局域網(wǎng))和外網(wǎng)(公網(wǎng))IP地址的方法分析

    C#實(shí)現(xiàn)獲取本地內(nèi)網(wǎng)(局域網(wǎng))和外網(wǎng)(公網(wǎng))IP地址的方法分析

    這篇文章主要介紹了C#實(shí)現(xiàn)獲取本地內(nèi)網(wǎng)(局域網(wǎng))和外網(wǎng)(公網(wǎng))IP地址的方法,結(jié)合實(shí)例形式總結(jié)分析了C#獲取IP地址相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 基于WPF編寫有趣的久坐提醒桌面小程序

    基于WPF編寫有趣的久坐提醒桌面小程序

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF編寫一個(gè)有趣的久坐提醒桌面小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2023-08-08
  • 深入淺析C#?11?對(duì)?ref?和?struct?的改進(jìn)

    深入淺析C#?11?對(duì)?ref?和?struct?的改進(jìn)

    這篇文章主要介紹了C#?11?對(duì)?ref?和?struct?的改進(jìn),有了這些基礎(chǔ)設(shè)施,開發(fā)者們將能輕松使用安全的方式來編寫沒有任何堆內(nèi)存開銷的高性能代碼,需要的朋友可以參考下
    2022-04-04
  • c#基于opencv,開發(fā)攝像頭播放程序

    c#基于opencv,開發(fā)攝像頭播放程序

    這篇文章主要介紹了c#基于opencv,開發(fā)攝像頭播放程序的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#儀器數(shù)據(jù)文件解析Excel文件的方法淺析(xls、xlsx)

    C#儀器數(shù)據(jù)文件解析Excel文件的方法淺析(xls、xlsx)

    這篇文章主要給大家介紹了關(guān)于C#儀器數(shù)據(jù)文件如何解析Excel文件的方法,包括解析xls、xlsx兩種格式,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 利用C#實(shí)現(xiàn)在Word中更改字體顏色

    利用C#實(shí)現(xiàn)在Word中更改字體顏色

    在日常工作中,我們有時(shí)會(huì)需要修改字體的顏色來突出文本重點(diǎn),讓讀者更容易抓住文章要點(diǎn)。在今天這篇文章中,我將為大家介紹如何以編程方式,在Word更改字體顏色,感興趣的可以了解一下
    2023-02-02

最新評(píng)論