我有一個面板(用戶控件),它需要滾動鼠標滾輪。在面板上有許多多行文本框。即使它們沒有滾動條,它們在聚焦時捕捉鼠標輪事件。如何將事件傳遞給父控件,以便面板在選中多行文本框時使用鼠標滾輪進行滾動?如何使多行文本框傳遞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. 使用mousewheel滾動元素時傳播的事件是什麼?
- 2. 如何在jquery中正確使用mousewheel和滾動事件?
- 3. 防止多行文本框「偷」滾動事件
- 4. 如何使用asp文本框的按鍵事件傳遞值?
- 5. Mousewheel在C#winform中以編程方式向下滾動事件
- 6. 如何防止添加文本時滾動多行文本框?
- 7. 捕捉文本框滾動事件?
- 8. 如何修改現有的AS3事件以便我可以傳遞數據?
- 9. 從父容器傳播滾動事件到子容器
- 10. 如何在WinForms中創建自動滾動多行文本框?
- 11. 如何防止ScrollViewer使用MouseWheel事件
- 12. 如何將文本框中的值傳遞給自身事件
- 13. 如何使WPF文本框傳遞ApplicationCommands?
- 14. WPF中的可滾動文本框不會滾動,因爲它大於容器
- 15. 從uibutton傳遞滾動事件到uiscrollview
- 16. 如何將憑證傳遞給機器,以便我可以使用Microsoft.Win32.RegistryKey.OpenRemoteBaseKey()?
- 17. 我可以在文本框的onChange事件中傳遞ID名稱嗎?
- 18. 「滾動」單行文本框
- 19. 如何更新文本框,以便它可以更改金額?
- 20. 如何將排序條件傳遞給方法以便可以使用sort_by
- 21. 如何同步兩個多行文本框的滾動?
- 22. 如何滾動到多行文本框的底部?
- 23. 使用鍵盤事件滾動文本
- 24. 如何修改div以便滾動文本不會超越它?
- 25. 如何將容器wav文件上傳到編碼器以便轉換爲mp4?
- 26. 多行文本框的點擊事件
- 27. 垂直文本Changed事件期間滾動文本框的Scintilla
- 28. 將MouseWheel事件從子項傳遞給父項
- 29. 如何在便攜式原生JavaScript中滾動以便組件可見?
- 30. 限制多行文本框輸入以便打印所有內容
在我的情況下,這沒有奏效。覆蓋WndProc是正確的,但我不得不重新發布消息到父控件。 'PostMessage(Parent.Handle,m.Msg,m.WParam,m.LParam);' – RancidOne 2017-03-01 18:53:01