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

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

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

« : 02-11-2010 06:45 » 

Посоветуйте или подскажите другое решение.
Для организации диалога в программе использую UpdateData(true/false), чтобы почитать введенные значения и обновить экран.
И в этой же программе строю графики, используя MoveTo, PolyLineTo и др.
Чаще всего график выводится(визуализируется) только на второй раз, если до этого был вывод на экран  Edit с помощью UpdateData(false).
Записан
Джон
просто
Администратор

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

« Ответ #1 : 02-11-2010 07:32 » 

Что делает ф-я UpdateData?

Где (в какой ф-ции) обновляется GDI?

Что представляет собой контрол отображения графика?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 02-11-2010 07:58 » 

ann_nef, практика мне доказала, что пользоваться UpdateData лучше не. Я давно исключил из своего рациона Улыбаюсь

В любом случае к рисованию примитивов эта функция отношения не имеет
Записан

ann_nef
Помогающий

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

« Ответ #3 : 02-11-2010 08:16 » 

По ф-и UpdateData(true) ввожу параметры с экрана в переменные m_kuku1...n, по ф-и UpdateData(false) обновляю экран,те вывожу значение m_kuku1...n.
Джон, пытаясь ответить на ваши вопросы, увидела, что и Gdi обновляется UpdateData(false).
Вот как заканчивается ф-ция вывода графика измеренных значений:
    dc.PolylineTo(bufI,1024-zeroX);
    UpdateData(false);

Наверное, не очень конструктивно разбираться в моих нелепицах.
Мб вы мне просто подскажете,как пограмотней реализовать такую задачу(вв0да-вывода на экран
различной информации):
1.ввожу параметры для измерений - использую MFC. ТАК? По-другому?
2.измеряю(обмен с прибором).
  На этом этапе вывожу промежуточную текстовую информацию о процессе, типа "ЖДИТЕ","Закончился 1 этап" и тд.
3.вывод на экран в виде графика измеренные значения - использую GDI.
 
Подскажите,по какому пути пойти, если несложно. А то у меня путаница в голове и программе.
Летом вы все мне скопом помогли разобраться с классами.

 

Добавлено через 5 минут и 13 секунд:
Алексей, а что использовать для организации диалога и обмена вместо UpdateData(true)?

Я что нашла в учебниках,то и использую. И пару раз наткнулась на то, что неудачно применение этой ф-ции приводило к вылету программы.
« Последнее редактирование: 02-11-2010 08:21 от ann_nef » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 02-11-2010 09:07 » 

Цитата
    dc.PolylineTo(bufI,1024-zeroX);
    UpdateData(false);
говорю же, при работе с графикой функция UpdateData не нужна, она не этим занимается. Графика отрисуется на контексте сама после вызова dc.PolylineTo(bufI,1024-zeroX);

а вот для работой с содержимым контролов на диалоге эта функция и предназначена. Но лично мне кажется, что криво она задумана. Настаёт такой момент, когда надо что-то обновить, а что-то не трогать - тогда начинаются бубны. Поэтому я отказался от использования этой функции, работаю с контролами через GetDlgItem, если есть только ID,  или через сам мембер-контрол, если определён
Записан

Джон
просто
Администратор

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

« Ответ #5 : 02-11-2010 09:52 » 

ann_nef, во-первых, сразу переходим на ТЫ.

Во-вторых. Ок. Хоть это и противоречит принципам. Но я так понимаю, что "горит". Ага

Поэтому немного теории.

Итак, ф-я UpdateData предназначена ТОЛЬКО для двунаправленного обмена данными между контролами и полями данных в классе диалога. Проще говоря, у тебя есть объёкт типа контрол (например СEdit), а есть мембер типа CString, значение которого ты используешь в программе. Так вот UpdateData обеспечивает, в момент вызова, обмен данными между этими объектами. Направление зависит от параметра. Ну и, если посмотреть детально, то эта ф-я вызывает в конечном итоге ф-ю DoDataExchange. Использовать или нет? Основная "проблема" - это необходимость простой организации обмена данных между контролами и полями данных. Очень часто (неправильно) используют эту ф-ю в хэндлах типа OnChange и тп. Поскольку эта ф-я отвечает за апдейт ВСЕХ контролов, то и вызывать её следует по какому-нить глобальному событию. Например, нажатию кнопки. Конечно, её можно вызывать и по OnChange, нужно только внимательно оценить все последствия и влияние на сам контрол или другие контролы. В "простых" (в смысле логики взаимодействия между контролами) диалогах, когда нужно только считать все данные введённые пользователем, например перед непосредственной обработкой этих данных, использование ф-ии UpdateData является самым простым и надёжным способом.

Ну и следствие - никаких апдейтов графиков и уж тем более отрисовки чего бы там ни было.

Вся графическая инфа отрисовывается ТОЛЬКО (ИСКЛЮЧИТЕЛЬНО!!!) в ф-ции OnPaint/OnDraw либо контекста самого диалога (что не есть гут), либо в контексте какого-нить контрола. Обычно для таких целей используется CStatic, но можно сделать и своё окошко непосредственно от CWnd. Если конечно диалог не используется только в качестве интрефейса ввода данных. Этому были посвящёны мои второй и третий вопросы.

В принципе ситуация ясна, не хватает деталей. Фраза "вывод на экран в виде графика измеренные значения - использую GDI" требует конкретики. Да и вобще, что значит "ввожу параметры для измерений - использую MFC", а потом что? Без MFC? Что вобще за приложение? Диалог, SDI? Если можно, выложи скрин с него.

Ну а общий рецепт такой:

1. В Диалоге вводим данные.
2. По событию (например, нажатие кнопки) вызываем UpdateData(TRUE)
2.а. UpdateData перегоняет эти данные в мемберы (m_editValue123 -> m_stValue123, m_editValue345 -> m_nValue345)
3. Вызываем ф-ю апдейта графики Invalidate или InvalidateRect, если нужно обновить только часть всего рисунка.
4. Заранее предусматриваем использование мемберов в ф-ции OnPaint (OnDraw). Например: dc.PolylineTo(bufI,1024-m_nValue345);

Типа в коде:

Код:
void CMyDialog::OnMyBtnClick()
{
     UpdateData(TRUE);
     Invalidate();
}

Собственно говоря, это и есть ответ на вопрос темы, но чтобы это решение работало, необходимо его подготовить.
« Последнее редактирование: 02-11-2010 09:54 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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 : 02-11-2010 09:56 » 

Я с удивлением обнаружила UpdateData,стоящим за PolylineTo, уберу сейчас.
Даже я понимаю,что он не при чём.
Попробую использовать GetDlgItem и для диалога, пока я пользуюсь для других целей этим.

Но, промежуточные тексточки выводить через TextOut в Edit не очень,надо величину букв, шрифты и др. отслеживать. Или что?
Записан
Джон
просто
Администратор

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

« Ответ #7 : 02-11-2010 10:16 » 

Но, промежуточные тексточки выводить через TextOut в Edit не очень,надо величину букв, шрифты и др. отслеживать. Или что?

Брррр. Как всё запущено. Я же уже сказал. Смотри. У тебя есть диалог (сделай себе тестовый диалог и разберись как всё работает), на нём есть контрол типа CEdit, допустим его ID есть IDC_EDIT1, тогда

1. в h файле объявляешь мембер CString m_stData1;

2. В ф-ции

Код:
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_stData1); // добавляешь вот такую строчку.
}

3. Добавь на диалог две кнопки (для теста).

4. По клику на одну из них делаешь след:

Код:
void CMyDlg::OnButton1()
{
    UpdateData(TRUE);    // забрать содержимое контрола и сохранить его в m_stData1
    
    TRACE1("%s", m_stData1);
}

5. По клику на другую делаешь след:

Код:
void CMyDlg::OnButton2()
{
    m_stData1 = "sadflöjkplj";
    
    UpdateData(FALSE);  // показать содержимое m_stData1 в контроле

}

Никакой GDI для этого не требуется.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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 : 02-11-2010 10:26 » 

Джон, использую Диалог.
Спасибо. Буду переваривать и пытаться применить.
Если я правильно поняла,то прикрепляю картинку с окном Диалога.
При написании мной программы находятся ошибки в приборе и перепрограммируют ПЛИС, поэтому экран так выглядит.



В конечном итоге для метролога это будет выглядеть по-другому.

* screenMet.jpg (107.16 Кб - загружено 1651 раз.)
« Последнее редактирование: 02-11-2010 10:44 от Джон » Записан
Джон
просто
Администратор

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

« Ответ #9 : 02-11-2010 10:48 » 

Да как это сейчас выглядит по-барабану.

Ок, значит у тебя один диалог. Значит для всех контролов ты используешь UpdateData. А для графика Invalidate. Можешь сказать (показать) что это у тебя за контрол и его ф-ю отрисовки? Ну или просто сказать где именно ты вызываешь GDI-шные ф-ции?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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
Пол: Женский

« Ответ #10 : 02-11-2010 11:09 » 

GDI используется в ф-ции обработки нажатия кнопки "Вывод граф.3000" (или Вывод граф.3800),
и др.
Записан
Джон
просто
Администратор

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

« Ответ #11 : 02-11-2010 11:19 » 

Понятно. Это неправильно. Попробуй после одной такой отрисовки открыть какое-нить окно поверх твоего диалога (например проводник), подвигай его, а потом закрой. Что осталось от твоего графика? Ага

В этой ф-ции должен быть только вызов Invalidate, для контрола (окна?) вверху. А сами ф-ции должны располагаться в ф-ции отрисовки контекста - OnPaint/OnDraw
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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
Пол: Женский

« Ответ #12 : 02-11-2010 12:26 » new

Понимаю о чем речь, в книгах читала,там - рисование кругов, кривых и тд.
Но, почему-то не очень уложилось в голове...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines