【问题标题】:MFC Accessing lparam throw expectionMFC 访问 lparam 抛出异常
【发布时间】:2019-07-29 15:40:03
【问题描述】:

我在视图中有 2 个 CEdit 控件,它们都有相同的 ID。

在父窗口中,我创建了 ON_EN_CHANGE 句柄来捕捉他们的编辑消息。 由于编辑其中任何一个编辑框都会向句柄函数发出一条消息,我想找到一种方法来区分它来自哪个编辑控件。

所以在我的句柄函数中,我使用 GetCurrentMessage() 来获取 MSG 对象。 lparam应该是调用编辑控件的指针。

但是当我修改它时,它返回异常说“访问冲突读取位置”

    //onCreate function
    text1->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | ES_MULTILINE | WS_VSCROLL, \
    CRect(300,200,400,300), this, 1);
    text2->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | ES_MULTILINE | WS_VSCROLL, \
    CRect(100, 100, 300, 200), this, 1);

    //parent class
    BEGIN_MESSAGE_MAP(CScratchView, CView)
    ...
    ON_EN_CHANGE(1, chandle)
    END_MESSAGE_MAP()

    //Message handle function
    void CScratchView::chandle()
    {
        const MSG* lst = GetCurrentMessage();
        if (lst->lParam != NULL) {
        CEdit* sa = (CEdit*) lst->lParam;
        sa->SetWindowTextW(_T("what"));
    }

由于两个编辑控件共享相同的句柄函数,我需要知道调用的是哪一个。我不确定这是正确的方法。但我认为这应该可行。

任何建议都会很棒。谢谢

【问题讨论】:

  • 你最好阅读the EN_CHANGE documentationlParam“参数”不是指向CEdit 控件的指针。它是控件的 Windows API 句柄

标签: c++ visual-c++ mfc


【解决方案1】:

你可以像这样使用lParam:

CEdit *sa = (CEdit *) CWnd::FromHandle(lst->lParam);

给两个编辑控件不同的 ID 可能会更聪明(你对两者都使用1)。然后您可以检查包含控件 ID 的LOWORD(lst->wParam)

text1->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | ES_MULTILINE | WS_VSCROLL, 
              CRect(300,200,400,300), this, 100);

text2->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | ES_MULTILINE | WS_VSCROLL, 
              CRect(100, 100, 300, 200), this, 101);

...

ON_EN_CHANGE(100, chandle)
ON_EN_CHANGE(101, chandle)

还要注意IDOK1。以 100 或更高版本开始您的控件 ID。

【讨论】:

  • 我的编辑控件是在运行时动态生成的。这只是一个测试代码。我试图找出一种在句柄函数中区分它们的方法。所以当其中一个被编辑时,我会知道是哪一个。我试图让它们到达同一个端点并从那里分开。谢谢你。我需要测试一下。
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 2013-05-24
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2022-01-08
  • 2015-10-11
相关资源
最近更新 更多