我有一个面板(用户控件),它需要滚动鼠标滚轮。在面板上有许多多行文本框。即使它们没有滚动条,它们在聚焦时捕捉鼠标轮事件。如何将事件传递给父控件,以便面板在选中多行文本框时使用鼠标滚轮进行滚动?如何使多行文本框传递MouseWheel事件,以便容器可滚动
0
A
回答
2
解决方案是使用从TextBox继承并重写WndProc方法的自定义控件。以下溶液从一个答案适应于similar question:
class MouseTransparentTextBox : TextBox
{
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x020A: // WM_MOUSEWHEEL
case 0x020E: // WM_MOUSEHWHEEL
if (this.ScrollBars == ScrollBars.None && this.Parent != null)
m.HWnd = this.Parent.Handle; // forward this to your parent
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
}
0
一个更直接的方法是捕集鼠标滚轮事件。在发射时,向上或向下移动插入符号很容易,然后使用ScrollToCaret()使htat线可见。
private void ScrollTextBox(object sender, MouseEventArgs e)
// Mouse wheel has been turned while text box has focus
{
// Check scroll amount (+ve is upwards)
int deltaWheel = e.Delta;
if (deltaWheel != 0)
{
// Find total number of lines
int nLines = edtAddress.Lines.Length;
if (nLines > 0)
{
// Find line containing caret
int iLine = edtAddress.GetLineFromCharIndex(edtAddress.SelectionStart);
if (iLine >= 0)
{
// Scroll down
if (deltaWheel > 0)
{
// Move caret to start of previous line
if (iLine > 0)
{
int position = edtAddress.GetFirstCharIndexFromLine(iLine - 1);
edtAddress.Select(position, 0);
}
}
else // Scroll up
{
// Move caret to start of next line
if (iLine < (nLines - 1))
{
int position = edtAddress.GetFirstCharIndexFromLine(iLine + 1);
edtAddress.Select(position, 0);
}
}
// Scroll to new caret position
edtAddress.ScrollToCaret();
}
}
}
}
相关问题
- 1. 如何在jquery中正确使用mousewheel和滚动事件?
- 2. 防止多行文本框“偷”滚动事件
- 3. 如何防止添加文本时滚动多行文本框?
- 4. 从父容器传播滚动事件到子容器
- 5. 如何修改现有的AS3事件以便我可以传递数据?
- 6. 如何防止ScrollViewer使用MouseWheel事件
- 7. 从uibutton传递滚动事件到uiscrollview
- 8. 如何将凭证传递给机器,以便我可以使用Microsoft.Win32.RegistryKey.OpenRemoteBaseKey()?
- 9. 我可以在文本框的onChange事件中传递ID名称吗?
- 10. 如何更新文本框,以便它可以更改金额?
- 11. 如何滚动到多行文本框的底部?
- 12. 如何同步两个多行文本框的滚动?
- 13. 如何将排序条件传递给方法以便可以使用sort_by
- 14. 如何修改div以便滚动文本不会超越它?
- 15. 多行文本框的点击事件
- 16. 垂直文本Changed事件期间滚动文本框的Scintilla
- 17. 将MouseWheel事件从子项传递给父项
- 18. 使用jQuery从多行文本框传递值ajax
- 19. MouseWheel,确定向上和向下滚动事件
- 20. ScrollViewer在滚动时不触发MouseWheel事件
- 21. XBAPs和MouseWheel事件
- 22. MouseWheel:滚动与缩放
- 23. 需要mousewheel滚动usercontrol
- 24. mousewheel在div上滚动
- 25. 如何覆盖fieldset.html模板,以便可以传递更多参数
- 26. 如何存储文本框的值以便以后使用Javascript?
- 27. 如何在多行文本框中不断滚动到文本的末尾?
- 28. 我如何滚动,以便在扩展扩展器后可见控件
- 29. 防止可滚动容器(Sencha 2)内的传送带滚动?
- 30. 如何文本框的值传递给Java脚本按钮单击事件
在我的情况下,这没有奏效。覆盖WndProc是正确的,但我不得不重新发布消息到父控件。 'PostMessage(Parent.Handle,m.Msg,m.WParam,m.LParam);' – RancidOne 2017-03-01 18:53:01