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

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

СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 14:17

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

Сообщение СВой » 17 сен 2007, 14:25

:) Вообщем угораздило меня,пошел я в Магистратуру...в этом семестре проходим VC++ самостоятельно.В итоге должны сделать по простенькой программе к экзамену.
До этого имел знакомство с VB и VB.NET,соответственно имел дело с Visual Studio.Там все наглядно+самоучители по VB.net есть,вообще разобраться можно!А вот с VC++ чет не клеится нефига.
Вообщем смысл задачи-сделать программу,чтобы пользователь мог построить гистограмму по своим данным.
При этом он вводит количество гистограмм на графике,название осей графика и подпись к гистограмам(ну стандарт короче,аля EXCEL)(гистограмм 2-10)
Ну и соотвественно значения этих гистограм(1-100)
Подскажите как можно это сделать?Хотя бы в нужную степь толкните,а самоучителях ничего полезного пока не нашел.Буду благодарен за подсказку.

ЗЫ.Как лучше сделать переход из одной формы в другую в режиме диалока,ну мол "Введите число гистограмм,нажмите далее","Введите название осей координат,нажмите далее" и тд.
Вообще не могу найти команду переходна(открытия) новой формы... :(

СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 14:17

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

Сообщение СВой » 24 сен 2007, 12:46

Вообщем с горем пополам нарисовал прямоугольников несколько

void CRec1View::OnDraw(CDC* pDC)
{
CRec1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CBrush br;
br.CreateSolidBrush(RGB(255, 255, 0));
CDC* cdc=GetDC();
CBrush *oldBrush=cdc->SelectObject(&br);
cdc->Rectangle(0, 0, 20, 20);
cdc->SelectObject(oldBrush);
cdc->Rectangle(0, 20, 20, 40);

CBrush bre;
bre.CreateSolidBrush(RGB(215, 250, 0));
cdc->SelectObject(&bre);
cdc->Rectangle(50, 50, 20, 20);

CBrush bred;
bred.CreateSolidBrush(RGB(128, 0, 0));
cdc->SelectObject(&bred);
cdc->Rectangle(100, 100, 20, 20);

}



Никак не допру,что делает выделенная строчка!Кто объяснит что делается в этой строке.

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

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

Сообщение BBB » 25 сен 2007, 11:06

СВой,

Код: Выделить всё

CBrush *oldBrush=cdc->SelectObject(&br);
Этот оператор выбирает (делает текущей) в графический контекст cdc созданную ранее кисть (brush) желтого (RGB(255, 255, 0)) цвета. При этом предыдущая кисть запоминается в переменной oldBrush.

Текущая кисть используется затем для заполнения внутренности прямоугольника, рисуемого чуть ниже:

cdc->Rectangle(0, 0, 20, 20);

MSDN об CDC::Rectangle:
Draws a rectangle using the current pen. The interior of the rectangle is filled using the current brush.

Подробнее см. описание в MSDN соответсвующих функции.

СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 14:17

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

Сообщение СВой » 25 сен 2007, 13:19

Хм...ну идея ясна!Только одного не пойму!Зачем старую кисть сохранять в переменную OldBrush!Почти везде где я видел способы рисования,это делается,а зачем остается загадкой.

И вот эту строчку хочу уточнить

CDC* cdc=GetDC();
Просто создает графический контекст чтобы можно было выводить графику на экран:?

Где MSDN скачать можно?на битые ссылки постоянно нарываюсь.

PS.Спасибо за ответы!Очень помогло

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

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

Сообщение BBB » 25 сен 2007, 15:40

СВой,
Старую кисть сохраняют, чтобы затем можно было удалить созданную, когда она перестанет быть нужной и, тем самым осовободить ресурсы.

CDC* cdc=GetDC(); не создаеь, а получает существующий графический контекст.
Вообще, CDC - это MFC-шный класс, уже некоторая надстройка над Виндовым контекстов HDC. Вроде как для удобства. Хотя порой кажется, что как раз это только усложняет понимание, "как там чего внутри крутится".

MSDN в интернете можно онлайн читать msdn.microsoft.com. Можно ли скачать - не представляю.

СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 14:17

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

Сообщение СВой » 26 сен 2007, 09:07

Можно :) У знакомого забрать забываю.

Слушай с этим CDC запутался в конец ну да ладно.
Такой вопрос...я хочу сделать прогу в диалоговом окне,т.к там удобно будет управляющие элементы расставлять и тд.
В какой класс мне писать код для рисования?Чтобы в окне отображалось все.Вчера удалось повесить рисование на нажатие клавижи...вроде бы работало,а я хочу чтобы у меня при открытии окна выводилось уже все нарисованое(Оси гистограммы),а потом при нажатии кнопки все рисовалось.Ну так вот....куда код рисования линий помещать нужно?Где не попробую ошибку дает :(

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

Сообщение BBB » 26 сен 2007, 11:31

СВой писал(а):Где не попробую ошибку дает :(
А что за ошибки?

СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 14:17

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

Сообщение СВой » 26 сен 2007, 13:20

Ну в компиляторе отписывает мол 1-Error,0-warning.

Дело вот в чем,сейчас писал код для отображения всего это по нажатию на кнопку!Все отлично работает и тд.А как сделать,чтоб при загрузке формы,сразу мне оси рисовались?

И еще вопрос в дохонку...
Рисую оси через метод LineTo с координатами и тд.Решил чтобы не париться со штриховкой своих осей,сделать через цикл все
Ну вроде
for (int index=0;index=9;Index++)
{
x=340+20*Index;
Moveto(x,340);
LineTo(x,300);

}

Рисую вертикальную штриховку соотвественно.
Так должно быть?Опять же не получается...VC++ вообще виснет :(

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

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

Сообщение BBB » 26 сен 2007, 14:19

СВой писал(а):Ну в компиляторе отписывает мол 1-Error,0-warning.
И какой текст ошибки?
СВой писал(а):Дело вот в чем,сейчас писал код для отображения всего это по нажатию на кнопку! Все отлично работает и тд.А как сделать,чтоб при загрузке формы,сразу мне оси рисовались?
Вообще-то, все отрисовки делаются (если речь об MFC) в методе OnPaint. А если надо инициировать перерисовку "по нажатию на кнопку", то в обработчике нажатия вызывают Invalidate (). После чего Windows сама уже вызовет нужным образом OnPaint.

СВой
Сообщения: 13
Зарегистрирован: 17 сен 2007, 14:17

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

Сообщение СВой » 28 сен 2007, 09:54

ну в обработчике нажатия у меня получается отрисовать все,а мне нужно чтобы это при открытии окна делалось.
Если я создаю диалоговое окно у меня появляются Source файлы StdAfx,название_проги.cpp,название проги.rc,название_прогиDlg.cpp.

И классы:
CAboutDlg
Сназвание_прогиApp
Cназвание_прогиDlg
(класса OnDraw нету,как вариант создать...?)


Я никак не пойму,куда мне нужно код вставить для того,чтобы при загрузке все отрисовалось!
Не то в ресурсы,нето в Классы...и куда конкретно!Вообщем я вообще запутался.

Не разъяснишь?

Ответить