ann_nef
|
|
« : 06-09-2012 13:29 » |
|
Использую Visual c++ 6. Dialog Base. несколько CEDIT. Вопрос простой: что происходит ,когда я на диалоговом окне, на котором пара есть Edit для ввода данных,нажимаю клавишу ENTER на клавиатуре? Результат - диалог закрывается, даже если с него убрать все кнопки и крестики. Какое событие порождается и почему такая реакция? И можно ли ипользовать нажатие Enter как переход с поля на поле, как это делается при использовании табуляции? Искала в инете, пока ничего не нашла, мб так сформулировала запрос
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #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 плоские?
|
|
« Последнее редактирование: 12-09-2012 11:15 от ann_nef »
|
Записан
|
|
|
|
Джон
просто
Администратор
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 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
|
|
« Ответ #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 »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #5 : 13-09-2012 11:48 » |
|
Ну у тебя сейчас 14 объектов CAutoEdit? А если ты сделаешь массив из 14 таких объектов? Типа так: 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
|
|
« Ответ #6 : 13-09-2012 12:14 » |
|
Дык, вроде я об этом же. CAutoEdit a_kod1[7]; CAutoEdit a_kod2[7]; Ладно, значит будем делать в лоб.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #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 »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #9 : 13-09-2012 15:37 » |
|
Проблема в том, что ты пытаешься совместить две разные вещи: 1. связывание контролов (читай создание, например объекта типа CEdit) с заранее определёнными ресурсами (редактор ресурсов - окошки на диалоге), с использованием ф-ций DDX и 2. Непосредственное создание контролов без ресурсов те просто используя ф. Create Теперь мои непонятки. Для чего тебе вобще "созданные поля"? Позицию кучи контролов ты и так можешь расчитать, причём гораздо быстрее чем разместишь их на форме с нужным интервалом, размером и тд (по крайней мере для меня это сущий ад). Таким образом ты экономишь время. Значит формулируем задачу. Необходимо N контролов МОЕГО типа, который является потомком стандартного контрола. Без DDX и ресурсов: CMyEdit : public CEdit в .h диалога CMyEdit *m_wndEd; UINT *m_myIDs; в конструкторе 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: 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 студии, меньше у меня ща под рукой нет. Для домашнего разбора подойдёт. зы забыл, конечно надо освободить хэндлы и память void CTestDlgDlg::OnDestroy() { for(int i=0; i<MAX_CTRLS; i++) { m_wndEd[i].DestroyWindow(); }
delete [] m_wndEd; delete [] m_myIDs;
CDialog::OnClose(); }
|
|
« Последнее редактирование: 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."
|
|
|
|