Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [Все]   Вниз
  Печать  
Автор Тема: [C++&& WinAPI]как нарисовать диаграмму  (Прочитано 72273 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Saiko
Постоялец

ru
Offline Offline

« : 29-12-2007 08:50 » 

Необходимо нарисовать круговую диаграмму.При щелчке в секторе диаграммы граница сектора окрашивается вцвет, выбранный ранее в меню
« Последнее редактирование: 29-12-2007 11:17 от Finch » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 29-12-2007 11:29 » 

Не совсем ясно, что конкретно ты не знаеш, как сделать. Если не охота возится с математикой, можно воспользоваться WinAPI функцией ַPie http://msdn2.microsoft.com/en-us/library/ms533892(VS.85).aspx
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Saiko
Постоялец

ru
Offline Offline

« Ответ #2 : 29-12-2007 12:59 » 

Я ваще ничего не понимаю. Нужно ли создавать для моей задачи проект или win32-приложение,
и как работает функция Pie(не понимаю что там за аргументы). Можно ли содать диаграмму в Excelе
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #3 : 29-12-2007 13:03 » 

Можно ли воспользоваться функцией GGraf
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 29-12-2007 13:20 » 

А начем ты вообще хотиш писать программу? Если все таки на С++, то я не знаю, как ты хотиш работать с COM или ActiveX объектами ָExcell. Это я сужу по тому уровню знаний, что ты уже высказал.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Saiko
Постоялец

ru
Offline Offline

« Ответ #5 : 29-12-2007 13:36 » 

на Си
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 29-12-2007 14:08 » 

Ты пишеш для себя или для лабы в учебном заведении?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Saiko
Постоялец

ru
Offline Offline

« Ответ #7 : 29-12-2007 14:28 » 

Для лабы. Можешь объяснить как pie работает?
Записан
Finch
Спокойный
Администратор

il
Offline 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
Помогающий

ua
Offline Offline

« Ответ #9 : 29-12-2007 19:04 » 

 :Улыбаюсь

* pie.rar (7.86 Кб - загружено 1185 раз.)
* exe.rar (171.7 Кб - загружено 3855 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 29-12-2007 20:21 » 

v2, симпатичный креативчик Улыбаюсь

откуда только на такую несложную вещь аж 175 кб - вопрос
« Последнее редактирование: 30-12-2007 12:59 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 29-12-2007 20:23 » 

Алексей1153++, для ֱVLS DELPHI нормально. Тем более если, оно у тебя не потребовало дополнительных библиотек.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 30-12-2007 13:03 » 

Джон, Джонище, да зря ты так, на самом деле. Если вопрошающий - человек, который умеет думать , то он залезет в исходники - несложной, замечу - программы , пусть и на другом языке , и поймёт всё, что ему надо
Записан

Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 31-12-2007 09:31 » 

Пламенная речь, Джон Улыбаюсь Всё же я исхожу из того, что он укмеет думать. Половина из твоих аргументов отпадает Ага Ну а если он думать не умеет - ему ничто не поможет
Записан

v2
Помогающий

ua
Offline Offline

« Ответ #16 : 31-12-2007 16:36 » 

Прошу прощения, если кого обидел.
Учится лучше на конкретных примерах.

Всё! Всех с Новым Годом! Иду пить! Что, съел?

А если вернусь, а потом и вспомню об этом, то будет и на С.
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #17 : 01-01-2008 12:56 » 

По функции pie:у меня получается поделить диаграмму тока на 2 сектора потому что проводятся только 2 радиуса
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #18 : 01-01-2008 12:57 » 

ЗЫ: какой функцией прямая рисуется?7
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 01-01-2008 16:47 » 

Saiko, установить графический курсор -
::MoveTo(HWND h,int x,int y);

из текущего положения курсора провести линию в координату -

::LineTo(HWND h,int x,int y);


Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #20 : 01-01-2008 17:06 » 

Диаграмма готова как её закрасить?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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

в качестве точки начала заливки можно выбрать геометрический центр сектора
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 01-01-2008 17:19 » 

вообще то pie умеет сразу вроде бы закрашивать - надо кисть нужную выбрать просто. Только я сейчас не в силах  пример нарисовать , или ошибок наделаю Отлично
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Постоялец

ru
Offline Offline

« Ответ #24 : 01-01-2008 17:41 » 

Непонятная ошибка вылазит Cannot find the resource compiler
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 01-01-2008 17:45 » 

Saiko,

1) что написал, после чего появилась ошибка
2) какой файл/строку показывает компилятор
3) если убрать то, что написал (заремить) - компилится или нет ?

