整理电子元器件系统.docx
- 文档编号:14566719
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:29
- 大小:23.69KB
整理电子元器件系统.docx
《整理电子元器件系统.docx》由会员分享,可在线阅读,更多相关《整理电子元器件系统.docx(29页珍藏版)》请在冰点文库上搜索。
整理电子元器件系统
电子元器件系统代码分析
一、类的定义与实现
1、器件类
●器件类定义
classCComponent:
publicCObject
{
public:
staticCOLORREFm_fillColor;//由类的所有对象共享
BOOLIsNum(CStringstr);
BOOLIsInList(inti,CObList*pNumList);
DECLARE_SERIAL(CComponent)
voidSerialize(CArchive&ar);
voidSetName(constCString&Name);
CStringGetName();
virtualvoidDraw(CDC*pDC);
virtualCStringCalculateName(CObList*pList);
floatGetRotateAngle();
voidSetRotateAngle(floatangle);
BOOLGetIsSelected();
voidSetIsSelected(BOOLIsSel);
intGetLineWidth();
voidSetLineWidth(intLWidth);
voidSetColor(COLORREFcolor);
COLORREFGetColor();
CComponent();
virtual~CComponent();
private:
floatm_RotateAngle;
BOOLm_IsSelected;
intm_iLineWidth;
COLORREFm_Color;
CStringm_strName;
};
●器件类实现
COLORREFCComponent:
:
m_fillColor=RGB(176,176,176);
//在文件范围内初始化
CComponent:
:
CComponent()
{
m_RotateAngle=0;
m_IsSelected=FALSE;
//m_iLineWidth=4;
m_iLineWidth=40;
m_Color=RGB(0,0,255);
}
CComponent:
:
~CComponent()
{
}
COLORREFCComponent:
:
GetColor()
{
returnm_Color;
}
voidCComponent:
:
SetColor(COLORREFcolor)
{
m_Color=color;
}
voidCComponent:
:
SetLineWidth(intLWidth)
{
m_iLineWidth=LWidth;
}
intCComponent:
:
GetLineWidth()
{
returnm_iLineWidth;
}
voidCComponent:
:
SetIsSelected(BOOLIsSel)
{
m_IsSelected=IsSel;
}
BOOLCComponent:
:
GetIsSelected()
{
returnm_IsSelected;
}
voidCComponent:
:
SetRotateAngle(floatangle)
{
m_RotateAngle=angle;
}
floatCComponent:
:
GetRotateAngle()
{
returnm_RotateAngle;
}
CStringCComponent:
:
CalculateName(CObList*pObList)
{
return"器件";
}
voidCComponent:
:
Draw(CDC*pDC)
{
}
CStringCComponent:
:
GetName()
{
returnm_strName;
}
voidCComponent:
:
SetName(constCString&Name)
{
m_strName=Name;
}
voidCComponent:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
ar< } else { ar>>m_Color>>m_iLineWidth>>m_strName>>m_RotateAngle; } } BOOLCComponent: : IsInList(inti,CObList*pNumList) //判断数字i是否在链表pNumList中 { POSITIONpos=pNumList->GetHeadPosition(); CObject*pObject; int*p; while(pos! =NULL) { pObject=pNumList->GetAt(pos); p=(int*)pObject; if(i==(*p)) { returnTRUE; } pNumList->GetNext(pos); } returnFALSE; } BOOLCComponent: : IsNum(CStringstr) //判断一个字符串是否是数字,在各个派生类的CalculateName函数中 //使用,系统提供的函数atoi()将类似于"12ert"之类的串转换为12, //这显然是不正确的,因此自己开发了这个小函数 { intlen=str.GetLength(); charch; for(inti=1;i<=len;i++) { ch=str.GetAt(i-1); if(! (ch<='9'&&ch>='0')) { returnFALSE; } } returnTRUE; } 2、电阻类的定义与实现 ●电阻类的定义 #include"Component.h"//包含基类的头文件 typedefstructstruc_Resistor { charm_strClassType[20]; //COLORREFm_color; //intm_iLineWidth; BOOLm_IsSelected; //floatm_RotateAngle; charm_strName[100]; //charm_ReType[100];//电阻的类型 //charm_ReValue[100];//电阻的阻值 }RESISTOR; classCResistor: publicCComponent { public: voidCopyReToStruRe(RESISTOR&Resistor); //将电阻对象拷贝到电阻结构中 CResistor(RESISTORResistor); voidGetNumInNameSer(CObList*pObList,CObList*pNumSer,int*pMax); //取得已绘制的电阻名称中的数字序列 CResistor(CPoint*pt); DECLARE_SERIAL(CResistor) voidSerialize(CArchive&ar); voidPrepareDrawChipDC(CDC*pDC); voidDraw(CDC*pDC); CStringCalculateName(CObList*pObList); voidSetReValue(CString&ReValue); voidSetReType(CString&ReType); CStringGetReValue(); CStringGetReType(); CRectm_Rect; CRectm_RectLP; CRectTrackerm_RectTracker; CResistor(); virtual~CResistor(); private: CStringm_ReType; CStringm_ReValue; }; ●电阻类的实现 CResistor: : CResistor() { //m_Rect=CRect(0,0,100,60); m_Rect=CRect(0,0,2000,-1000); m_RectLP=m_Rect; m_RectTracker.m_rect=m_Rect; m_RectTracker.m_nStyle=CRectTracker: : resizeOutside; SetName("R"); } CResistor: : ~CResistor() { } CStringCResistor: : GetReType() { returnm_ReType; } CStringCResistor: : GetReValue() { returnm_ReValue; } voidCResistor: : SetReType(CString&ReType) { m_ReType=ReType; } voidCResistor: : SetReValue(CString&ReValue) { m_ReValue=ReValue; } CStringCResistor: : CalculateName(CObList*pObList) //在绘制时系统给出的默认名称,这个名称是根据当前链表中 //对象情况而定的,具体功能同VB等开发工具中拖拉控件时产生 //名称的情况 { CObList*pNumSer=newCObList; intmax; charbuf[10]; GetNumInNameSer(pObList,pNumSer,&max); //分析数字序列 for(inti=1;i<=max;i++) { if(IsInList(i,pNumSer))//在基类中有定义 { } else { break; } } itoa(i,buf,10); //itoa(i,buf,10); //删除链表 //TRACE("pNumSer->Count()=%d\n",pNumSer->GetCount()); while(pNumSer->GetHeadPosition()) { delete(int*)pNumSer->RemoveHead(); } deletepNumSer; return"R"+CString(buf); } voidCResistor: : Draw(CDC*pDC) { /*根据元器件对象的颜色和线宽属性值绘制*/ CStringname=this->GetName(); intwidth=m_Rect.Width(); intheight=m_Rect.Height();//返回的是负值; CPennewpen(PS_SOLID,1,RGB(0,0,255)); CPen*pOldPen=pDC->SelectObject(&newpen); pDC->MoveTo(m_Rect.left,(int)(m_Rect.top+height*0.5)); pDC->LineTo((int)(m_Rect.left+width*0.3),(int)(m_Rect.top+height*0.5)); pDC->Rectangle((int)(m_Rect.left+width*0.3),(int)(m_Rect.top+height*0.25), (int)(m_Rect.left+width*0.7),(int)(m_Rect.top+height*0.75)); pDC->MoveTo((int)(m_Rect.left+width*0.7),(int)(m_Rect.top+height*0.5)); pDC->LineTo((int)(m_Rect.left+width),(int)(m_Rect.top+height*0.5)); //pDC->SetBkMode(TRANSPARENT); pDC->TextOut((int)(m_Rect.left+width*0.4),(int)(m_Rect.top+height*0.75),name); pDC->SelectObject(pOldPen); } voidCResistor: : PrepareDrawChipDC(CDC*pDC) { } voidCResistor: : Serialize(CArchive&ar) { CComponent: : Serialize(ar);//基类的序列化函数 //需要序列化m_RectLP if(ar.IsStoring()) { ar< //< } else { ar>>m_Rect>>m_RectLP>>m_RectTracker.m_nStyle>>m_ReType>>m_ReValue; //>>m_RectTracker.m_rect } } CResistor: : CResistor(CPoint*pt) { /*由于需要把新生成的元器件对象的m_Rect左上角坐标设置为*/ /*鼠标点按处的坐标转换成逻辑坐标后的值,并且初始化m_Rect的右下角坐标*/ /*所以将这一系列的初始化操作加到了CResistor(CPoint*pt)构造函数中*/ m_Rect.left=pt->x; m_Rect.top=pt->y; //m_Rect.right=m_Rect.left+100; //m_Rect.bottom=m_Rect.top+60; m_Rect.right=m_Rect.left+2000; m_Rect.bottom=m_Rect.top-1000; m_RectLP=m_Rect; m_RectTracker.m_rect=m_Rect; m_RectTracker.m_nStyle=CRectTracker: : resizeOutside; } voidCResistor: : GetNumInNameSer(CObList*pObList,CObList*pNumSer,int*pMax) //取得链表中电阻名称是以R或r开头,后面为数字的名称中的数字序列 //其中pNumSer存放数字序列,pMax存放的是数字中的最大值 { *pMax=0; POSITIONpos=pObList->GetHeadPosition(); CObject*pObject; CResistor*pResistor; CStringstrName; CStringstrLastName; while(pos! =NULL) { pObject=pObList->GetAt(pos); if(pObject->IsKindOf(RUNTIME_CLASS(CResistor))) { pResistor=(CResistor*)pObject; strName=pResistor->GetName(); if((strName.GetAt(0)=='R')||(strName.GetAt(0)=='r')) //如果名称的第一个字母是R或r { strLastName=strName.Mid (1); //判断余下的字符是否数字 if(IsNum(strLastName)) //余下的字符全部都是数字 { inti; i=atoi(strLastName); int*p=newint(i); pNumSer->AddHead((CObject*)p); if(i>(*pMax)) { *pMax=i; } } else //余下的字符不全是数字 { //忽略不记 } } else //名称的第一个字母不是R或r { } } else { } pObList->GetNext(pos); } } CResistor: : CResistor(RESISTORResistor) { SetName(Resistor.m_strName); SetIsSelected(Resistor.m_IsSelected); m_Rect=CRect(1000,-1000,3000,-2000); m_RectLP=m_Rect; m_RectTracker.m_rect=m_Rect; m_RectTracker.m_nStyle=CRectTracker: : resizeOutside; } voidCResistor: : CopyReToStruRe(RESISTOR&Resistor) /*把对象的数据赋值给结构,在复制功能时用到*/ { lstrcpy(Resistor.m_strClassType,"Resistor");//字符串的复制 Resistor.m_IsSelected=this->GetIsSelected(); lstrcpy(Resistor.m_strName,this->GetName()); } 二、文档类函数 1、串行化函数 voidCDrawChip1Doc: : Serialize(CArchive&ar) { if(ar.IsStoring()) { //TODO: addstoringcodehere } else { //TODO: addloadingcodehere } m_ChipObList.Serialize(ar); } 2、销毁对象函数 voidCDrawChip1Doc: : DeleteContents() { while(m_ChipObList.GetHeadPosition()) { deletem_ChipObList.RemoveHead(); } //TODO: Addyourspecializedcodehereand/orcallthebaseclass CDocument: : DeleteContents(); } 三、视图类主要函数 1、绘图函数 voidCDrawChip1View: : OnDraw(CDC*pDC) { CDrawChip1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO: adddrawcodefornativedatahere POSITIONpos=pDoc->m_ChipObList.GetHeadPosition(); CObject*pObject; CResistor*pResistor; CComponent*pComponent; CBrushfillBrush(RGB(255,0,255)),*oldBrush; oldBrush=pDC->SelectObject(&fillBrush); while(pos! =NULL) { pObject=pDoc->m_ChipObList.GetAt(pos); pComponent=(CComponent*)pObject; if(pObject->IsKindOf(RUNTIME_CLASS(CResistor))) { pResistor=(CResistor*)pObject; pResistor->m_RectTracker.m_rect=pResistor->m_RectLP; pDC->LPtoDP(pResistor->m_RectTracker.m_rect); if(pResistor->GetIsSelected()) { pResistor->m_RectTracker.Draw(pDC);//画框 } //pResistor->Draw(pDC);//画电阻 } pComponent->Draw(pDC);//画电阻 pDoc->m_ChipObList.GetNext(pos); } pDC->SelectObject(oldBrush); } 3、初始化视图类函数 voidCDrawChip1View: : OnInitialUpdate() { CScrollView: : OnInitialUpdate(); CSizesizeTotal(30000,30000);//这里的值是逻辑坐标,30cm,30cm CSizesizePage(sizeTotal.cx/5,sizeTotal.cy/6); CSizesizeLine(sizeTotal.cx/50,sizeTotal.cy/50); //MM_HIMETRIC映射模式的y轴方向是向下减的 SetScrollSizes(MM_HIMETRIC,sizeTotal,sizePage,sizeLine); } 4、鼠标事件函数 voidCDrawChip1View: : OnLButtonDown(UINTnFlags,CPointpoint) //point参数代表光标的坐标位置(设备坐标) //nFlags鼠标键与键盘的组合标志,有MK_LBUTTON,MK_RBUTTON,MK_MBUTTON,MK_SHIF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 电子元器件 系统