#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. Поэтому, когда один из них редактируется, я бы знал, какой именно. Я пытаюсь, чтобы они попали в одну и ту же конечную точку и отделились оттуда. Спасибо за это. Мне нужно это протестировать.