高手进 如何用按钮控制WINFORM中PDF控件滚动条的位置

时间:2021-09-26 10:30:53
Form1中只有一个RichTextBox控件(占满Form,Dock属性为Fill)
我想用两个按钮(上移、下移)来控制RichTextBox滚动条的位置(如 点"下移" 滚动条会向下滑动)

        private void Form_Preview_Load(object sender, EventArgs e)
        {
           //加载PDF
           this.axAcroPDF.LoadFile(pdfPath);
         }

        #region 上下移动按钮
        [DllImport("user32.dll")]
        static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);

        const int MOUSEEVENTF_WHEEL = 0x800;

        /// <summary>
        /// 上移
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPrivous_Click(object sender, EventArgs e)
        {
            this.axAcroPDF.Focus();
            mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
        }

        /// <summary>
        /// 下移
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNext_Click(object sender, EventArgs e)
        {
            this.axAcroPDF.Focus();
            mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -300, 0);
        }
        #endregion

上面的代码是上下移动按钮的事件,但是必须要点两次按钮,PDF控件的滚动条才会移动
这改如何解决呢? 或者还有上面其他的方法不

24 个解决方案

#2


引用 1 楼 shine_fly 的回复:
哥们儿你这帖可开的真多,还能猴子来给你解吧!(顺便问哈,给我搞100分不行?)

... 你不早说撒  那个帖子已经结了
这个帖子结贴给你点分 呵呵

#3


该回复于2011-03-31 14:19:52被版主删除

#4


没人回到? 
难道没人会吗???

#5


该回复于2011-04-01 17:10:13被版主删除

#6



static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);

参数貌似对应不上阿

#7


引用 6 楼 rabbitlzx 的回复:
static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);

参数貌似对应不上阿

 const int MOUSEEVENTF_WHEEL = 0x800;

#8


mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);


既然是这样的格式,你就应该按规矩办事,几个参数不可能都初始化为零吧

#9



[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

#10


这个我看行

#11


SENDMESSAGE和POSTMESSAGE试试。。。。我用MOUSE_EVENT做的时候也不给力的说!

基本上就这几个玩意轮着来,总有一个适合你的!

#12


引用 9 楼 lizhibin11 的回复:
C# code

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

我需要控制的是PDF空间的滚动条 不知道这个行不行
明天去试一试

#13


上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int bar, int position, int redraw);
SetScrollPos(richTextBox1.Handle, 1, 200, 1);

#14


引用 13 楼 lizhibin11 的回复:
上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200
C# code

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int bar, int position, int redraw);
SetScrollPos(richTextBox1……

第一个参数 必须是 空间名.Handle 吗? 第二与第四个参数都设为1就行了吗?

#15


引用 14 楼 zilong4460072 的回复:
引用 13 楼 lizhibin11 的回复:

上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200
C# code

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int bar, int position, int redraw……

不好意思SetScrollPos这个我搞错了,呵呵,这个只是控制scorllbar的位置移动,内容不会移动。
还是sendmessage吧,第一个参数是控件的句柄,第三个参数=1,向下一行,=0,向上一行。

#16


引用 15 楼 lizhibin11 的回复:
引用 14 楼 zilong4460072 的回复:
引用 13 楼 lizhibin11 的回复:

上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200
C# code

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int ……

呵呵 明天到公司了我试一试

#17


引用 9 楼 lizhibin11 的回复:
C# code

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

额。。 我用了这个方法COM组件的滚动条没反应
然后我换了个RichTextBox试了下 也没反应

#18


引用 9 楼 lizhibin11 的回复:
C# code

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

第三个参数为1 是向下滚动一行;为0,向上滚动一行
如果是RichTextBox 都是OK的

SendMessage(this.richTextBox1.Handle, 0x115, 1, IntPtr.Zero);
 
换成了我用的COM组件控件的话就没效果了 

SendMessage(this.axAcroPDF.Handle, 0x115, 1, IntPtr.Zero);
 
难道SendMessage不支持Com组件?

#19


该回复于2011-04-02 11:12:53被版主删除

#20




mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
写两遍,如下
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
我也不知道为什么要这样,反正我知道这样能行

#21


引用 20 楼 chokochu 的回复:
C# code


mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
写两遍,如下
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
我也不知道为什么要这样,反正我知道这样能行

呵呵 写两遍我试过了

#22


请问楼主问题解决了吗?怎么解决的?

#23


引用 22 楼 dotnetgirl_csdn 的回复:
请问楼主问题解决了吗?怎么解决的?

普通的Button解决不了 要用ToolStrip(工具栏按钮)来控制
就是用上面的方法来解决的

#24


为什么我写的窗体不滚,程序的滚动条滚动

#1


#2


引用 1 楼 shine_fly 的回复:
哥们儿你这帖可开的真多,还能猴子来给你解吧!(顺便问哈,给我搞100分不行?)

... 你不早说撒  那个帖子已经结了
这个帖子结贴给你点分 呵呵

#3


该回复于2011-03-31 14:19:52被版主删除

#4


没人回到? 
难道没人会吗???

#5


该回复于2011-04-01 17:10:13被版主删除

#6



static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);

参数貌似对应不上阿

#7


引用 6 楼 rabbitlzx 的回复:
static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);

参数貌似对应不上阿

 const int MOUSEEVENTF_WHEEL = 0x800;

#8


mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);


既然是这样的格式,你就应该按规矩办事,几个参数不可能都初始化为零吧

#9



[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

#10


这个我看行

#11


SENDMESSAGE和POSTMESSAGE试试。。。。我用MOUSE_EVENT做的时候也不给力的说!

基本上就这几个玩意轮着来,总有一个适合你的!

#12


引用 9 楼 lizhibin11 的回复:
C# code

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

我需要控制的是PDF空间的滚动条 不知道这个行不行
明天去试一试

#13


上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int bar, int position, int redraw);
SetScrollPos(richTextBox1.Handle, 1, 200, 1);

#14


引用 13 楼 lizhibin11 的回复:
上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200
C# code

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int bar, int position, int redraw);
SetScrollPos(richTextBox1……

第一个参数 必须是 空间名.Handle 吗? 第二与第四个参数都设为1就行了吗?

#15


引用 14 楼 zilong4460072 的回复:
引用 13 楼 lizhibin11 的回复:

上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200
C# code

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int bar, int position, int redraw……

不好意思SetScrollPos这个我搞错了,呵呵,这个只是控制scorllbar的位置移动,内容不会移动。
还是sendmessage吧,第一个参数是控件的句柄,第三个参数=1,向下一行,=0,向上一行。

#16


引用 15 楼 lizhibin11 的回复:
引用 14 楼 zilong4460072 的回复:
引用 13 楼 lizhibin11 的回复:

上面那个通过修改第三个参数可以实现步进,后退,顶部,底部,下面有个精确控制移动到哪个位置的,比如移动到位置200
C# code

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hwnd, int ……

呵呵 明天到公司了我试一试

#17


引用 9 楼 lizhibin11 的回复:
C# code

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

额。。 我用了这个方法COM组件的滚动条没反应
然后我换了个RichTextBox试了下 也没反应

#18


引用 9 楼 lizhibin11 的回复:
C# code

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd,int msg,int lp,IntPtr rp);
SendMessage(richTextBox1.Handle, 0x115, 7, IntPtr.Zero);

第三个参数为1 是向下滚动一行;为0,向上滚动一行
如果是RichTextBox 都是OK的

SendMessage(this.richTextBox1.Handle, 0x115, 1, IntPtr.Zero);
 
换成了我用的COM组件控件的话就没效果了 

SendMessage(this.axAcroPDF.Handle, 0x115, 1, IntPtr.Zero);
 
难道SendMessage不支持Com组件?

#19


该回复于2011-04-02 11:12:53被版主删除

#20




mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
写两遍,如下
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
我也不知道为什么要这样,反正我知道这样能行

#21


引用 20 楼 chokochu 的回复:
C# code


mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
写两遍,如下
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
我也不知道为什么要这样,反正我知道这样能行

呵呵 写两遍我试过了

#22


请问楼主问题解决了吗?怎么解决的?

#23


引用 22 楼 dotnetgirl_csdn 的回复:
请问楼主问题解决了吗?怎么解决的?

普通的Button解决不了 要用ToolStrip(工具栏按钮)来控制
就是用上面的方法来解决的

#24


为什么我写的窗体不滚,程序的滚动条滚动