富编辑控件中的鼠标滚轮滚动滞后/缓慢.如何解决此问题

Laggy/slow mouse wheel scrolling in rich edit control. How to fix this?

本文关键字:何解决 缓慢 解决 问题 滞后 控件 编辑 鼠标 滚动      更新时间:2023-10-16

Parent遗憾的是,我在谷歌上搜索"Rich Edit控件中的鼠标滚轮滚动迟缓"和类似的句子时没有找到答案。

我创建了一个富编辑控件(5.0)作为子控件,添加了样式WS_VISIBLE、WS_child、WS_VSCROLL、ES_READONLY、ES_MULTILINE、ES_NOHIDESEL、ES_AUTOVCROLL,并将消息处理程序回调子类化。在添加了大约200行文本后,如果我使用鼠标滚轮,VScroll移动非常缓慢。对于laggy,我的意思是,当我已经停止使用鼠标滚轮滚动时,富编辑Vsollbar的拇指仍在滚动。单击拇指滚动并四处移动效果良好。

目前我不知道为什么会发生这种情况。也许有人知道为什么鼠标滚轮滚动如此缓慢,以及如何解决这个疯狂的问题?

编辑:我现在也测试了它,没有直接用一个父窗口子类化新项目。如果我写大约200行,它仍然有同样的问题。这是我用来创建富编辑控件的代码:

ATOM MyRegisterClass(HINSTANCE hInstance){
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = WndProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BUGTEST));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_BUGTEST);
wcex.lpszClassName  = szWindowClass;
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
HWND hWnd;
hInst = hInstance; 
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
LoadLibraryA("Msftedit.dll");                    
wstring w_classname = wstring(MSFTEDIT_CLASS);
string classname = string(w_classname.begin(), w_classname.end());
HWND richedit = CreateWindowExA(
WS_EX_CLIENTEDGE,                                                
classname.c_str(),
"richedit",                                                                  
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_NOHIDESEL | ES_MULTILINE | ES_AUTOVSCROLL | ES_LEFT,     
200, 300,                                                    
400, 500,                                                
hWnd,                                                
NULL,                                                        
hInstance,                                               
NULL
);
UpdateWindow(hWnd);
return TRUE;
}

K所以在这个问题上又花了几个小时之后,我现在发现了一些建议,即富编辑控件使用SMOOTH VSCROLL。甚至写字板也使用这个Smoothscroll,并出现了同样的"滞后"问题。(http://simonscodes.blogspot.de/2014/12/hello.html)很遗憾,我无法从这个页面上获得可能解决问题的示例代码,但在阅读了这篇文章->禁用Richtextbox上的平滑滚动后,我现在创建了一个自己的解决方案。我现在使用的方法是对富编辑控件进行子类化,阻止WM_MOUSEWEEL消息,并通过发送WM_VSCROLL消息自行处理它。这避免了平滑VSCROLL,并停止了这种疯狂的滞后滚动问题。

下面是我的子类消息处理程序回调中的代码:

case WM_MOUSEWHEEL:{
if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) // A positive value indicates that the wheel was rotated forward, away from the user; 
SendMessageA(hRichEdit, WM_VSCROLL, SB_LINEUP, NULL);
else if (GET_WHEEL_DELTA_WPARAM(wParam) < 0) //A negative value indicates that the wheel was rotated backward, toward the user.
SendMessageA(hRichEdit, WM_VSCROLL, SB_LINEDOWN, NULL);
return TRUE;  //block the message
}

有关此代码的部分工作方式或WM_MOUSEWEEL消息的更多信息,请阅读此处:https://msdn.microsoft.com/en-us/library/windows/desktop/ms645617%28v=vs.85%29.aspx