Anoha Ответов: 2

Как предотвратить создание диалогового окна кнопки при повторных щелчках.


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

Что я уже пробовал:

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

[Правка: вставленный код опубликован в качестве комментария]
void CMyViewerDlg::OnBnClickedShow()
{
    m_DCM.Create(IDD_Tags, this);
    m_DCM.ShowWindow(SW_SHOW);
    BOOL isOn = true;
    if (isOn == false)
    {
        GetDlgItem(IDC_SHOW)->EnableWindow(TRUE);
    }
    else
    {
        GetDlgItem(IDC_SHOW)->EnableWindow(FALSE);
    }
}

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

Jochen Arndt

Я предполагаю, что это немодальный диалог (в противном случае родительское окно будет заблокировано, так что повторное нажатие кнопки будет невозможно).

Лучший ответ на ваш вопрос зависит от того, как создается диалоговое окно и как вы обнаруживаете, что оно закрыто (если оно уже обнаружено).

Итак, как вы создаете этот диалог (просто покажите код вашего обработчика нажатия кнопки).

2 Ответов

Рейтинг:
2

CPallini

Просто отключите кнопку после первого щелчка, смотрите CWnd:: EnableWindow[^].


Рейтинг:
1

Jochen Arndt

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

void CMy3D_Med_ViewerDlg::OnBnClickedShowDicomTag()
{
    m_DCMTagDlg.Create(IDD_DICOM_Tags, this);
    m_DCMTagDlg.ShowWindow(SW_SHOW);
    GetDlgItem(IDC_SHOW_DICOM_TAG)->EnableWindow(FALSE);
}

При отключении кнопки она становится серой, и обработчик больше не вызывается при повторном нажатии.

Но когда диалоговое окно будет закрыто, вы должны снова включить эту кнопку. Сделайте это, обратившись к WM_CLOSE сообщение:
void DCMTagDlg::OnClose()
{
    CMy3D_Med_ViewerDlg *p = (CMy3D_Med_ViewerDlg *)GetParent();
    p->GetDlgItem(IDC_SHOW_DICOM_TAG)->EnableWindow(TRUE);
    CDialog::OnClose();
}
Обратите внимание, что вышесказанное можно использовать только тогда, когда диалог вызывается только из CMy3D_Med_ViewerDlg.


Существует также другой подход к этой проблеме: дочерний диалог никогда не закрывается, а только скрывается:
void DCMTagDlg::OnClose()
{
    ShowWindow(SW_HIDE);
}

Это требует использования указателя на диалоговое окно вместо экземпляра (просто замените DCMTagDlg m_DCMTagDlg около DCMTagDlg *m_pDCMTagDlg и инициализируйте указатель с помощью NULL в конструкторе):
void CMy3D_Med_ViewerDlg::OnBnClickedShowDicomTag()
{
    if (m_pDCMTagDlg == NULL)
    {
        m_pDCMTagDlg = new DCMTagDlg();
        m_pDCMTagDlg->Create(IDD_DICOM_Tags, this);
    }
    m_pDCMTagDlg->ShowWindow(SW_SHOW);
}

Обратите внимание, что теперь вам нужно уничтожить диалоговое окно, когда родительское окно закрыто:
void CMy3D_Med_ViewerDlg::OnClose()
{
    if (m_pDCMTagDlg)
    {
        m_pDCMTagDlg->Destroy();
        delete m_pDCMTagDlg;
        m_pDCMTagDlg = NULL;
    }
    CDialog::OnClose();
}

При использовании этого вы все равно можете отключить кнопку. Если этого не сделать, то нажатие на кнопку просто покажет существующий диалог.