MFC, получающий доступ к ожиданию выброса lparam

#c #visual-c #mfc

#c #visual-c #mfc

Вопрос:

У меня есть 2 элемента управления CEdit в представлении, оба они имеют одинаковый идентификатор.

В родительском окне я создал дескриптор ON_EN_CHANGE, чтобы перехватить их сообщение об изменении. Поскольку редактирование любого из этих полей редактирования приведет к отправке сообщения функции handle, я хочу найти способ отличить, от какого элемента управления редактированием оно исходит.

Итак, в моей функции handle я использовал GetCurrentMessage() для получения объекта MSG. и этот lparam должен быть указателем вызывающего элемента управления edit.

Но когда я изменяю его, он возвращает исключение с надписью «местоположение чтения с нарушением доступа»

     //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"));
    }
  

Поскольку оба элемента управления редактированием используют одну и ту же функцию дескриптора, мне нужно знать, какая из них вызывается. Я не уверен, что это правильный способ сделать это. но я думаю, что это должно сработать.

Любое предложение было бы отличным. Спасибо

Комментарии:

1. Вам лучше прочитать EN_CHANGE документацию . lParam «Аргумент» не является указателем на CEdit элемент управления. Это дескриптор элемента управления Windows API.

Ответ №1:

Вы можете использовать lParam следующим образом:

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

Вероятно, было бы разумнее присвоить двум элементам управления редактированием разные идентификаторы (которые вы используете 1 для обоих). Затем вы можете проверить, 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)
  

Также обратите внимание, что IDOK является 1 . Запустите свои идентификаторы элементов управления с 100 или выше.

Комментарии:

1. Мои элементы управления редактированием динамически генерируются во время выполнения. Это всего лишь тестовый код. Я пытаюсь найти способ различать их в функции handle. Поэтому, когда один из них редактируется, я бы знал, какой именно. Я пытаюсь, чтобы они попали в одну и ту же конечную точку и отделились оттуда. Спасибо за это. Мне нужно это протестировать.