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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines