如何用VC++实现作图(做一个类),主要是圆圈和方形,并能用箭头线将他们连起来,且要能识别箭头线的两端,即哪个图在箭头线的起始端,哪个在末端,其实就是要识别图形间代表的数据关系.做的图还要能保存及修改,且修改后图形代表的新的数据关系要能识别.
解决方案 »
- 可以 编辑的 列表控件
- 一个关于套接字关闭的时间问题
- 关于程序运行时生成新程序的问题(增分)
- 求助BCGContralBar问题
- 100分值吗?菜鸟刚学vc没两天,创建了一个基与对话框的练习,我在第一个窗体上放了一个按钮,点击这个按钮可以弹出第二个窗体,第二个窗
- 呕血提问,那位大侠能够提供在16位DOS下使用保护模式开发的工具(C和C++)要有下载地址,在线等候。
- 请问C++的前途在那,那个好
- 静态链接转动态链接
- GetLargePageMinimum 调用失败
- 现在在北京,工作一年以上,用VC工资一般多少?
- [高分求教:] XML解析问题, 请高手指教!急!
- 急!!一个CFileDialog派生类的问题
1。采用SDI程序
2。定义圆圈类,方形类,箭头类,这三个都从基类如CShapeObj派生。圆圈类和方形类元素包括位置属性,箭头类除了首末位置属性,还用于存储箭头线连接的是那两个对象指针。每个类自己实现Serialize函数。
3。定义指针链表对象存储的是CShapeObj对象指针如CTypedefPtrList<CPtrList,CShapeObj*> m_shapeObjList;由于圆圈类,方形类由CShapeObj派生,所以这些对象指针都可以存储到这个链表。所有操作包括增加、删除都对这个链表操作。显示的内容都从这个链表获得。
4。专门定义一个指针链表,用于存储箭头类对象,箭头类中的元素标明箭头的的起始端(连接的对象和坐标)、末端。
class CShapeObj : public CObject
{
protected:
DECLARE_SERIAL(CShapeObj)
public:
CShapeObj();
virtual ~CShapeObj();
void Serialize(CArchive &ar);
BOOL IsPointInObj(CPoint vpoint);
public:
virtual void DrawSelFrm(CDC *pDC);
virtual void Draw(CDC* pDC);
CDrawRect Pos;
int nType;
int nId;
short nRow;
float xBias;
};//以画单选框为例draw Button Control
class CRadioShape : public CShapeObj
{
public:
CRadioShape();
virtual ~CRadioShape();
public: virtual void Draw(CDC *pDC);
void Serialize(CArchive &ar);
};class CDrawIconView : public CView
{
public:
CTypedPtrList<CPtrList,CShapeObj *> SelShapeObjList;
CTypedPtrList<CPtrList,CShapeObj *> ShapeObjList;
}
void CDrawIconDoc::Serialize(CArchive& ar)
{
int m_nCount;
CShapeObj *m_pShapeObj;
POSITION pos=this->GetFirstViewPosition();
CDrawIconView *pView=(CDrawIconView *)this->GetNextView(pos);
if (ar.IsStoring())
{for(int i=0;i<m_nCount;i++){
m_pShapeObj=pView->ShapeObjList.GetAt(pView->ShapeObjList.FindIndex(i));
m_pShapeObj->Serialize(ar);
}
BOOL CDrawIconView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
int m_nDataType;
if(pDataObject->IsDataAvailable( CF_TEXT ))
{
HGLOBAL hMem = pDataObject->GetGlobalData( CF_TEXT );
char* lp = (char *)GlobalLock((HGLOBAL) hMem);//lock source
if (lp != NULL)
{
memcpy(&m_nDataType,lp,sizeof(int));
}
GlobalUnlock( hMem );//unlock source
}
CDrawIconDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
switch(m_nDataType)
{
case 0:
{
CEditShape *m_pEditShape=new CEditShape;
m_pEditShape->nId=pDoc->nMaxId;
m_pEditShape->nRow=m_nCurRow;
m_pEditShape->Pos.width=TEXT_CONTROL_WIDTH;
m_pEditShape->Pos.height=TEXT_CONTROL_HEIGHT;
m_nCurRow++;
pDoc->nMaxId++;
ShapeObjList.AddTail(((CEditShape *)m_pEditShape));
Invalidate(FALSE);
}
break;
case 1:
{//略
}
break;
case 2:
{
CButtonShape *m_pButtonShape=new CButtonShape;
//略
ShapeObjList.AddTail(((CButtonShape *)m_pButtonShape));
Invalidate(FALSE);
}
break;
default:
break;
return CView::OnDrop(pDataObject, dropEffect, point);
}
2。请给我发短信告诉我你的邮箱。
[email protected]
[email protected]
thank you very much!
拖曳及箭头连接时对箭头线起始端和箭头端的感应,从而能很好地图表示的数据间的关系.