Saiko
Постоялец
Offline
|
|
« : 29-12-2007 08:50 » |
|
Необходимо нарисовать круговую диаграмму.При щелчке в секторе диаграммы граница сектора окрашивается вцвет, выбранный ранее в меню
|
|
« Последнее редактирование: 29-12-2007 11:17 от Finch »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 29-12-2007 11:29 » |
|
Не совсем ясно, что конкретно ты не знаеш, как сделать. Если не охота возится с математикой, можно воспользоваться WinAPI функцией ַPie http://msdn2.microsoft.com/en-us/library/ms533892(VS.85).aspx
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #2 : 29-12-2007 12:59 » |
|
Я ваще ничего не понимаю. Нужно ли создавать для моей задачи проект или win32-приложение, и как работает функция Pie(не понимаю что там за аргументы). Можно ли содать диаграмму в Excelе
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #3 : 29-12-2007 13:03 » |
|
Можно ли воспользоваться функцией GGraf
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 29-12-2007 13:20 » |
|
А начем ты вообще хотиш писать программу? Если все таки на С++, то я не знаю, как ты хотиш работать с COM или ActiveX объектами ָExcell. Это я сужу по тому уровню знаний, что ты уже высказал.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #5 : 29-12-2007 13:36 » |
|
на Си
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #6 : 29-12-2007 14:08 » |
|
Ты пишеш для себя или для лабы в учебном заведении?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #7 : 29-12-2007 14:28 » |
|
Для лабы. Можешь объяснить как pie работает?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 29-12-2007 15:14 » |
|
Вот перевод той статьи, ссылку на которую я дал Функция Pie рисует клин в виде фмгуры пирога ограничеваюшегося пересечением элипса и 2 радиусов. ַPie отрисовывается с импользованием текушего pen и заполняется текушим brush.
BOOL Pie( HDC hdc, // Контекст устройства int nLeftRect, // x- координата верхнего-левого угла прямоугольника int nTopRect, // y-координата верхнего-левого угла прямоугольника int nRightRect, // x-координата нижнего-правого угла прямоугольника int nBottomRect, // y-координата нижнего-правого угла прямоугольника int nXRadial1, // x- координата конечной точки первого радиуса int nYRadial1, // y-координата конечной точки первого радиуса int nXRadial2, // x-координата конечной точки вторго радиуса int nYRadial2 // y-координата конечной точки второго радиуса );
Параметры:
hdc [in] Хендл контекста устройства. nLeftRect [in] x-координата, в логической системе координат, верхнего-левого угла описываюшего прямоугольника. nTopRect [in] y-координата, в логической системе координат, верхнего-левого угла описываюшего прямоугольника. nRightRect [in] x-координата, в логической системе координат, правого-нижнего угла описываюшего прямоугольника. nBottomRect [in] координата, в логической системе координат, правого-нижнего угла описываюшего прямоугольника. nXRadial1 [in] x-координата, в логической системе координат, конечной точки первого радиуса. nYRadial1 [in] y-координата, в логической системе координат, конечной точки первого радиуса. nXRadial2 [in] x- координата, в логической системе координат, конечной точки второго радиуса. nYRadial2 [in] y-координата, в логической системе координат, конечной точки второго радиуса.
Возврашаемое значение:
Если функция отработала успешно, то возврашаемое значение не нуль.
Если функция отработала с ошибкой, то возврашаемое значение равно нулю
В Windows NT/2000/XP: Для получения болше информации об ошибки, вызовите GetLastError.
Примечание
Кривая сектора зависит от элипса вписанного в определенный прямоугольник. Кривая начинается в точке пересечения элипса с первым радиусом и продалжается против часовой стрелки до точки пересечения со вторым радиусом.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
v2
Помогающий
Offline
|
|
« Ответ #9 : 29-12-2007 19:04 » |
|
:
|
pie.rar (7.86 Кб - загружено 1185 раз.)
exe.rar (171.7 Кб - загружено 3855 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 29-12-2007 20:21 » |
|
v2, симпатичный креативчик откуда только на такую несложную вещь аж 175 кб - вопрос
|
|
« Последнее редактирование: 30-12-2007 12:59 от Алексей1153++ »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #11 : 29-12-2007 20:23 » |
|
Алексей1153++, для ֱVLS DELPHI нормально. Тем более если, оно у тебя не потребовало дополнительных библиотек.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 30-12-2007 10:31 » |
|
v2, ты вобще-то другие посты читаешь или хотябы название темы? Или тебе всё по барабану? Или ты разницы не знаешь между С++ и Pascal? Почему, когда просят помощи на С или С++ ты кидаешь проекты на Дельфи? кто-нибудь может подкинуть исходники калькулятора на С++ Ну? А ты что слил? https://forum.shelek.ru/index.php/topic,12406.msg156258.html#msg156258И опять: А начем ты вообще хотиш писать программу? на Си Ну и каким боком сюда Паскаль или Дельфи вписываются? Да ещё БЕЗ каких-либо коментов. За целый год, только два членораздельных слова в пяти сообщениях, да и то непонятно к чему. Чего ты добиваешься? Показать, что ты на Дельфях можешь? Дык для этого раздел есть дельфийный. А может ты на подсосе у Борланда? Ну, а самое главное - не надо оказывать медвежьих услуг.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 30-12-2007 13:03 » |
|
Джон, Джонище, да зря ты так, на самом деле. Если вопрошающий - человек, который умеет думать , то он залезет в исходники - несложной, замечу - программы , пусть и на другом языке , и поймёт всё, что ему надо
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 31-12-2007 00:17 » |
|
В данном случае диагноз ясен после вопроса: Нужно ли создавать для моей задачи проект или win32-приложение А если НЕ умеет думать? Что тогда? Разбираться в синтаксисе абсолютно незнакомого языка? А если там используются объекты, которых в С и подавно нет (Борланд на это мастак)? Как тогда быть? Ты то любишь разбираться с другими языками? А вот теперь представь, что чел, который "ваще ничего не понимает", надеясь, что ему дали то, что надо (ещё бы - исходники с рабочим экзешником) просто возьмёт и спихнёт это на зачёте, экзамене и тд И... облажается по самое нихочу. И причём здесь умение думать? Человек вроде ясно и чётко задал вопрос. Ну давайте выльем на него кто во что горазд. На разных языках. Пусть разбирается. Так что ли? Ну или проще, говоря твоими словами, вот если бы я начал отвечать на вопросы на немецком (например иногда мне так проще), ссылаясь на то, что дык е-переводчиков пруд пруди, да и падежей в немецком всего четыре - кому надо - разберётся, как бы это понравилось? Те ты вместо того, чтобы разбираться с твоей проблемой, начал изучать язык, который тебе нафиг не нужен. Ну и уж если на то пошло. Если я действительно знаю решение, но на другом языке, я всё-таки выложу алгоритм с коментами, в которых будут не только точки и смайлки, и предложение исходников с указанием, что язык не ТОТ. Если человек знает этот язык и захочет их получить, тогда выложу и их. А просто небрежно, с барского плеча, скинуть код не "ф тему"... Хоть какое-то уважение должно быть. Или?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 31-12-2007 09:31 » |
|
Пламенная речь, Джон Всё же я исхожу из того, что он укмеет думать. Половина из твоих аргументов отпадает Ну а если он думать не умеет - ему ничто не поможет
|
|
|
Записан
|
|
|
|
v2
Помогающий
Offline
|
|
« Ответ #16 : 31-12-2007 16:36 » |
|
Прошу прощения, если кого обидел. Учится лучше на конкретных примерах. Всё! Всех с Новым Годом! Иду пить! А если вернусь, а потом и вспомню об этом, то будет и на С.
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #17 : 01-01-2008 12:56 » |
|
По функции pie:у меня получается поделить диаграмму тока на 2 сектора потому что проводятся только 2 радиуса
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #18 : 01-01-2008 12:57 » |
|
ЗЫ: какой функцией прямая рисуется?7
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 01-01-2008 16:47 » |
|
Saiko, установить графический курсор - ::MoveTo(HWND h,int x,int y);
из текущего положения курсора провести линию в координату -
::LineTo(HWND h,int x,int y);
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #20 : 01-01-2008 17:06 » |
|
Диаграмма готова как её закрасить?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 01-01-2008 17:13 » |
|
BOOL FloodFill( HDC hdc, // handle to DC int nXStart, // starting x-coordinate int nYStart, // starting y-coordinate COLORREF crFill // fill color );
crFill задавать как RGB(red,green,blue) , где red,green,blue - числа от 0 до 255
в качестве точки начала заливки можно выбрать геометрический центр сектора
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 01-01-2008 17:19 » |
|
вообще то pie умеет сразу вроде бы закрашивать - надо кисть нужную выбрать просто. Только я сейчас не в силах пример нарисовать , или ошибок наделаю
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 01-01-2008 17:23 » |
|
если поможет - вот копия из мсдн (на MFC , но суть понятна , просто pDC-> заменить на :: , а первым параметром в функцию передать хендл контекта) void CCurvesView::OnDraw(CDC* pDC) { // Fill the client area with a simple pie chart. A // big blue slice covers 75% of the pie, from // 6 o'clock to 3 o'clock. This portion is filled // with blue and has a blue edge. The remaining 25% // is filled with a red, diagonal hatch and has // a red edge.
// Get the client area. CRect rectClient; GetClientRect(rectClient);
// Make a couple of pens and similar brushes. CPen penBlue, penRed; CBrush brushBlue, brushRed; CBrush* pOldBrush; CPen* pOldPen;
brushBlue.CreateSolidBrush(RGB(0, 0, 255)); brushRed.CreateHatchBrush(HS_FDIAGONAL, RGB(255, 0, 0)); penBlue.CreatePen(PS_SOLID | PS_COSMETIC, 1, RGB(0, 0, 255)); penRed.CreatePen(PS_SOLID | PS_COSMETIC, 1, RGB(255, 0, 0));
// Draw from 3 o'clock to 6 o'clock, counterclockwise, // in a blue pen with a solid blue fill.
pOldPen = pDC->SelectObject(&penBlue); pOldBrush = pDC->SelectObject(&brushBlue);
pDC->Pie(rectClient, CPoint(rectClient.right, rectClient.CenterPoint().y), CPoint(rectClient.CenterPoint().x, rectClient.right));
// Draw the remaining quarter slice from 6 o'clock // to 3 o'clock, counterclockwise, in a red pen with // the hatched brush. pDC->SelectObject(&penRed); pDC->SelectObject(&brushRed);
// Same parameters, but reverse start and end points. pDC->Pie(rectClient, CPoint(rectClient.CenterPoint().x, rectClient.right), CPoint(rectClient.right, rectClient.CenterPoint().y));
// Restore the previous pen. pDC->SelectObject(pOldPen); }
этот момент: pOldPen = pDC->SelectObject(&penBlue); - одновременно с установкой новой кисти запоминается указатель на старую кисть - её надо будет обязательно вернуть после работы с. Это делается тут: // Restore the previous pen. pDC->SelectObject(pOldPen);
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #24 : 01-01-2008 17:41 » |
|
Непонятная ошибка вылазит Cannot find the resource compiler
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 01-01-2008 17:45 » |
|
Saiko,
1) что написал, после чего появилась ошибка 2) какой файл/строку показывает компилятор 3) если убрать то, что написал (заремить) - компилится или нет ?
(возможно ещё фигурную скобку пропустил где то)
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #26 : 01-01-2008 17:57 » |
|
Вообще никак. Ошибка не при компиляции, а при попытке открыть файл меню
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #27 : 01-01-2008 17:59 » |
|
После того как добавлюю файл resource.rc в проект всё он перестаёт работать
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 01-01-2008 18:01 » |
|
Saiko, а почему ты его туда добавляешь? Импортируй ресурсы, по идее... Хотя , тут не подскажу - у меня всегда файл с ресами визард создаёт
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #29 : 01-01-2008 18:04 » |
|
Да я прост вручную делаю и поэтому добавлять тож приходица вручную
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #30 : 01-01-2008 19:37 » |
|
Что такое HDC?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #31 : 02-01-2008 07:50 » |
|
это хендл контекста устройства.
Кстати, ты в какой среде программирования пишешь программы ?
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #32 : 04-01-2008 11:54 » |
|
Допутсим я хочу использовать pie какой мне для этого нужен контент устройства?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #33 : 04-01-2008 13:26 » |
|
Saiko, тебе нужен контекст того окна, где рисуешь. Приведи код, где ты рисуешь то ?
|
|
|
Записан
|
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #35 : 04-01-2008 15:16 » |
|
вместо pDC->Rectangle(1,1,10,10); -- pDC->Pie(hwc,140,40,240,140,189,140,189,40);
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #36 : 04-01-2008 16:38 » |
|
Я построил диаграмму с помошью AngleArc. Как сделать чтобы при щелчке на области диаграммы у её границы менялся цвет. Как вообще определить по какой области я щёлкнул? Вот прога, строющ. диаграмму. CPaintDC* pDC=new CPaintDC(this); CPen *br=new CPen; br->CreatePen(PS_SOLID,3,RGB(0,255,255)); pDC->SelectObject(br); pDC->MoveTo(50,50); pDC->AngleArc(50,50,50,0,36); CPen *br2=new CPen; br2->CreatePen(PS_SOLID,3,RGB(255,0,255)); pDC->SelectObject(br2); pDC->MoveTo(50,50); pDC->AngleArc(50,50,50,36,126)
|
|
« Последнее редактирование: 04-01-2008 16:56 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #37 : 04-01-2008 17:03 » |
|
Saiko, тег code пиши в квадратных скобках, а не треугольных коли ты имеешь указатель на мфсишный CPaintDC, то тебе хендл не надо указывать. И , кстати, у тебя происходит утечка памяти, надо так делать: void CMyMainWnd::OnPaint() { CPaintDC DC(this); DC.Rectangle(1,1,10,10); DC.Pie(/*хендл не нужен*/ 140,40,240,140,189,140,189,40); }
|
|
« Последнее редактирование: 04-01-2008 17:29 от Алексей1153++ »
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #38 : 04-01-2008 21:02 » |
|
Ок. С этим разобрался. Теперь надо разобраться с этим Как сделать чтобы при щелчке на области диаграммы у её границы менялся цвет. Как вообще определить по какой области я щёлкнул? Вот прога, строющ. диаграмму. Код: CPaintDC* pDC=new CPaintDC(this); CPen *br=new CPen; br->CreatePen(PS_SOLID,3,RGB(0,255,255)); pDC->SelectObject(br); pDC->MoveTo(50,50); pDC->AngleArc(50,50,50,0,36); CPen *br2=new CPen; br2->CreatePen(PS_SOLID,3,RGB(255,0,255)); pDC->SelectObject(br2); pDC->MoveTo(50,50); pDC->AngleArc(50,50,50,36,126)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 05-01-2008 08:03 » |
|
Saiko, нифига ты не разобрался Прочитай предыдущий пост - и убери new. Либо делай грамотно - есть new , делай и delete. То же касается и CPen *br2=new CPen; Как сделать чтобы при щелчке на области диаграммы у её границы менялся цвет. Как вообще определить по какой области я щёлкнул?
это два варианта: 1) если рисуешь прямо на диалоге - то запоминай при кажлой отрисовке координаты прямоугольника, где рисовал диаграмму. Потом - когда ловишь сообщение от мыши - проверяешь положение курсора, сравниваешь с последним известным прямоугольником диаграммы 2) сделать диаграмму в виде самостоятельного контрола, пусть сам отрисовывается, сам обрабатывает мышь. Это удобнее
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #40 : 05-01-2008 18:07 » |
|
include <afxwin.h> #include <windowsx.h> #include <math.h> #include "resource.h" class CMyMainWnd : public CFrameWnd{ public: CMyMainWnd(){ // конструктор LoadFrame(IDR_MENU1); } afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT, CPoint); void OnMyMenuRed(); void OnMyMenuGreen(); void OnMyMenuYellow(); void OnMyMenuBlue(); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyMainWnd, CFrameWnd) ON_COMMAND(ID_MENU_GREEN, OnMyMenuGreen) ON_COMMAND(ID_MENU_BLUE, OnMyMenuBlue) ON_COMMAND(ID_MENU_RED, OnMyMenuRed) ON_COMMAND(ID_MENU_YELLOW, OnMyMenuYellow) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP() class CMyApp : public CWinApp{ public: CMyApp(){}; // конструктор virtual BOOL InitInstance(){ m_pMainWnd=new CMyMainWnd(); m_pMainWnd->ShowWindow(SW_SHOW); return TRUE; } }; CMyApp theApp; int sector=0; COLORREF m_color; void CMyMainWnd::OnPaint(){ CPaintDC pDC(this); CPen br; br.CreatePen(PS_SOLID,3,m_color); pDC.SelectObject(br); pDC.MoveTo(50,50); pDC.AngleArc(50,50,50,0,36); CPen br2; br2.CreatePen(PS_SOLID,3,m_color); pDC.SelectObject(br2); pDC.MoveTo(50,50); pDC.AngleArc(50,50,50,36,126); CPen br3; br3.CreatePen(PS_SOLID,3,m_color); pDC.SelectObject(br3); pDC.MoveTo(50,50); pDC.AngleArc(50,50,50,162,144); CPen br4; br4.CreatePen(PS_SOLID,3,m_color); pDC.SelectObject(br4); pDC.MoveTo(50,50); pDC.AngleArc(50,50,50,306,53); } void CMyMainWnd::OnMyMenuRed(){ m_color=RGB(110,33,255); } void CMyMainWnd::OnMyMenuGreen(){ m_color = RGB(0,255,25); } void CMyMainWnd::OnMyMenuYellow(){ m_color = RGB(0,55,255); } void CMyMainWnd::OnMyMenuBlue(){ m_color = RGB(0,55,5); } void CMyMainWnd::OnLButtonDown(UINT, CPoint loc){ float x; float y; x = loc.x-50; y = 50-loc.y; if((x*x+y*y)<25000) { if((y/50)<sin(3.14/5) && x>0 && y>0) sector=1; else if(((y/50)>sin(3.14/5))||(x<0 && (y/50)>sin(3.14*162/180))) sector=2; else if(((y/50)>sin(3.14*345/180)) && y<0 && x>0) sector=3; else sector=4; } CMyMainWnd::OnPaint(); }
Где-то напортачил. Не знаю где.Диаграмма рисуется, но не перерисовывается, не меняет цвет
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #41 : 05-01-2008 21:51 » |
|
1 на вскидку
вместо CMyMainWnd::OnPaint(); вызывай Invalidate
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #42 : 06-01-2008 22:27 » |
|
Спасибо всё заработало!
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #43 : 07-01-2008 14:29 » |
|
error C2065: 'IDD_DIALOG' : undeclared identifier rror C2057: expected constant expression Что это за ошибки?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #44 : 07-01-2008 15:47 » |
|
неопределённый идентификатор и отсутствие константного выражения
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #45 : 07-01-2008 19:59 » |
|
А как их исправить. Появились они так. Создал я диалог IDD_Dialog, а потом на его основе класс CDlg и в Dlg.h появилась ошибка class CDlg : public CDialog { // Construction public: CDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data //{{AFX_DATA(CDlg) enum { IDD = IDD_DIALOG }; <---ЗДЕСЬ CString m_sMyString; //}}AFX_DATA
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #46 : 07-01-2008 20:04 » |
|
Saiko, перед class CDlg : public CDialog впиши #include "resource.h" --------- а вообще - освой визард, всё таки удобная штука и избавляет от многой рутины
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #47 : 08-01-2008 07:53 » |
|
Так класс с помощью визарда сделан Когда вписываешь #include "resource.h" появляется ошибка rror LNK2001: unresolved external symbol "public: void __thiscall CMyMainWnd::OnMyMenuDialog(void)" (?OnMyMenuDialog@CMyMainWnd@@QAEXXZ)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #48 : 08-01-2008 09:15 » |
|
Saiko, так надоть было сразу проект визардом создавать то Тем более, если MFC юзаешь. скинь мне на мыло проект, я посмотрю
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #49 : 08-01-2008 09:52 » |
|
Всё, отправил.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #50 : 08-01-2008 14:08 » |
|
так и думал я, что пришлёшь ВСЁ ))) И 2 метра - это не предел. Когда присылаешь проект (или просто архивируешь) удаляй папки DEBUG и RELEASE , они огромные и не нужны для хранения проекта. вот это вообще жесть: #include "C:\Program Files\c++\VC98\MFC\SRC\stdafx.h"
надо быть проще : вообще, говорю же - надо изначально визардом создавать проект было, а не смешивать в кучу визард и вручную добавление. Если честно, я тоже не понял, почему файл не включается , где то что то в настройках проекта напутано - нет времени разбираться совсем )) Пока в проекте немного сделано, советую начать всё заново и по правилам. 1)запускай студию 2) Ctrl+N , выбирай там MFC AppWizard (exe). В окошке Location пиши путь, где будет размещён проект, а затем в окошке Project Name пиши имя проекта (для примера mmm). OK 3) выбирай DialogBased , NEXT 4) убери галку About Box, NEXT , Finish сохраняй проект, затем открывай файл mmm.h , там ищи функцию BOOL CmmmApp::InitInstance() в ней строки CMmmDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel }
// Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE;
замени на просто CMmmDlg dlg; m_pMainWnd = &dlg; dlg.DoModal(); return FALSE;
затем скопируй код , который уже написал в старом проекте. Новые ресы вручную старайся не вставлять, а только визардом - а то у него крыша поедет снова
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #51 : 08-01-2008 22:21 » |
|
вот это вообще жесть: #include "C:\Program Files\c++\VC98\MFC\SRC\stdafx.h"
надо быть проще : По другому не прёт=). ХЗ почему Да а насчёт визарда, так и сделаю. Просто хотел вручную сделать чтоб разбираться где-что(так потом защищать легче)
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #52 : 08-01-2008 22:27 » |
|
Гы вообще проще получилось. Поставил функцию внутри класса и всё заработало=)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #53 : 09-01-2008 07:32 » |
|
Поставил функцию внутри класса и всё заработало=)
ну да, тоже правильно но про визард всё же задумайся - объяснять преподу действия визарда не нужно, какой смысл, объяснять только свои действия надо
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #54 : 14-01-2008 22:32 » |
|
К этой программе мне теперь нужно добавить возможность сохранения настроек в файл. Как это легче сделать? Нужно ли мне использовать документ/вид(там вроде готовое меню)?Если да то куда помещать глобальные переменные(например которая хранит цвет диаграммы) чтобы они были видны всем модулям. Метод OnPaint и OnLButtonDown я обрабатываю в Doc.cpp, а щёлчок по пункту меню(выбор цвета)MainFrm. Это правильно?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #55 : 15-01-2008 04:29 » |
|
по мне, так лучше всего создавать свой файл через CreateFile , потом работать через WriteFile/ReadFile //создание файла HANDLE h=::CreateFile("c:\\myfile",GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0); if(h!=INVALID_HANDLE_VALUE) { //пишем ::WriteFile(h, .... ); ... }
//открытие файла только для чтения HANDLE h=::CreateFile("c:\\myfile",GENERIC_READ,0,0,OPEN_EXISTING,0,0); if(h!=INVALID_HANDLE_VALUE) { //читаем ::ReadFile(h, .... ); ... }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #56 : 15-01-2008 04:35 » |
|
Метод OnPaint и OnLButtonDown я обрабатываю в Doc.cpp, а щёлчок по пункту меню(выбор цвета)MainFrm. Это правильно?
кто как привык, наверное )) Я, например, в Doc вообще никогда код не пишу, бесполезный класс, мне кажется. Я всё во View или в диалоге отрабатываю - и отрисовку, и меню
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #57 : 15-01-2008 14:08 » |
|
Doc-class это обязательная часть Documet-View-архитектуры (которую кстати совсем необязательно использовать во всех проектах). В нём хранятся данные, котрые отображаются во View-объектах. Их может быть у одного документа несколько. Например табличные данные можно представить в виде таблицы, или диаграммы, или графика и тп. Те требуются разные OnPaint. Я уже не говорю о сплитере.
Реакции на действия пользователя в окне нечего делать в Документе. Для этого лучше всего подходит View или, немного хуже, MainFrame. Те обработчик в MainFrame или View, данные - в документе.
Документ наделён ф-ми сохранения/загрузки файла и сериализацией.
Как Лёшка без этого рабатет, раз считает бесполезным, - ума не приложу?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #58 : 15-01-2008 18:32 » |
|
ну вот абсолютно ни разу лезть в класс дока и что то туда писать не потребовалось Вспоминаю про него вот в эти моменты, когда кто то спрашивает. Может быть причина ещё в том, что MDI ни разу не приходилось использовать, только SDI , хотя, мне кажется в том случае я бы тоже всё во вьюхе хранил
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #59 : 16-01-2008 06:22 » |
|
Диграмма не рисуется. Но когда меняешь цвет кисти вызывая ColorDialog она появляется на секунду. Диаграмма рисуется в MainFrame. void CMainFrame::OnPaint(){ CPaintDC pDC(this); CPen br; CPen br2; CPen br3; CPen br4; br.CreatePen(PS_SOLID,3,m_color[0]); pDC.SelectObject(br); pDC.MoveTo(150,150); pDC.AngleArc(150,150,50,0,36); br2.CreatePen(PS_SOLID,3,m_color[1]); pDC.SelectObject(br2); pDC.MoveTo(150,150); pDC.AngleArc(150,150,50,36,126); br3.CreatePen(PS_SOLID,3,m_color[3]); pDC.SelectObject(br3); pDC.MoveTo(150,150); pDC.AngleArc(150,150,50,162,144); br4.CreatePen(PS_SOLID,3,m_color[2]); pDC.SelectObject(br4); pDC.MoveTo(150,150); pDC.AngleArc(150,150,50,306,53); AfxMessageBox("Левая кнопка мыши"); }
|
|
« Последнее редактирование: 16-01-2008 06:28 от Saiko »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #60 : 16-01-2008 06:37 » |
|
во первых, AfxMessageBox("Левая кнопка мыши"); - нельзя в OnPaint такие вещи помещать
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #61 : 17-01-2008 22:25 » |
|
Просто хотел посмпотреть вызывается ли функция
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #62 : 18-01-2008 04:14 » |
|
Saiko, так сделай вывод данных в какое нибудь окошко (через SetWindowText) или точку останова, в конце то концов А то ты тут выводишь модальный диалог, а окно перерисовываться захочет - получится заклинивание или куча-куча таких окошек с сообщением
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #63 : 21-01-2008 13:40 » |
|
Как перевести переменную типа Colorref в str?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #64 : 21-01-2008 15:13 » |
|
COLORREF cr = RGB(123,231,213); CString stCR; stCR.Format(_T("%X"), cr);
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #65 : 21-01-2008 15:21 » |
|
Saiko, смотря, что ты хочешь получить. Если рассматривать COLORREF как DWORD , то в виде хекса или в виде десятичной цифры так:
CString txt;
txt.Format("%d",(DWORD)RGB(...)); //десятичное число txt.Format("%x",(DWORD)RGB(...)); //хекс
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #66 : 21-01-2008 15:21 » |
|
Джон обогнал )
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #67 : 21-01-2008 16:34 » |
|
А как вытащить значение из переменной типа HKEY в строку или в int
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #68 : 22-01-2008 12:23 » |
|
Пытаюсь прочитать данные в строку char BufferString[30]; char myString[12]; strcpy(myString,"myString"); HKEY hSubkey; RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\mysoftware\\myString",&hSubkey); RegQueryValueEx(hSubkey,myString,NULL,NULL,(LPBYTE)BufferString,NULL);
Где-то не получается. ЗЫ А можно в реестр записывать цвет. А то мне нужно сохранить цвет и приходиться переводить его сначала в строку а потом назад
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #69 : 22-01-2008 12:35 » |
|
Saiko, цвет переводи в DWORD (если 32 бит хватит) и храни, или в Binary-формате, если больше (хотя судя по семплу, DWORD самое оно). COLORREF, как я смотрю, и определено как typedef DWORD COLORREF...
|
|
« Последнее редактирование: 22-01-2008 12:39 от Вад »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #70 : 22-01-2008 12:38 » |
|
Saiko, ты не обижайся, но вы блин как дети малые - указываете как вам помочь решить задачу именно вашим способом, совершенно забывая указать конечную цель. Всё равно как дети будут указывать родителям, как им работать, чтобы заработать деткам на конфетки.
Чтобы в будущем сэкономить кучу времени и своего и чужого - начинай с постановки задачи, или хотя бы с того, что ты хочешь в итоге получить. Ок? Причина - посмотри ниже решение твой (наконец-таки сформулированной) задачи.
Итак - COLORREF это тоже самое что DWORD, поэтому его можно напрямую записывать в реестр. Если у тебя MFC проект, то проще всего это сделать так
COLORREF cr = RGB(123,231,213); AfxGetApp()->WriteProfileInt(_T("MySettings"), _T("Color"), (int)cr);
Всё!
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #71 : 22-01-2008 16:35 » |
|
Спасибо большое=).
|
|
|
Записан
|
|
|
|
|