Как узнать, когда элементы управления будут скрыты - PullRequest
0 голосов
/ 04 февраля 2009

У меня есть элемент управления, полученный из объекта CWnd, который имеет свою собственную систему подсказок. Всплывающая подсказка реализована с использованием CDialog и работает нормально, но у меня есть проблема с определением, когда мне нужно ее скрыть.

Всплывающая подсказка отображается, когда мышь наводит курсор на элемент управления (WM_MOUSEHOVER), и скрывается, когда мышь покидает элемент управления (WM_MOUSELEAVE). Все идет нормально. Проблема в том, что диалоговое окно, в котором установлен элемент управления, может быть скрыто из меню (не уничтожено, его можно снова отобразить из меню). Когда это происходит, событие WM_MOUSELEAVE не отправляется в элемент управления, и всплывающая подсказка не удаляется ... она появляется в новом диалоговом окне.

Мой вопрос: есть ли способ узнать, что контроль скрыт? Я знаю, что могу записать сообщение WM_SHOWWINDOW для диалогового окна, в котором установлен элемент управления, но я хочу сделать это из самого элемента управления, чтобы использовать его в другом месте без необходимости добавления дополнительного кода.

Заранее спасибо!

Javier

1 Ответ

2 голосов
/ 04 февраля 2009

Как правило, если у вас есть пользовательский элемент управления, которому необходимо пересылать диалоговые сообщения, вы используете подклассификацию. Что-то вроде следующего

BOOL CMyDialog::OnInitDialog() 
{
    m_MyCtrl.SubclassDlgItem(IDC_MY_CTRL_ID,this);
    CMyDialog::OnInitDialog();
    return TRUE;
}

тогда вы можете обрабатывать диалоговые сообщения от вашего элемента управления, например,

BEGIN_MESSAGE_MAP(CMyCtrl, CWnd)
    //{{AFX_MSG_MAP(CMyCtrl)
    ON_WM_SHOWWINDOW()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CMyCtrl::OnShowWindow(BOOL bShow,UINT nStatus ) 
{
.
.
}

Вам все еще нужно немного изменить код диалога хоста, чтобы использовать элемент управления, но ваш элемент управления можно использовать повторно.

...