Доступ к MFC - PullRequest
       9

Доступ к MFC

1 голос
/ 07 марта 2019

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

В родительском окне я создал дескриптор 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"));
    }

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

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

1 Ответ

1 голос
/ 07 марта 2019

Вы можете использовать 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 или выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...