(возможно ещё фигурную скобку пропустил где то)
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #26 : 01-01-2008 17:57 » 

Вообще никак. Ошибка не при компиляции, а при попытке открыть файл меню
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #27 : 01-01-2008 17:59 » 

После того как добавлюю файл resource.rc  в проект всё он перестаёт работать
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 01-01-2008 18:01 » 

Saiko, а почему ты его туда добавляешь? Импортируй ресурсы, по идее... Хотя , тут не подскажу - у меня всегда файл с ресами визард создаёт
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #29 : 01-01-2008 18:04 » 

Да я прост вручную делаю и поэтому добавлять тож приходица вручную
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #30 : 01-01-2008 19:37 » 

Что такое HDC?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #31 : 02-01-2008 07:50 » 

это хендл контекста устройства.

Кстати, ты в какой среде программирования пишешь программы ?
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #32 : 04-01-2008 11:54 » 

Допутсим я хочу использовать pie какой мне для этого нужен контент устройства?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #33 : 04-01-2008 13:26 » 

Saiko, тебе нужен контекст того окна, где рисуешь. Приведи код, где ты рисуешь то ?
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #34 : 04-01-2008 15:15 » 

Код:
#include <afxwin.h>
#include "resource.h"
class CMyMainWnd : public CFrameWnd{
public:
CMyMainWnd(){ // конструктор
   LoadFrame(IDR_MENU1);
}
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyMainWnd, CFrameWnd)
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;
void CMyMainWnd::OnPaint(){
    CPaintDC* pDC=new CPaintDC(this);    pDC->Rectangle(1,1,10,10);
}
« Последнее редактирование: 04-01-2008 16:54 от Алексей1153++ » Записан
Saiko
Постоялец

ru
Offline 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
Постоялец

ru
Offline 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++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Постоялец

ru
Offline 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)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 05-01-2008 08:03 » 

Saiko, нифига ты не разобрался Улыбаюсь Прочитай предыдущий пост - и убери new.

Либо делай грамотно - есть new , делай и delete. То же касается и
CPen *br2=new CPen;

Цитата
Как сделать чтобы при щелчке на области диаграммы у её границы менялся цвет. Как вообще определить по какой области я щёлкнул?
это два варианта:

1) если рисуешь прямо на диалоге - то запоминай при кажлой отрисовке координаты прямоугольника, где рисовал диаграмму. Потом - когда ловишь сообщение от мыши - проверяешь положение курсора, сравниваешь с последним известным прямоугольником диаграммы
2) сделать диаграмму в виде самостоятельного контрола, пусть сам отрисовывается, сам обрабатывает мышь. Это удобнее

Записан

Saiko
Постоялец

ru
Offline 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();
}
Где-то напортачил. Не знаю где.Диаграмма рисуется, но не перерисовывается, не меняет цвет
Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline

« Ответ #42 : 06-01-2008 22:27 » 

Спасибо всё заработало!
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #43 : 07-01-2008 14:29 » 

error C2065: 'IDD_DIALOG' : undeclared identifier
rror C2057: expected constant expression
Что это за ошибки?
Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline 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

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #46 : 07-01-2008 20:04 » 

Saiko, перед
class CDlg : public CDialog

впиши
#include "resource.h"

---------
а вообще - освой визард, всё таки удобная штука и избавляет от многой рутины Улыбаюсь
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #47 : 08-01-2008 07:53 » 

Так класс с помощью визарда сделан
Когда вписываешь #include "resource.h" появляется ошибка
rror LNK2001: unresolved external symbol "public: void __thiscall CMyMainWnd::OnMyMenuDialog(void)" (?OnMyMenuDialog@CMyMainWnd@@QAEXXZ)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #48 : 08-01-2008 09:15 » 

Saiko, так надоть было сразу проект визардом создавать то Улыбаюсь Тем более, если MFC юзаешь.

скинь мне на мыло проект, я посмотрю
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #49 : 08-01-2008 09:52 » 

Всё, отправил.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 08-01-2008 14:08 » 

так и думал я, что пришлёшь ВСЁ ))) И 2 метра - это не предел. Когда присылаешь проект (или просто архивируешь) удаляй папки DEBUG и RELEASE , они огромные и не нужны для хранения проекта.

вот это вообще жесть:
Код:
#include "C:\Program Files\c++\VC98\MFC\SRC\stdafx.h"

