富编辑控件中的鼠标滚轮滚动滞后/缓慢.如何解决此问题
Laggy/slow mouse wheel scrolling in rich edit control. How to fix this?
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
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 两个文件使用彼此的功能-如何解决
- 计算每个节点的树高,帮助我解释这个代码解决方案
- Python中的for循环与C++有何不同
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- visual c++,如何获取解决方案目录中的代码
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 缓慢提升ASIO
- 如何解决这个超硬恒星的创造问题
- 富编辑控件中的鼠标滚轮滚动滞后/缓慢.如何解决此问题
- 众所周知的解决方案,用于避免dynamic_cast的缓慢