Условно установите курсор мыши на элементе управления CMFCMenuButon.

У меня есть стандартный элемент управления в моем диалоге:

      CONTROL         "Congregation Link",IDC_MFCMENUBUTTON_CONGREGATION_LINK,
                "MfcMenuButton",WS_TABSTOP,257,60,159,14

Это меню:

      IDR_MENU_HYPERLINK_POPUP MENU
BEGIN
    POPUP "__HYPERLINK__"
    BEGIN
        MENUITEM "Add Hyperlink",               ID_ADD_HYPERLINK
        MENUITEM "Edit Hyperlink",              ID_EDIT_HYPERLINK
        MENUITEM "Remove Hyperlink",            ID_REMOVE_HYPERLINK
    END
END

Я использую стандартный подход для инициализации элемента управления:

      void CCongregationDlg::InitCongregationLinkMenuButton()
{
    m_menuCongregationLink.LoadMenu(IDR_MENU_HYPERLINK_POPUP);
    m_menuBtnCongregationLink.m_hMenu = m_menuCongregationLink.GetSubMenu(0)->GetSafeHmenu();
    m_menuBtnCongregationLink.m_nFlatStyle = CMFCButton::BUTTONSTYLE_SEMIFLAT;

    // Resize (if required)
    CRect rctButton;
    m_menuBtnCongregationLink.GetWindowRect(&rctButton);
    const auto nOrigWidth = rctButton.Width(); // Store the original width
    const auto sizNewButton = m_menuBtnCongregationLink.SizeToContent(true); // This resizes the control!!!
    if (sizNewButton.cx > nOrigWidth) // Compare to the original width rather than the new one
    {
        m_menuBtnCongregationLink.SizeToContent();
    }
    else // Restore original width 
    {
        m_menuBtnCongregationLink.SetWindowPos(nullptr, -1, -1,
            nOrigWidth, sizNewButton.cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
    }
}

Я хотел бы имитировать гиперссылку:

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

Возможно ли это сCMFCMenuButtonконтроль?

ПС. В идеале ссылка должна быть подчеркнута (так же, как кнопка управления гиперссылкой).

2 ответа

Вам нужно только реализовать обработчик WM_SETCURSOR. Это должно работать для области кнопок.

Я искал документацию дляCMFCMenuButtonи я понял, что это происходит отCMFCButton.

И этот класс имеет этот метод:CMFCButton::SetMouseCursorHand. Процитируем документацию:

Используйте этот метод, чтобы связать изображение руки курсора с кнопкой. Курсор загружается из ресурсов приложения.

Поэтому я обновил свойInitCongregationLinkMenuButtonметод включения:

      m_menuBtnCongregationLink.SetMouseCursorHand();

И это работает:

Теперь у меня есть курсор в виде руки, и мне не нужно создавать новый класс. Но он остается курсором в виде руки, даже когда указатель мыши находится над стрелкой.

Другие вопросы по тегам