надо быть проще :
Код:
#include "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
Постоялец

ru
Offline Offline

« Ответ #51 : 08-01-2008 22:21 » 

Цитата
вот это вообще жесть:
Код:
#include "C:\Program Files\c++\VC98\MFC\SRC\stdafx.h"

надо быть проще :
Код:
#include "stdafx.h"

По другому не прёт=). ХЗ почему
Да а насчёт визарда, так и сделаю. Просто хотел вручную сделать чтоб разбираться где-что(так потом защищать легче)
Записан
Saiko
Постоялец

ru
Offline Offline

« Ответ #52 : 08-01-2008 22:27 » 

Гы вообще проще получилось. Поставил функцию внутри класса и всё заработало=)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #53 : 09-01-2008 07:32 » 

Цитата
Поставил функцию внутри класса и всё заработало=)
ну да, тоже правильно Отлично

но про визард всё же задумайся - объяснять преподу действия визарда не нужно, какой смысл, объяснять только свои действия надо
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #54 : 14-01-2008 22:32 » 

К этой программе мне теперь нужно добавить возможность сохранения настроек в файл. Как это легче сделать?
Нужно ли мне использовать документ/вид(там вроде готовое меню)?Если да то куда помещать глобальные переменные(например которая хранит цвет диаграммы) чтобы они были видны всем модулям.
Метод OnPaint и OnLButtonDown я обрабатываю в Doc.cpp, а щёлчок по пункту меню(выбор цвета)MainFrm. Это правильно?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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, .... );
   ...
}

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #56 : 15-01-2008 04:35 » 

Цитата
Метод OnPaint и OnLButtonDown я обрабатываю в Doc.cpp, а щёлчок по пункту меню(выбор цвета)MainFrm. Это правильно?

кто как привык, наверное ))  Я, например, в Doc вообще никогда код не пишу, бесполезный класс, мне кажется. Я всё во View или в диалоге отрабатываю - и отрисовку, и меню
Записан

Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #58 : 15-01-2008 18:32 » 

ну вот абсолютно ни разу лезть в класс дока и что то туда писать не потребовалось Улыбаюсь Вспоминаю про него вот в эти моменты, когда кто то спрашивает. Может быть причина ещё в том, что MDI ни разу не приходилось использовать, только SDI , хотя, мне кажется в том случае я бы тоже всё во вьюхе хранил
Записан

Saiko
Постоялец

ru
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #60 : 16-01-2008 06:37 » 

во первых,
AfxMessageBox("Левая кнопка мыши");
- нельзя в OnPaint такие вещи помещать
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #61 : 17-01-2008 22:25 » 

Просто хотел посмпотреть вызывается ли функция
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #62 : 18-01-2008 04:14 » 

Saiko, так сделай вывод данных в какое нибудь окошко (через SetWindowText) или точку останова, в конце то концов Улыбаюсь
А то ты тут выводишь модальный диалог, а окно перерисовываться захочет - получится заклинивание или куча-куча таких окошек с сообщением
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #63 : 21-01-2008 13:40 » 

Как перевести переменную типа Colorref в str?
Записан
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #65 : 21-01-2008 15:21 » 

Saiko, смотря, что ты хочешь получить. Если рассматривать COLORREF как DWORD , то в виде хекса или в виде десятичной цифры так:

CString txt;

txt.Format("%d",(DWORD)RGB(...)); //десятичное число
txt.Format("%x",(DWORD)RGB(...)); //хекс
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #66 : 21-01-2008 15:21 » 

Джон обогнал )
Записан

Saiko
Постоялец

ru
Offline Offline

« Ответ #67 : 21-01-2008 16:34 » 

А как вытащить значение из переменной типа HKEY в строку или в int
Записан
Saiko
Постоялец

ru
Offline 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);
Где-то не получается.
ЗЫ
А можно в реестр записывать цвет. А то мне нужно сохранить цвет и приходиться переводить его сначала в строку а потом назад
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #69 : 22-01-2008 12:35 » 

Saiko, цвет переводи в DWORD (если 32 бит хватит) и храни, или в Binary-формате, если больше (хотя судя по семплу, DWORD самое оно). COLORREF, как я смотрю, и определено как typedef DWORD COLORREF...
« Последнее редактирование: 22-01-2008 12:39 от Вад » Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline

« Ответ #71 : 22-01-2008 16:35 » 

Спасибо большое=).
Записан
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines