- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个疯狂的问题。我对按钮、richedits、复选框进行了子类化,.. 一切似乎都工作正常。但是在我对 trackbar 进行子类化之后,我现在遇到了一些麻烦。问题是我的子类消息处理程序没有收到 WM_VSCROLL/WM_HSCROLL 消息。它们仍然被发送到父级的消息处理程序。 WM_PAINT 消息和其他一些消息已成功发送到子类消息处理程序。有人知道我做错了什么吗? ......也许知道如何解决这个问题?我使用以下所需代码创建了一个干净的项目:
#include <windows.h>
#include <CommCtrl.h>
#pragma comment(lib,"comctl32.lib")
//Prototyps
HWND CreateMainWindow(HINSTANCE hInstance);
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
LRESULT CALLBACK SubMessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
WNDPROC oldWndProc;
HWND hWnd = 0;
HWND hTrackBar = 0;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
WNDCLASSEXA wndClass = {sizeof(WNDCLASSEX), CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, MessageHandler, 0,0, hInstance, LoadIcon(NULL, IDI_WINLOGO),
LoadCursor(NULL, IDC_ARROW),(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, "WindowClass", LoadIcon(NULL, IDI_WINLOGO)};
RegisterClassExA(&wndClass);
//Creat MainWindow
hWnd = CreateWindowExA(NULL, "WindowClass", "Test Windows", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
100, 100, 400, 300, NULL, NULL, hInstance, NULL);
//Creat Trackbar
INITCOMMONCONTROLSEX initCtrlEx;
initCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
initCtrlEx.dwICC = ICC_BAR_CLASSES;
if (InitCommonControlsEx(&initCtrlEx)){
hTrackBar = CreateWindowExA(NULL,TRACKBAR_CLASSA, "TrackBar_Test", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | TBS_AUTOTICKS |
TBS_ENABLESELRANGE | TBS_VERT | TBS_BOTH, 10, 10, 50, 200, hWnd, NULL, hInstance, NULL);
oldWndProc = (WNDPROC)SetWindowLongPtrA(hTrackBar, GWLP_WNDPROC, (LONG_PTR)SubMessageHandler); //Subclassing messagehandler
}
//Message loop
MSG msg;
while (GetMessageA(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
return 0;
}
LRESULT CALLBACK SubMessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch (msg){
case WM_VSCROLL: //callback is subclassed but WM_VSCROLL is not send. why?
MessageBoxA(hWnd, "WM_VSCROLL sent (to SubMessageHandler)", "Test", MB_OK);
break;
}
if (oldWndProc != 0)
return CallWindowProcA(oldWndProc, hwnd, msg, wParam, lParam);
else
return DefWindowProcA(hwnd, msg, wParam, lParam);
}
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch (msg){
case WM_VSCROLL: //Why the hell is the Trackbar WM_VSCROLL still sent here to the parent callback!?!?
MessageBoxA(hWnd, "WM_VSCROLL sent (to Parent)", "Test", MB_OK);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return DefWindowProcA(hwnd, msg, wParam, lParam);
}
最佳答案
来自 the MSDN documentation on Trackbar controls :
A trackbar notifies its parent window of user actions by sending the parent a WM_HSCROLL or WM_VSCROLL message.
Trackbar的约定是用WM_HSCROLL
/WM_VSCROLL
通知父窗口。 Trackbar 控件生成并发送这些消息;它不接收它们。
另请注意 Default Trackbar Message Processing section不列出 WM_HSCROLL
/WM_VSCROLL
(但列出 WM_LBUTTONDOWN
、WM_MOUSEMOVE
、WM_LBUTTONUP
, WM_KEYDOWN
, WM_KEYUP
,这是处理交互需要处理的原始消息)。
至于如何处理,这可能完全取决于您想要做什么。您可以尝试子类化并拦截所有用户输入消息,但这似乎需要大量工作并且可能很脆弱。我的建议是让父窗口将 WM_HSCROLL
/WM_VSCROLL
显式反射(reflect)回您的自定义 Trackbar 控件。
关于c++ - 来自 TrackBar 的 WM_VSCROLL/WM_HSCROLL 消息不会发送到子类 MessageHandler。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006030/
我想将 JavaScript 变量传递给 Swift。我在 JavaScript 中遇到错误并搜索它,但没有得到任何结果。错误是: TypeError: Cannot read property 'm
我正在使用 Symfony Messenger,我想在处理程序中继续发送消息,直到它被发送多次。 我怎样才能跟踪它? 到目前为止,这是我的处理程序类的代码: class RetryTestHandle
我面临以下问题,但尚未找到有效的解决方案。我有 3 个不同的应用程序,它们应该相互通信: 用户界面部分(1) 后端应用程序(2) “云端”微服务(3) 后端应用程序为 UI 提供 Web 服务 (RE
我想通过拆分并行处理项目列表,将每个项目路由到它们适当的网关并聚合结果。但是,我的应用程序没有启动,出现以下错误: BeanCreationException: The 'currentCompone
我们有一组在 JAX-WS 中实现的 Web 服务和一个在 SOAP header 中添加控制属性的 SOAPHandler。今天,我们需要在我们创建的每个新服务中添加 @HandlerChain 注
我如何从 MessageHandler 中检索 ActionDescriptor? 我可以使用以下代码在 SendAsync 方法中获取 ContractDescriptor: var config
我正在尝试使用 IdempotentReceiverInterceptor 来防止我的集成流发出它已经生成的消息。但是,IdempotentReceiverInterceptor#invoke 似乎只
Tomcat 8.0.21 这个有效: session.addMessageHandler(new MessageHandler.Whole() { @Override
我试图通过事件从 web View 中执行 android 中的代码。所以我用 JavascriptInterface 实现了一个好方法,但是因为我有一个 iOS 应用程序,所以我想使用相同的方法。那
更新:错误在于使用 Action onSuccess对于实际任务并在没有 await 的情况下调用它。我们实际上正在传递一个 async回调作为 onSuccess ,因此它不会阻塞,它只是被解雇而不
在我的 pdf 中,在我的 onOpenAction 中,我有这个 js 代码: app.alert(this.hostContainer); try { this.hostContainer.
我花了相当多的时间试图弄清楚如何导入和使用来自 spring 框架 的 MessageHandler 接口(interface)。以下是我使用 IntelliJ Idea IDE 所做的事情: imp
我有一个简单的 Spring Integration 配置可以工作 @Configuration public class FTPIntegration { @Bean public MessageC
我有一个疯狂的问题。我对按钮、richedits、复选框进行了子类化,.. 一切似乎都工作正常。但是在我对 trackbar 进行子类化之后,我现在遇到了一些麻烦。问题是我的子类消息处理程序没有收到
我正在使用 WKWebView,我正在加载要显示的网页 (React)。但是我的 didFinish 触发得太早了。因此,当我的代表通知 didFinish 时,在加载实际数据之前,我只会看到几秒钟的
我正在使用 PDF.JS 加载 pdf。加载pdf时,我收到此错误, ERROR Error: Unknown action from worker: undefined at Worker.
是否可以仅为使用路由属性的特定 Controller 添加 MessageHandler? 如果它不包含某些 header ,我想在管道中更早地切断请求。我想要 提到: 我不能在 WebApiConf
我正在尝试使用 DSL 测试一些带有 spring-integration 的东西。到目前为止这只是一个测试,流程很简单: 创建一些消息 并行处理(记录)它们 聚合它们 记录聚合 除了聚合器,它工作正
我成功地将 Autofac 连接到我的 ASP.NET WebAPI 项目中,现在我想知道如何能够解析我的 MessageHandler 中的服务。 由于必须在应用程序启动时添加 MessageHan
我正在努力处理 Spring-WS 项目。 在我的 Endpoint 类中,如果我没有指定我正在接收/返回 JAXBElement,我会收到以下错误:No adapter for endpoint;您
我是一名优秀的程序员,十分优秀!