Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Передача параметров из CDialog


Автор: lavan 29.6.2011, 15:03
Народ,подскажите,кто знает.Есть главное окно,на нем кнопка,по нажатию этой кнопки появляется модальное окно CDialog:
Код

class CMyDialog:public CDialog{
private:
    CListBox *lb;
    CString str_dl;
public:
    CMyDialog(UINT,CWnd *ptr=NULL);
    ~CMyDialog();
    void OnOk();
    BOOL OnInitDialog();
    CString getSt(){
      return str_dl;
    }
};

С компонентом CListBox,в этом компоненте есть пару строк.Если пользов не выбрал ни одной строки и нажал на кнопку Ok(в диалоговом окне),то выскакивает сообщение что нужно выбрать строку
Код

CMyDialog::CMyDialog(UINT id,CWnd *ptr):CDialog(id,ptr),lb(NULL){}
BOOL CMyDialog::OnInitDialog(){
    CDialog::OnInitDialog();
    lb=new CListBox();
    lb->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_NOTIFY|WS_VSCROLL|WS_BORDER,
        CRect(100,10,150,70),this,ML);//создали лист_бокс
    lb->AddString("pol");//добавили строки
    lb->AddString("kol");
    return true;
}
void CMyDialog::OnOk(){
    if(lb->GetCurSel()==LB_ERR)
        AfxMessageBox("choice");
    else{
        lb->GetText(lb->GetCurSel(),str_dl);
        CDialog::OnOK();
    }
}
CMyDialog::~CMyDialog(){
  if(lb!=NULL)delete lb;
}

Проблема состоит в тм,что CListBox не взаимодействует с пользователем.даже если я нажал кнопку Ok  и не выбрал ни одной строки,диалоговое окно все равно закрывается.Пытался просто заполнить в обработчике OnOk переменную CString класса CMyDialog,а потом вывести ее в главном окне,тоже не идет
Обработчик кнопки рассположенной на главном окне
Код

void CMyFrame::OnButtonClck(){
    CMyDialog cdd(IDD_MD);//создали диалоговое окно
    if(cdd.DoModal()==IDOK)//сделали его видимым
    str=cdd.getSt();
    else
        str="text";
    InvalidateRect(0);
    
}

В чем ошибка?(хочу сделать без DDX)

Автор: Albor 29.6.2011, 17:14
А что возвращает lb->GetCurSel(), когда ни одна строка не выбрана?

Автор: lavan 29.6.2011, 17:35
Я хочу чтобы выдало сообщение об этом
Код

void CMyDialog::OnOk(){
    if(lb->GetCurSel()==LB_ERR)//строка не выбранна
        AfxMessageBox("choice");
    else{
        lb->GetText(lb->GetCurSel(),str_dl);
        CDialog::OnOK();
    }
}

Если разместить ClistBox на главном окне,то все срабатывает smile 

Автор: YDean 29.6.2011, 18:35
Думается, что CMyDialog::OnOk вообще не вызывается.
Если бы она была привязана к кнопке через MESSAGE_MAP, она должна быть написана как afx_msg void.
А если имеется в виду переопределение виртуальной CDialog::OnOK, то там большая буква К.

Автор: Albor 30.6.2011, 07:42
Цитата(YDean @  29.6.2011,  17:35 Найти цитируемый пост)
Думается, что CMyDialog::OnOk вообще не вызывается.
Если бы она была привязана к кнопке через MESSAGE_MAP, она должна быть написана как afx_msg void.
А если имеется в виду переопределение виртуальной CDialog::OnOK, то там большая буква К. 

Это так. Если бы lavan поставил точку останова на первый if в данной функции и запустил отладку, то и вопрос бы, наверное, не возник.

Автор: lavan 30.6.2011, 11:37
YDean,спасибо,мне кажется я бы сам никогда не увидел!
Albor,пытался сделать пошаговую отладку,но так и не нашел как.У меня VS-2008,какая кнопка для пошаговой отладки?

Автор: Albor 30.6.2011, 16:02
Цитата(lavan @  30.6.2011,  10:37 Найти цитируемый пост)
 VS-2008,какая кнопка для пошаговой отладки

F5

Автор: borisbn 30.6.2011, 18:16
Цитата(Albor @  30.6.2011,  16:02 Найти цитируемый пост)
F5

это для запуска (старта) отладки, а собственно сделать один шаг - F10

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)