gpt4 book ai didi

mfc - 如何处理父窗体中的 CEdit 鼠标单击?

转载 作者:行者123 更新时间:2023-12-04 02:55:50 25 4
gpt4 key购买 nike

我是 MFC 的新手(来自 C# 和 Java)并且正在解决问题。

考虑一个包含三个文本框的对话框。我已将 CEdit 子类化为 CMyEdit,并且三个文本框连接到对话框类中的 CMyEdit 变量。

我想让对话框类“知道”何时用鼠标左键单击了三个文本框中的任何一个。我找到了如何将 ON_WM_LBUTTONDOWN 处理程序添加到我的 CMyEdit 类的示例。效果很好,但处理程序仅在 CMyEdit 类中。假设每当单击其中一个文本框时,我希望对话框禁用其他两个。如何让对话框通知左键单击?

这是一个完全人为和简化的示例。我实际上没有一个应用程序让我担心在文本框中单击鼠标左键。但我认为我无法弄清楚如何去做这一事实表明对如何在 MFC 中处理 UI 事件存在根本性的误解。

来自 C# 的世界,在那里一切都为我完成,我可以直接访问我想要的任何事件(获得焦点、鼠标双击,等等)我很困惑为什么某些事件是特殊的并且提供方便的访问。在 CEdit 的情况下,我不明白为什么我可以“直接”获得焦点、取消焦点、更改和其他几个事件而没有问题,但其他事件(例如鼠标单击)却没有。

但回到我的实际问题:在上述场景中,如何让对话框通知鼠标左键单击文本框?文本框是否需要引发事件或向对话框发送消息(或其他内容)?

最佳答案

将 WM_LBUTTONUP 处理程序添加到您的消息映射

BEGIN_MESSAGE_MAP(CYourDialog, CDialog)
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

最简单的方法是向窗口添加事件处理程序。这通过资源编辑器最容易完成。转到属性页面,然后转到消息部分。然后为 WM_LBUTTONUP 添加一个函数。

最后你可以像下面这样填写函数。

void CYourDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
// Grab the 3 (or more) edit control
CEdit* pEdit1 = (CEdit*)GetDlgItem( ID_YOUR_EDIT_CONTROL1 );
CEdit* pEdit2 = (CEdit*)GetDlgItem( ID_YOUR_EDIT_CONTROL2 );
CEdit* pEdit3 = (CEdit*)GetDlgItem( ID_YOUR_EDIT_CONTROL3 );

// Grab the edit control window rects in screen coords.
CRect edit1Rect;
CRect edit2Rect;
CRect edit3Rect;
pEdit1->GetWindowRect( &edit1Rect );
pEdit2->GetWindowRect( &edit2Rect );
pEdit3->GetWindowRect( &edit3Rect );

// Convert to client coordinates relative to their parent (ie this) window.
ScreenToClient( edit1Rect );
ScreenToClient( edit2Rect );
ScreenToClient( edit3Rect );

// Test if the point passed in to this function is in the control's rectangle.
const BOOL bEnable1 = edit1Rect.PtInRect( point );
const BOOL bEnable2 = edit2Rect.PtInRect( point );
const BOOL bEnable3 = edit3Rect.PtInRect( point );

// Enable the window that was clicked on and disable the others.
pEdit1->EnableWindow( bEnable1 );
pEdit2->EnableWindow( bEnable2 );
pEdit3->EnableWindow( bEnable3 );

// Set keyboard focus to the relevant control
if ( bEnable1 )
{
pEdit1->SetFocus();
}
else if ( bEnable1 )
{
pEdit2->SetFocus();
}
else if ( bEnable1 )
{
pEdit3->SetFocus();
}

CDialog::OnLButtonUp(nFlags, point);
}

本质上,这将进行 HitTest ,如果 HitTest 在编辑窗口中,它将启用它,禁用其他测试并为其提供键盘焦点。

关于mfc - 如何处理父窗体中的 CEdit 鼠标单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1506145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com