印刷プレビューコントロールで、マウスでページを移動する機能コードを共有することができます。


この機能は本来、水平と垂直スクロールバーを引っ張ることで実現できるが、実際に使用すると、ユーザーは直接マウスでページをドラッグする傾向があり、多くの種類の図を見ると、このような機能がある。ネットの印刷プレビューコントロールは残念ながらこの機能を提供していません。自分で工夫して実現します。
私の方法はコードを使ってプレビューコントロールの中の水平を印刷して垂直スクロールバーの位置を制御して、間接的にマウスで直接スクロールバーをドラッグするのと同じ効果を実現します。
この機能を実現する過程で、最大の困難は、プレビューコントロールを印刷することであり、プログラマが直接に起動しないようにするスクロールバーの方法または属性である。だから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;

簡単に説明してください。
SetScrrollPos:指定されたスクロールバーのスクロールボタンの位置を設定します。
GetScrrollPos:スクロールバーを指定するスクロールボタンの位置を取得します。
GetScrrollRange:スクロールバーを指定するスクロールボタンの位置の最大最小値を取得します。
PostMessage:この関数は鍵の中の鍵であり、Windowsコントロールに対応するメッセージを送信して、本当に対応する操作を実行する責任があります。一部のユーザーはスクロールバー内のスライダの位置の移動を実現しましたが、コントロール内のコンテンツの移動を引き起こしませんでした。その理由は、この関数を呼び出していないため、移動内容のメッセージをコントロールに送信していません。
SBHORZ:代表水平スクロールバー
SBVERT:垂直スクロールバーを表します。
WM_HSCROLL:水平スクロールイベントを表す
WM_VVS CROLL:垂直スクロールイベントを表します。
SBTHUMBPOSITION:この定数については、その意味はよく分かりません。知っている友達がいらっしゃいます。
はい、準備ができたら、仕事を始められます。
いくつかの変数を先に宣言します。

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の多くのコントロールは似たような面でスクロールバーの制御ができます。