MFC Win32 |单击工具栏按钮后未收到 LButtonUp (CMFCToolBarButton::OnClick)
MFC Win32 | LButtonUp not being received after clicking toolbar button (CMFCToolBarButton::OnClick)
我想要达到的目标
嗯,标题可能没有很好地说明问题,所以就这样吧:
我正在尝试使用 MFC 创建一个 Win32 应用程序,让您可以编辑和检查其他 windows。
我希望用户能够 select 其他 windows.
我从 sysinternals 应用程序(如 ProcessExplorer)工具栏上的“查找 Window 进程”工具中获得灵感。
它的工作方式是你点击,然后 window 消失,然后你把它拖到你想要 select 的 window 上。它周围会弹出一个边框,当您松开时,它 select 是 window 鼠标结束。
我的问题
我面临的问题是我不知道如何检测用户何时在另一个 window 上松开鼠标。
我在 CMFCToolBarButton
中使用 OnClick
检测鼠标按下
我尝试使用 SetCapture()
,但没有任何效果。
我尝试使用 OnNcLButtonUp
和 OnLButtonUp
但它们都不起作用。 (旁边 SetCapture
)
到目前为止,这是我的代码 (ChildView.cpp
):
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON_UPDATE_COMMAND_UI(ID_TB_LOCATEWINDOW, &CChildView::EnableToolbarButton)
ON_UPDATE_COMMAND_UI(ID_TOOLS_MESSAGELAUNCHER, &CChildView::EnableToolbarButton)
ON_WM_XBUTTONUP()
// ON_WM_LBUTTONUP()
ON_WM_NCLBUTTONUP()
END_MESSAGE_MAP()
....
void CChildView::LocateWindow()
{
GetParentFrame()->ShowWindow(SW_MINIMIZE);
SetCapture();
}
void CChildView::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
ReleaseCapture();
GetParentFrame()->ShowWindow(SW_NORMAL);
MessageBox(L"Stuff", L"");
CWnd::OnNcLButtonUp(nHitTest, point);
}
我想提一下,单击工具栏按钮时会调用 LocateWindow
函数(如鼠标按下,而不是鼠标按下和向上)
它是从 OnClick
函数调用的。
这是相关代码:
(我把按钮换成了OnToolbarReset
)
// CLocateWindowButton.cpp : implementation file
//
#include "pch.h"
#include "WindowHacker.h"
#include "MainFrm.h"
#include "CLocateWindowButton.h"
// CLocateWindowButton
IMPLEMENT_SERIAL(CLocateWindowButton, CMFCToolBarButton, 1)
// CLocateWindowButton member functions
CLocateWindowButton::CLocateWindowButton()
{
}
CLocateWindowButton::CLocateWindowButton(CMainFrame* mainFrame, UINT uiCmdID, LPCTSTR lpszText) : CMFCToolBarButton(uiCmdID, NULL, lpszText)
{
this->mainFrame = mainFrame;
}
BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
//(CMainFrame*)m_pWndParent->LocateWindow();
mainFrame->LocateWindow();
return FALSE;
}
void CLocateWindowButton::CopyFrom(const CMFCToolBarButton& src)
{
CMFCToolBarButton::CopyFrom(src);
mainFrame = ((CLocateWindowButton&)src).mainFrame;
}
//void CLocateWindowButton::AssertValid() const
//{
// CMFCToolBarButton::AssertValid();
//
// // TODO: Add your specialized code here and/or call the base class
//}
更新:
当我把它放在 LButtonDown
事件中时它似乎工作,当它从 CMFCToolBarButton
中的 OnClick
检测到时它似乎不起作用
我发现在CMFCToolBar::OnLButtonUp
中,在按钮中调用OnClick
后,它重新捕获光标,使我们的SetCapture
无效。
但是如果我 return TRUE
而不是 OnClick
中的 FALSE
,则不会重新捕获鼠标。
所以改变这个:
BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
//(CMainFrame*)m_pWndParent->LocateWindow();
mainFrame->LocateWindow();
//ReleaseCapture();
this->mainFrame->SetCapture();
return FALSE;
}
为此:
BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
//(CMainFrame*)m_pWndParent->LocateWindow();
mainFrame->LocateWindow();
//ReleaseCapture();
this->mainFrame->SetCapture();
return TRUE; // The line is changed here
}
邮件改为发送至 CMainFrame
。
我想要达到的目标
嗯,标题可能没有很好地说明问题,所以就这样吧:
我正在尝试使用 MFC 创建一个 Win32 应用程序,让您可以编辑和检查其他 windows。 我希望用户能够 select 其他 windows.
我从 sysinternals 应用程序(如 ProcessExplorer)工具栏上的“查找 Window 进程”工具中获得灵感。
它的工作方式是你点击,然后 window 消失,然后你把它拖到你想要 select 的 window 上。它周围会弹出一个边框,当您松开时,它 select 是 window 鼠标结束。
我的问题
我面临的问题是我不知道如何检测用户何时在另一个 window 上松开鼠标。
我在 CMFCToolBarButton
OnClick
检测鼠标按下
我尝试使用 SetCapture()
,但没有任何效果。
我尝试使用 OnNcLButtonUp
和 OnLButtonUp
但它们都不起作用。 (旁边 SetCapture
)
到目前为止,这是我的代码 (ChildView.cpp
):
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
ON_UPDATE_COMMAND_UI(ID_TB_LOCATEWINDOW, &CChildView::EnableToolbarButton)
ON_UPDATE_COMMAND_UI(ID_TOOLS_MESSAGELAUNCHER, &CChildView::EnableToolbarButton)
ON_WM_XBUTTONUP()
// ON_WM_LBUTTONUP()
ON_WM_NCLBUTTONUP()
END_MESSAGE_MAP()
....
void CChildView::LocateWindow()
{
GetParentFrame()->ShowWindow(SW_MINIMIZE);
SetCapture();
}
void CChildView::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
ReleaseCapture();
GetParentFrame()->ShowWindow(SW_NORMAL);
MessageBox(L"Stuff", L"");
CWnd::OnNcLButtonUp(nHitTest, point);
}
我想提一下,单击工具栏按钮时会调用 LocateWindow
函数(如鼠标按下,而不是鼠标按下和向上)
它是从 OnClick
函数调用的。
这是相关代码:
(我把按钮换成了OnToolbarReset
)
// CLocateWindowButton.cpp : implementation file
//
#include "pch.h"
#include "WindowHacker.h"
#include "MainFrm.h"
#include "CLocateWindowButton.h"
// CLocateWindowButton
IMPLEMENT_SERIAL(CLocateWindowButton, CMFCToolBarButton, 1)
// CLocateWindowButton member functions
CLocateWindowButton::CLocateWindowButton()
{
}
CLocateWindowButton::CLocateWindowButton(CMainFrame* mainFrame, UINT uiCmdID, LPCTSTR lpszText) : CMFCToolBarButton(uiCmdID, NULL, lpszText)
{
this->mainFrame = mainFrame;
}
BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
//(CMainFrame*)m_pWndParent->LocateWindow();
mainFrame->LocateWindow();
return FALSE;
}
void CLocateWindowButton::CopyFrom(const CMFCToolBarButton& src)
{
CMFCToolBarButton::CopyFrom(src);
mainFrame = ((CLocateWindowButton&)src).mainFrame;
}
//void CLocateWindowButton::AssertValid() const
//{
// CMFCToolBarButton::AssertValid();
//
// // TODO: Add your specialized code here and/or call the base class
//}
更新:
当我把它放在 LButtonDown
事件中时它似乎工作,当它从 CMFCToolBarButton
OnClick
检测到时它似乎不起作用
我发现在CMFCToolBar::OnLButtonUp
中,在按钮中调用OnClick
后,它重新捕获光标,使我们的SetCapture
无效。
但是如果我 return TRUE
而不是 OnClick
中的 FALSE
,则不会重新捕获鼠标。
所以改变这个:
BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
//(CMainFrame*)m_pWndParent->LocateWindow();
mainFrame->LocateWindow();
//ReleaseCapture();
this->mainFrame->SetCapture();
return FALSE;
}
为此:
BOOL CLocateWindowButton::OnClick(CWnd* pWnd, BOOL bDelay = TRUE) {
//(CMainFrame*)m_pWndParent->LocateWindow();
mainFrame->LocateWindow();
//ReleaseCapture();
this->mainFrame->SetCapture();
return TRUE; // The line is changed here
}
邮件改为发送至 CMainFrame
。