S-ar parea ca lucrurile nu sunt asa de simple cum am crezut
Am facut o clasa CDiagramCtrl derivata din CStatic. Scuze, dar o sa pun tot headerul si .cpp-ul, pentru ca nu stiu de unde vine eroarea...
header:
Code: Select all
#pragma once
// CDiagramCtrl
class CDiagramCtrl : public CStatic
{
DECLARE_DYNAMIC(CDiagramCtrl)
public:
CDiagramCtrl();
virtual ~CDiagramCtrl();
virtual void OnFinalRelease();
float teta;
CRect rect;
int nID;
void DrawPipe(CPaintDC PDC, CRect rect);
void DrawPositionLine(CPaintDC PDC, CRect rect, float teta);
protected:
float GetRadius(CRect rect);
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};
.cpp:
Code: Select all
// DiagramCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "PipeDoctor.h"
#include "DiagramCtrl.h"
#include "math.h"
#define M_PI 3.14159265358979323846 // PI
#define M_1_PI 0.318309886183790671538 // 1/PI
// CDiagramCtrl
IMPLEMENT_DYNAMIC(CDiagramCtrl, CStatic)
CDiagramCtrl::CDiagramCtrl()
{
#ifndef _WIN32_WCE
EnableActiveAccessibility();
#endif
EnableAutomation();
}
CDiagramCtrl::~CDiagramCtrl()
{
}
void CDiagramCtrl::OnFinalRelease()
{
CStatic::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CDiagramCtrl, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CDiagramCtrl, CStatic)
END_DISPATCH_MAP()
// {C3156248-B41B-4A03-851C-86F6290E09B8}
static const IID IID_IDiagramCtrl =
{ 0xC3156248, 0xB41B, 0x4A03, { 0x85, 0x1C, 0x86, 0xF6, 0x29, 0xE, 0x9, 0xB8 } };
BEGIN_INTERFACE_MAP(CDiagramCtrl, CStatic)
INTERFACE_PART(CDiagramCtrl, IID_IDiagramCtrl, Dispatch)
END_INTERFACE_MAP()
// CDiagramCtrl message handlers
void CDiagramCtrl::DrawPipe(CPaintDC PDC, CRect rect)
{
CPoint points[500];
int count=0;
for (float i=0; i<M_PI; i=i+(1.0f/500)*M_PI)
{
points[count].x=rect.CenterPoint().x+GetRadius(rect)*sinf(i);
points[count].y=rect.CenterPoint().y+GetRadius(rect)*cosf(i);
count++;
}
PDC.Polyline(points,500);
}
void CDiagramCtrl::DrawPositionLine(CPaintDC PDC, CRect rect, float teta)
{
CPoint points[2];
float xc = rect.CenterPoint().x, yc = rect.CenterPoint().y;
points[0].x=xc;
points[0].y=yc;
points[1].x=xc+sinf(teta)*GetRadius(rect);
points[1].y=yc+cosf(teta)*GetRadius(rect);
//HPEN hpen = CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
PDC.MoveTo(points[0]);
PDC.LineTo(points[1]);
//DeleteObject(hpen);
}
float CDiagramCtrl::GetRadius(CRect rect)
{
return (min((float)rect.Width(),(float)rect.Height())/(3.0f));
}
void CDiagramCtrl::OnPaint()
{
CPaintDC PDC(this);
GetDlgItem(nID)->GetWindowRect(&rect);
ScreenToClient(&rect);
DrawPipe(PDC,rect);
DrawPositionLine(PDC,rect,teta);
}
iar atunci cand compilez, zice asa:
1>c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(963) : error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
1> c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(561) : see declaration of 'CObject::CObject'
1> c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(532) : see declaration of 'CObject'
1> This diagnostic occurred in the compiler generated function 'CDC::CDC(const CDC &)'
Fac o greseala usor de corectat, sau intreaga abordare e gresita?
Ideea ar fi ca eu sa instantiez clasa asta in dialogul in care vreau s-o folosesc, sa atribui valori lui
float teta si
int nID; (unde nID ar fi ID-ul controlului static in care vreau sa desenez), iar el sa deseneze pentru mine. Si as mai crea o functie care sa-mi deseneze niste puncte luate dintr-un vector<structura definita de mine>v;
Probabil ca intrebarile mele par foarte stupide, dar nu am niciun fel de pregatire in programare si lucrurile mi se par foarte abigui.
Multumesc.