Использовать события в MFC CStatic и передавать их родителю - PullRequest
1 голос
/ 18 января 2010

Я создаю приложение MFC, где есть CDialog с дочерним контролем, полученным из CStatic.

Я хочу получать события мыши для управления CStatic, поэтому я установил для "Notify" значение true. Теперь я могу получать сообщения о событиях непосредственно через карту сообщений в MyStatic:


class CMyStatic : public CStatic
{
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // Gets invoked
DECLARE_MESSAGE_MAP()
}

Проблема в том, что теперь родительский CDialog не получает события мыши, когда мышь находится над MyStatic child. Я могу отправить их с MyStatic вручную, но есть ли способ пропустить их автоматически? И все же сможете получать их также на MyStatic, используя карты сообщений?

Ответы [ 2 ]

5 голосов
/ 18 января 2010

Нет, вы недоразумение. SS_NOTIFY не заставляет ваш CStatic получать сообщения, он заставляет CStatic ретранслировать сообщения обратно родителю. Так что «Теперь я могу получать события сообщений через карту сообщений непосредственно в MyStatic», основано на ложной предпосылке.

Это важное замечание, поскольку элемент управления может принимать сообщения только для самого , а не для своих детей, если только эти дети не «играют вместе», передавая сообщения или выполняя другие трюки (глобальная перехват, ...); но эти случаи являются исключением, «нормальным» способом является то, что каждое окно получает сообщения для себя.

Таким образом, это отвечает на ваш вопрос: нет, нельзя позволить и родителю (ваш CDialog), и ребенку (ваш CStatic) получать события мыши, не делая это «вручную» или вовлекаясь в утомительные действия по маршрутизации сообщений. Поэтому в вашем случае вам нужно выполнить GetParent () -> SendMessage (WM_LBUTTONDOWN, ...) и т. Д., Вручную воссоздавая значения WPARAM и LPARAM; или вызов OnLButtonDown непосредственно на CDialog: GetParent () -> OnLButtonDown (...). Вам придется подумать о том, какие координаты мыши вы передаете обратно в CDialog, хотя, возможно, вам придется преобразовать их в клиентские координаты CDialog.

1 голос
/ 19 января 2010

Если вы вызываете базовый обработчик OnLButtonDown, сообщение должно быть отправлено родителю.

CMyStatic::OnLButtonDown(UINT nFlags, CPoint point)
{
    CStatic::OnLButtonDown(nFlags, point);

    // custom handling
}
...