VC++数字逻辑电子仿真器设计 第2页
DrawObject函数:
首先根据Status的状态,即辣个门,两个端结点。共8种来调用DrawObject函数
引入准备好的八张位图(辣个门,两个端)
CBitmap MyBitMap;MyBitMap.LoadBitmap (nID);
将引入的位图拷贝入窗体窗户区
BITMAP bmpInfo;
MyBitMap.GetBitmap (&bmpInfo);
pOldBitmap=dc.SelectObject (&MyBitMap);
ClientDC.BitBlt (point.x ,point.y,bmpInfo.bmWidth ,bmpInfo.bmHeight,&dc,0,0,SRCAND);
dc.SelectObject (pOldBitmap);
用全局变量bmWidth和bmHeight来保存元件的宽度和高度
bmWidth=bmpInfo.bmWidth ;
bmHeight=bmpInfo.bmHeight ;
CreateMyObject函数
函数声明为:CreateMyObject(Mytype type, MySubtype Subtype, CPoint point)
初始化元件
MyNode* pNode=new MyNode;
pNode->type =type;
pNode->Subtype =Subtype;
pNode->input1 =0;
pNode->input2 =0;
pNode->output1 =0;
pNode->output2 =0;
pNode->Orgpoint =point;
pNode->width =bmWidth;
pNode->height =bmHeight;
pNode->input1value =0;
pNode->input2value =0;
pNode->output1value =0;
pNode->inputs =0;
如果创建的元件为输入结点,则要创建并画输入结点前的序号,这里
采用一个全局数组CArray<CPoint,CPoint> numpoint来记录结点前序号。
if(Subtype==Input)
{
//当创建Input时加入点到numpoint数组中
numpoint.Add (CPoint(point.x-15,point.y));
pNode->number =numpoint.GetSize ();
//创建时重绘序号
redrawnum();
}
而redrawnum()函数就是将所有输入结点前的序号重绘。
最后将元件加入到全局链表CList<MyNode*,MyNode*> MyList中。
MyList.AddTail (pNode);
鼠标连接元件模块
鼠标连接元件模块分为三个过程模块:鼠标移动模块,鼠标按下模块,鼠标抬起模块。
鼠标移动模块其算法如图6图6
代码如下:
void CMyView::OnMouseMove(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default
//此时必然是非画图状态,所以status==NONE;
if(Status==NONE) {
//当前点在某个物件上吗? 并且 //当前点在该物件触点上吗?
if(IsPointInObject(point) && IsPointInPut(point))
{
//全局变量pNodeNow是在IsPointInObject()这个函数里面记录的
//circlepoint和put是在IsInInput1() IsInInput2() IsInOutput1()
//这三个函数中记录的
//判断此时触点时否己连接非常重要
if(IsPutLinked())
{
//如果此时触点己连接,则退出
return;
}
//此时鼠标移进触点
//当前是连接态吗?
if(IsLink)
{
//连接态画图
LinkStatusDraw(point);
}
//开启画圆圈态
IsDrawCircle=TRUE;
//画圆圈
DrawMyCircle();
}
else//此时鼠标移出触点
{
//如果此时已画圆圈,则要擦除圆圈
if(IsDrawCircle==TRUE)
{
EraserMyCircle();
//关闭画圆圈状态
IsDrawCircle=FALSE;
//重绘连接线
moveoutredrawline();//重绘圆圈所在的那个物件,因为擦除圆圈的时候可能擦除了部分物件
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
VC++数字逻辑电子仿真器设计 第2页下载如图片无法显示或论文不完整,请联系qq752018766