CMFCButton не нажимается, когда в дочернем диалоге многослойного окна - PullRequest
0 голосов
/ 18 июня 2019

Справочная информация:

  • Создание CWnd с WS_EX_LAYERED и GetDesktopWindow () в качестве родителя
  • Создать CDialogEx с многоуровневым окном в качестве родительского
  • Добавьте кнопку в диалоговом окне и используйте DDX_Control, чтобы сделать ее CMFCButton

Проблема:

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

Примечания:

Если кнопка просто CButton, то она работает нормально. Можно сказать, что диалог должен иметь фокус, чтобы это работало, но это не так в любом другом сценарии. В общем, когда я нажимаю кнопку в диалоговом окне, оно всегда работает, даже если мой фокус ранее был в совершенно другой программе.

Код:

Функция создания для многослойного окна:

bool CLayerWnd::Create()
{
    if (!__super::CreateEx(WS_EX_LAYERED, DEMOLAYEREDCLASS, _T("Layered Window"), WS_POPUP, 200, 200, 500, 500, ::GetDesktopWindow(), NULL))
        return false;

    m_childDlg.Create(this);
    m_childDlg.ShowWindow(SW_SHOW);
    ShowWindow(SW_SHOW);

    DrawWindow();

    return true;
}

Функция создания для диалога:

bool CChildDlg::Create(CWnd *pParentWnd)
{
    if(!__super::Create(CChildDlg::IDD, pParentWnd))
        return false;

    return true;
}

Демонстрационный проект VS2015:

https://www.dropbox.com/s/ha8o13hfz2kfn97/LayerDemo.zip?dl=0

1 Ответ

1 голос
/ 18 июня 2019

Добавьте следующий код, и он будет работать.

BOOL CChildDlg::OnInitDialog()
{
    __super::OnInitDialog();

    m_btnMFCButton.m_bDontUseWinXPTheme = TRUE; //<-This line specifically

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