Страница 2 из 3
Re: Помогите ньюбу
Добавлено: 28 сен 2007, 11:55
BBB
OnPaint (не OnDraw) - не класс, а метод (MFC-"оболочка" обработчика сообщения WM_PAINT).
Для класса Cназвание_прогиDlg он должен уже быть в созданном визардом исходнике. Тут же уже имеется графический контекст оператором:
CPaintDC dc(this); // device context for painting
Если рисуешь прямо на диалоговое окно - рисуй в этом методе.
Если на диалоговое окно добавлены другие элементы (дочерние окна), и рисовать требуется в них, то удобно создать свой класс - наследник от стандартного Win-элемента, и там указать (удобно через Wizard) обработчик WM_PAINT, и отрисовку проводить уже там (в OnPaint этого класса)
Re: Помогите ньюбу
Добавлено: 01 окт 2007, 09:08
СВой
Хм,сегодня попробую.Спасибо.Что то сам не допер до этого

Такой вопрос еще...
Смотри...
допустим я хочу нарисовать прямоугольник пропорциональный введенному числу:
ну скажем:
x=300+k*20
pdc->rectangle(x,400,300,300)
Такая конструкция получится?Или с C++ в качестве координат выяисляемое число впихнуть нельзя:?
Кстати,о переменных!Не совсем понял в где их все-таки прописывать лучше?В том классе в котором они используются или в файле с текстом проги,ну скажем название_Проги.cpp?с условием что это будет public переменная.
Добавлено: 01 окт 2007, 13:30
BBB
Не очень понятны вопросы.
СВой писал(а):x=300+k*20
pdc->rectangle(x,400,300,300)
Такая конструкция получится? Или с C++ в качестве координат выяисляемое число впихнуть нельзя:?
А почему нельзя? (опять же: если правильно понял суть вопроса)
Re: Помогите ньюбу
Добавлено: 01 окт 2007, 14:49
СВой
Ну дело в том,что опять же ошибка компиляции вылезает...либо я не там переменные описываю.
Посоветуй где лучше переменную описывать(например x или k)Из примера.В основном тексте программы(прога.cpp)
Или в конкретном классе?
Или вообще в тексте программы,сразу перед использованием:
(например
int x;
x=300+k*20)
Кстати,у меня при создании программы автоматически создаются классы,как я писал:
CAboutDialog
Сназвание_прогиApp
Cназвание_прогиDlg
За что эти классы отвечают?
Re: Помогите ньюбу
Добавлено: 01 окт 2007, 14:58
СВой
ну значит можно.
Я просто не пойму где лучше переменную описать! В основном тексте проги(прога.cpp),в каком то из ресурсов,или в каком-либо из классов?
Где обычно это делается?
Кроме этого,не подскажешь
VC++ генерит сам следующие классы:
CAboutDlg
Сназвание_прогиApp
Cназвание_прогиDlg
За что они отвечают?
Ну первый класс,вроде бы за отображение информации о программе....
Re: Помогите ньюбу
Добавлено: 01 окт 2007, 15:05
СВой
Значит можно.
Просто я не допру,где лучше описать переменную,в основной проге(прога.cpp) в каком-нибуть дургом ресурсе(в каком тогда?))или вообще в конкретном классе...
Где это нагляднее делать.
Или вообще прямо в тексте,перед использование
(ну скажем int x;
x=300+k*20)
Как все сложно-жесть
Re: Помогите ньюбу
Добавлено: 02 окт 2007, 12:01
BBB
СВой писал(а):Ну дело в том,что опять же ошибка компиляции вылезает...либо я не там переменные описываю.
Посоветуй где лучше переменную описывать(например x или k)Из примера.В основном тексте программы(прога.cpp)
Или в конкретном классе?
В зависимости от смысла и от того, где будет использоваться переменная. Если в пределах лишь одной процедуры, то описывать локально в этой процедуре.
Если переменная опиывает какую-то сущность/свойство класса и должна использоваться во многих методах этого класса, то описывать как член этого класса.
Использовать глобальные переменные, вообще-то, считается дурным тоном. Так как в этом случае они становятся доступны отовсюду и, если программа большая, сам потом запутаешься, где и когда эта переменная была изменена. Но "правда жизни, товарищи" (c) такова, что иногда, все-таки, приходится использовать глобально описанные переменные.
Или вообще в тексте программы,сразу перед использованием:
(например
int x;
x=300+k*20)
Такое описание x корректно.
CAboutDialog
Сназвание_прогиApp
Cназвание_прогиDlg
За что эти классы отвечают?
В принципе, можно догадаться, взглянув на получившийся текст.
Сназвание_прогиApp - класс и экземпляр MFC-приложения (где, в частности, присутствует экземпляр класса:
Сназвание_прогиApp theApp).
Cназвание_прогиDlg - класс диалогового окна приложения.
CAboutDialog - класс диалогового окна "About" приложения. Этот класс создается, если при создании приложения в визарде поставить (точнее: не снять) галочку "About box" (см. присоединенную картинку)
Вообще, если хочешь посоветоваться, почему "ошибка компиляции вылезает", то, чтобы читающие могли дать более качаетвенный совет, приводи текст ошибки.
Re: Помогите ньюбу
Добавлено: 02 окт 2007, 14:55
СВой

Спасибо за ответы,по поводу классов я так и думал,на всякий случай уточнил.
Сейчас попоробую дальше что-нибудь изваять...Чтото времени все меньше

По поводу ошики...где можно посмотреть расшифровку ошибки?Мне при компиляции только пишется ,мол,0-warning,1-error....при этом что именно за ошибка не пишется
EDIT.Вот я олух

Скором вверх не прокрутил

Пока мучаю программу...большинство на угад,спасибо за подсказки-очень выручили!

Завтра еще вопросы появяться.
Столкнулся с проблемой.Не пойму в чем дело.
Сделал текстовые поля,связал их с переменной,ну скажем m_y1,m_y2,m_y3.(3 значения для пробы,пытаюсь заставить программу рисовать прямоугольники пропорционально введенным значениям.будет у меня такая гистограмма)
ну вот присвоил текстовым полям переменные, попробывал в обратотчике нажатия кнопки(по нажатию я рисую прямоугольники) вставить текств вроде
CBrush bre;
bre.CreateSolidBrush(RGB(215, 250, 0));
cdc->SelectObject(&bre);
cdc->Rectangle(390, 500, 410, 500-m_y1);
Ну т.е. по идее у меня меняется только координата y у прямоугольника.Компиляция проходит нормально,но прямоугольник не вырисовывается.В чем может быть проблема?
А значение из текстового поля в переменную можно записать только с помощью member variebels?
Как посоветуешь подписи к осям сделать?Их значения я буду скорее всего в отдельном окне задавать,после этого мне их нужно вывести рядом с осью
Re: Помогите ньюбу
Добавлено: 02 окт 2007, 17:30
BBB
cdc->Rectangle(390, 500, 410, 500-m_y1);
Если m_y1 - число положительное, то получается, что у прямоугольника у-координата левого верхнего угла (500) больше у-координаты правого нижнего угла (500 - m_y1). Может, в этом дело?
Содеждимое контрола Edit можно получить при помощи GetWindowText. Только результат будет - строка (char [] или CString). Затем надо будет перевести в целое (напр., atoi)
Re: Помогите ньюбу
Добавлено: 02 окт 2007, 22:22
СВой
А я думал наобарот,первые координаты-это координаты левого нижнего и правого верхнего угла...хм...надо бы уточнить...темнеменее я думаю что кривой,но прямоугольник бы нарисовался.Завтра попробую по-другому.
Т.е GetWindowText.IDC_EDIT1?Сейчас посмотрю как правильно задается...
Идея с переводом в целое интересная,странно что с UpdateData(false) не пашет

По идее должен был данные из поля в переменную заносить
Кстати,попробывал вместо координаты 500-m_y1 ввести просто число...скажем 300!Все вырисовывается нормально,так что тут дело не в координате