Saiko
Постоялец
Offline
|
|
« Ответ #30 : 01-01-2008 19:37 » |
|
Что такое HDC?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #31 : 02-01-2008 07:50 » |
|
это хендл контекста устройства.
Кстати, ты в какой среде программирования пишешь программы ?
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #32 : 04-01-2008 11:54 » |
|
Допутсим я хочу использовать pie какой мне для этого нужен контент устройства?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #48 : 08-01-2008 09:15 » |
|
Saiko, так надоть было сразу проект визардом создавать то Тем более, если MFC юзаешь. скинь мне на мыло проект, я посмотрю
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #49 : 08-01-2008 09:52 » |
|
Всё, отправил.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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 » |
|
Гы вообще проще получилось. Поставил функцию внутри класса и всё заработало=)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #53 : 09-01-2008 07:32 » |
|
Поставил функцию внутри класса и всё заработало=)
ну да, тоже правильно но про визард всё же задумайся - объяснять преподу действия визарда не нужно, какой смысл, объяснять только свои действия надо
|
|
|
Записан
|
|
|
|
Saiko
Постоялец
Offline
|
|
« Ответ #54 : 14-01-2008 22:32 » |
|
К этой программе мне теперь нужно добавить возможность сохранения настроек в файл. Как это легче сделать? Нужно ли мне использовать документ/вид(там вроде готовое меню)?Если да то куда помещать глобальные переменные(например которая хранит цвет диаграммы) чтобы они были видны всем модулям. Метод OnPaint и OnLButtonDown я обрабатываю в Doc.cpp, а щёлчок по пункту меню(выбор цвета)MainFrm. Это правильно?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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, .... ); ... }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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 »
|
Записан
|
|
|
|
|