該功能本來可以通過拉動水平和垂直滾動條來實現(xiàn),但實際使用中,用戶更趨向于直接用鼠標拖動頁面來實現(xiàn),很多看圖類軟件都有這種類似的功能。而.net的打印預覽控件卻很遺憾的沒有提供這一功能,只來自己想辦法來實現(xiàn)啦。
我的辦法就是用代碼來控制打印預覽控件中的水平來垂直滾動條的位置,間接實現(xiàn)和用鼠標直接拖動滾動條一樣的效果。
在實現(xiàn)這一功能的過程中,最大的困難是打印預覽控件并沒有讓程序員直接調(diào)用的關(guān)于滾動條的方法或?qū)傩浴K灾缓孟騑inAPI求助了。
以下API函數(shù)和常量就是實現(xiàn)上述功能的關(guān)鍵了:
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 :至于這個常量,其含義我也不是很清楚,有知道的朋友歡迎回復給我。
好了,準備工作做好了,就可以開工了。
先聲明幾個變量:
在控件的MouseDown事件中,當鼠標按下時開始移動頁面,并記下起始坐標點:
在控件的MouseUp事件中,記得當鼠標放開后要置回非移動狀態(tài):
以下就是實現(xiàn)移動頁面的關(guān)鍵部分了,在控件的MouseMove實現(xiàn)用代碼間接控制控件的滾動條位置并實現(xiàn)頁面實時移動:
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);
}
}
|
新聞熱點
疑難解答
圖片精選