Помогите ньюбу

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

28 сен 2007, 11:55

OnPaint (не OnDraw) - не класс, а метод (MFC-"оболочка" обработчика сообщения WM_PAINT).
Для класса Cназвание_прогиDlg он должен уже быть в созданном визардом исходнике. Тут же уже имеется графический контекст оператором:
CPaintDC dc(this); // device context for painting
Если рисуешь прямо на диалоговое окно - рисуй в этом методе.
Если на диалоговое окно добавлены другие элементы (дочерние окна), и рисовать требуется в них, то удобно создать свой класс - наследник от стандартного Win-элемента, и там указать (удобно через Wizard) обработчик WM_PAINT, и отрисовку проводить уже там (в OnPaint этого класса)
СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 15:17

01 окт 2007, 09:08

Хм,сегодня попробую.Спасибо.Что то сам не допер до этого :(
Такой вопрос еще...
Смотри...
допустим я хочу нарисовать прямоугольник пропорциональный введенному числу:
ну скажем:

x=300+k*20
pdc->rectangle(x,400,300,300)

Такая конструкция получится?Или с C++ в качестве координат выяисляемое число впихнуть нельзя:?
Кстати,о переменных!Не совсем понял в где их все-таки прописывать лучше?В том классе в котором они используются или в файле с текстом проги,ну скажем название_Проги.cpp?с условием что это будет public переменная.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

01 окт 2007, 13:30

Не очень понятны вопросы.
СВой писал(а):x=300+k*20
pdc->rectangle(x,400,300,300)
Такая конструкция получится? Или с C++ в качестве координат выяисляемое число впихнуть нельзя:?
А почему нельзя? (опять же: если правильно понял суть вопроса)
СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 15:17

01 окт 2007, 14:49

Ну дело в том,что опять же ошибка компиляции вылезает...либо я не там переменные описываю.
Посоветуй где лучше переменную описывать(например x или k)Из примера.В основном тексте программы(прога.cpp)
Или в конкретном классе?
Или вообще в тексте программы,сразу перед использованием:
(например
int x;
x=300+k*20)

Кстати,у меня при создании программы автоматически создаются классы,как я писал:
CAboutDialog
Сназвание_прогиApp
Cназвание_прогиDlg

За что эти классы отвечают?
СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 15:17

01 окт 2007, 14:58

ну значит можно.
Я просто не пойму где лучше переменную описать! В основном тексте проги(прога.cpp),в каком то из ресурсов,или в каком-либо из классов?
Где обычно это делается?

Кроме этого,не подскажешь
VC++ генерит сам следующие классы:
CAboutDlg
Сназвание_прогиApp
Cназвание_прогиDlg
За что они отвечают?
Ну первый класс,вроде бы за отображение информации о программе....
СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 15:17

01 окт 2007, 15:05

Значит можно.
Просто я не допру,где лучше описать переменную,в основной проге(прога.cpp) в каком-нибуть дургом ресурсе(в каком тогда?))или вообще в конкретном классе...
Где это нагляднее делать.
Или вообще прямо в тексте,перед использование
(ну скажем int x;
x=300+k*20)

Как все сложно-жесть
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

02 окт 2007, 12:01

СВой писал(а):Ну дело в том,что опять же ошибка компиляции вылезает...либо я не там переменные описываю.
Посоветуй где лучше переменную описывать(например 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" (см. присоединенную картинку)


Вообще, если хочешь посоветоваться, почему "ошибка компиляции вылезает", то, чтобы читающие могли дать более качаетвенный совет, приводи текст ошибки.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 15:17

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?
Как посоветуешь подписи к осям сделать?Их значения я буду скорее всего в отдельном окне задавать,после этого мне их нужно вывести рядом с осью
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

02 окт 2007, 17:30

cdc->Rectangle(390, 500, 410, 500-m_y1);

Если m_y1 - число положительное, то получается, что у прямоугольника у-координата левого верхнего угла (500) больше у-координаты правого нижнего угла (500 - m_y1). Может, в этом дело?

Содеждимое контрола Edit можно получить при помощи GetWindowText. Только результат будет - строка (char [] или CString). Затем надо будет перевести в целое (напр., atoi)
СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 15:17

02 окт 2007, 22:22

А я думал наобарот,первые координаты-это координаты левого нижнего и правого верхнего угла...хм...надо бы уточнить...темнеменее я думаю что кривой,но прямоугольник бы нарисовался.Завтра попробую по-другому.
Т.е GetWindowText.IDC_EDIT1?Сейчас посмотрю как правильно задается...
Идея с переводом в целое интересная,странно что с UpdateData(false) не пашет :( По идее должен был данные из поля в переменную заносить
Кстати,попробывал вместо координаты 500-m_y1 ввести просто число...скажем 300!Все вырисовывается нормально,так что тут дело не в координате
Ответить