Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Нажимаю в диалоговом окне ENTER  (Прочитано 9553 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« : 06-09-2012 13:29 » 

Использую Visual c++ 6. Dialog Base. несколько CEDIT.

Вопрос простой: что происходит ,когда я на диалоговом окне, на котором пара есть Edit для ввода данных,нажимаю клавишу ENTER на клавиатуре?
Результат - диалог закрывается, даже если с него убрать все кнопки и крестики.
Какое событие порождается и почему такая реакция?

И можно ли ипользовать нажатие Enter как переход с поля на поле, как это делается при использовании табуляции?

Искала в инете, пока ничего не нашла, мб так сформулировала запрос Жаль
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 06-09-2012 13:57 » 

Примерно понял.
При "ничегонеделаньи" с диалогом и нажати Enter всегда реагирует тн Default кнопка. Она обычно обведена чёрной рамочкой (чернее чем у других кнопок). По умолчанию - диалог создан в редакторе ресурсов с кнопками OK и Cancel - таковой является ОК.
Лечение: переобозначить дефолтную кнопку.

И можно ли ипользовать нажатие Enter как переход с поля на поле, как это делается при использовании табуляции?
Всё можно. Обработать нажатие кнопки, отловить Enter, и послать "самому себе" (или контролу с фокусом, точно не знаю, кто за это отвечает, попробуй) нажатие кнопки TAB. ОСТОРОЖНО с контролами, которые требуют всё-таки ENTER, например многострочные поля ввода с переводом строки.

Отлавливать любые сообщения в диалоге можно с помощью ф-ции PreTranslateMessage.
« Последнее редактирование: 06-09-2012 14:02 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 07-09-2012 05:21 » 

Забыла написать, что использую MFC.

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

Добавлено через 5 дней, 5 часов, 53 минуты и 39 секунд:
Возник ещё один вопрос, даже два вопроса

Пишу в visual c++ 6  + MFC. + Dialog

1  
Создала 14 CEdit :
Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER |ES_AUTOHSCROLL, rc1,pParentWnd, begID+i);

А как мне избежать прописки 14 переменных в
void  ::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(CMyTestAutoEditDlg)
   DDX_Control(pDX, begID, m_kod1);
   DDX_Control(pDX, begID+1, m_kod2);
                 .....
   DDX_Control(pDX, begID+13 , m_kod14);
   //}}AFX_DATA_MAP
}  Не понял

2
Почему созданные EDIT плоские?



* Forum.zip (26.8 Кб - загружено 915 раз.)
« Последнее редактирование: 12-09-2012 11:15 от ann_nef » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 12-09-2012 16:09 » 

1.
Непонятно зачем, но раз так хочется.

А 14 раз Create как "прописывала"? Ага

Поэтому DDX делаем аналогично созданию, те в цикле:
создаём массив контролов CEdit (т.е. типа m_kod1 -> m_kod[1]) и загоняем всё в цикл.

Только опасно так делать - "begID+i". В след. раз в редакторе ресурсов чё-нить добавишь, и получится два контрола с одинаковым ID. Лучше зарезервировать необходимое количество ID в rersource.h и изменить соответственно счётчики. Затем загнать эти ID в массив. Дальше по теории.

2. Используй CreateEx

Код: (C++)
CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), WS_CHILD | WS_BORDER | WS_VISIBLE  | ES_MULTILINE | ES_AUTOHSCROLL | WS_TABSTOP, rc1, pParentWnd, begID+i);
« Последнее редактирование: 12-09-2012 16:17 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #4 : 13-09-2012 10:05 » 

Джон, я затупила и не знаю, как сделать.
Вот ты пишешь:
Поэтому DDX делаем аналогично созданию, те в цикле:
создаём массив контролов CEdit (т.е. типа m_kod1 -> m_kod[1]) и загоняем всё в цикл.


Как с CEdit обойтись без DDX. но заполнить CString m_kod1, я знаю, типа GetDlgItem(IDC)->GetWindowText(m_kod1).

А когда у меня свой тип CAutoEdit a_kod ?  

Он основывается на CEDIT. при этом проверяет правильность ввода, при ошибке не даёт менять фокус и тд( взяла из инета и приспособила к своей задаче.)

А как сделать DDX в цикле?

 Здесь была моя ладья... А черт его знает...

Добавлено через 1 час, 36 минут и 28 секунд:
Попытка цикла DDX.

Вот здесь, что-то не так
void CMyTestAutoEditDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(CMyTestAutoEditDlg)
   DDX_ControlMy(pDX, IDC_kod11, a_kod1);
   ...
   //}}AFX_DATA_MAP
}

void CMyTestAutoEditDlg::DDX_ControlMy(CDataExchange *pDX, UINT ID, CAutoEdit *a_kod)
{
   int i;
for(i=0;i<7;i++)
   DDX_Control(pDX,ID+i,*(a_kod+i));
}

Или это полная чушь?
« Последнее редактирование: 13-09-2012 11:46 от ann_nef » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 13-09-2012 11:48 » 

Ну у тебя сейчас 14 объектов CAutoEdit? А если ты сделаешь массив из 14 таких объектов? Ага

Типа так:

Код: (C++)
void CMyTestAutoEditDlg::DoDataExchange(CDataExchange* pDX)
{
        for(int i=0; i<MAX_CTRLS; i++)
        {
                DDX_Control(pDX, m_myIDs[i], a_kod[i]);
        }

        CDialog::DoDataExchange(pDX);
}
« Последнее редактирование: 13-09-2012 12:09 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #6 : 13-09-2012 12:14 » 

Дык, вроде я об этом же.

CAutoEdit a_kod1[7];       
CAutoEdit a_kod2[7];

Ладно, значит будем делать в лоб. Жаль
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 13-09-2012 12:15 » 

По-прежнему ничего не понимаю. Жаль

Зачем такие премудрости? Чем тебя Create не устроило?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #8 : 13-09-2012 13:12 » 

void CKod::CreateKod(CWnd *pParentWnd, CRect &rc,int begID,CAutoEdit  **pEdit )
{

   int i;
   int n = 60;

   for(i=0;i<7;i++)
   {
       pEdit [ i ] = new CAutoEdit;
      CRect rc1(CPoint(rc.left+(n+10)*i+10, rc.top+10), CSize(30,20));
      pEdit[ i ]->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
                     WS_CHILD | WS_BORDER | WS_VISIBLE  | ES_MULTILINE | ES_AUTOHSCROLL | WS_TABSTOP, rc1, pParentWnd, begID+i);
   }

}

Джон, дело в том, что если я использую CEdit - всё хорошо, создаётся то,что должно создаться. А как связать созданные поля с CAutoEdit, кроме как в DDX,  я не знаю.

А если использовать CAutoEdit для создания, то программа вылетает.

Что я неправильно делаю?
« Последнее редактирование: 13-09-2012 13:15 от ann_nef » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 13-09-2012 15:37 » 

Проблема в том, что ты пытаешься совместить две разные вещи: 1. связывание контролов (читай создание, например объекта типа CEdit) с заранее определёнными ресурсами (редактор ресурсов - окошки на диалоге), с использованием ф-ций DDX и 2. Непосредственное создание контролов без ресурсов те просто используя ф. Create

Теперь мои непонятки. Для чего тебе вобще "созданные поля"? Позицию кучи контролов ты и так можешь расчитать, причём гораздо быстрее чем разместишь их на форме с нужным интервалом, размером и тд (по крайней мере для меня это сущий ад). Таким образом ты экономишь время.

Значит формулируем задачу. Необходимо N контролов МОЕГО типа, который является потомком стандартного контрола.

Без DDX и ресурсов:

CMyEdit : public CEdit

в .h диалога

   CMyEdit *m_wndEd;
   UINT *m_myIDs;

в конструкторе

Код: (C++)
        m_wndEd = new CMyEdit[MAX_CTRLS];
        m_myIDs = new UINT[MAX_CTRLS];

       // ID прописываются в resource.h и не забываем обновить счётчики
        m_myIDs[0] = IDC_EDIT1;
        m_myIDs[1] = IDC_EDIT2;
        m_myIDs[2] = IDC_EDIT3;
        m_myIDs[3] = IDC_EDIT4;
        m_myIDs[4] = IDC_EDIT5;
        m_myIDs[5] = IDC_EDIT6;
        ...
        m_myIDs[MAX_CTRLS-1] = IDC_EDIT***;

в  OnIntiDialog:

Код: (C++)
        CRect rc1;
        rc1.top = 10;
        rc1.left = 10;
        rc1.right = 50;
        rc1.bottom = 50;
        int nYOff = 60;
        for(int i=0; i<MAX_CTRLS; i++)
        {
                m_wndEd[i].CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
                WS_CHILD | WS_BORDER | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | WS_TABSTOP,
                rc1, this, m_myIDs[i]);
                rc1.OffsetRect(0, nYOff);
        }

В прицепе код, правда на 2005 студии, меньше у меня ща под рукой нет. Для домашнего разбора подойдёт.

зы забыл, конечно надо освободить хэндлы и память

Код: (C++)
void CTestDlgDlg::OnDestroy()
{
        for(int i=0; i<MAX_CTRLS; i++)
        {
                m_wndEd[i].DestroyWindow();
        }

        delete [] m_wndEd;
        delete [] m_myIDs;

        CDialog::OnClose();
}

* TestDlg.rar (34.31 Кб - загружено 901 раз.)
« Последнее редактирование: 13-09-2012 22:43 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines