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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Вообще, если хочешь посоветоваться, почему "ошибка компиляции вылезает", то, чтобы читающие могли дать более качаетвенный совет, приводи текст ошибки.
Вложения
ABOUT.jpg
ABOUT.jpg (38.07 КБ) 302 просмотра
СВой
Сообщения: 15
Зарегистрирован: 17 сен 2007, 15:17

:) Спасибо за ответы,по поводу классов я так и думал,на всякий случай уточнил.
Сейчас попоробую дальше что-нибудь изваять...Чтото времени все меньше :(
По поводу ошики...где можно посмотреть расшифровку ошибки?Мне при компиляции только пишется ,мол,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
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

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

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

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

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