項目中需要實現以下功能:
打印預覽控件中,可以用鼠標拖動頁面,以查看超出顯示范圍之外的部分內容。
該功能本來可以通過拉動水平和垂直滾動條來實現,但實際使用中,用戶更趨向於直接用鼠標拖動頁面來實現,很多看圖類軟件都有這種類似的功能。而.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 :至於這個常量,其含義我也不是很清楚,有知道的朋友歡迎回復給我。