1. 创建MFC应用,选择单文档,在应用程序类型中的应用程序类型选择单文档,在项目样式中选择MFC standard,在用户界面功能中的命令行中选择 使用菜单栏和工具栏。

这样选择界面更好看一点,下面给出截图:

  1. 在资源视图中选择Menu中的IDR_MAINFRAME,双击它就会出现一个菜单栏界面,在里面可以加一些按钮,加了按钮以后还需要为相应的按钮添加事件处理程序,即当运行这个以后,点击按钮,程序会自动的去调用相应的函数来实现你点击的按钮的功能。

  1. 注意添加事件处理程序的时候,类列表要选择文件名+View这个类,否则后面会出错;

  1. 在相应的事件处理程序(函数)中添加相应的代码:

  • OnStart(), OnStop(),  OnTimer函数代码:

void CLiMotionView::OnStart()
{// TODO: 在此添加命令处理程序代码SetTimer(1, 200, NULL);
}void CLiMotionView::OnStop()
{// TODO: 在此添加命令处理程序代码KillTimer(1);
}void CLiMotionView::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值fFai1 += 0.05;if (fFai1 > 2 * Pi)fFai1 -= 2 * Pi;Invalidate(TRUE);CView::OnTimer(nIDEvent);}
  1. 主要代码:OnDraw函数,图形的以及文字就是在这个函数中实现的,我猜测相当于一般C++程序中的main函数;

整体思想,如果op == 1 ,那么画曲柄滑块,如果op == 2,那么画铰链四杆机构,如果flag等于1,则介绍曲柄滑块的信息。op,flag的值在对应的消息映射函数去改变,具体在代码中实现;

注:字符串要用括号括起来,再在前面加一个_T,例如:

pDC->DrawText(_T("曲柄滑块机构是指用曲柄和滑块来实现转动和移动相互转换的平面连杆机构。,通过转动副联接曲柄和滑块的构件为连杆。"), rc, DT_WORDBREAK | DT_VCENTER | DT_CENTER);

int DrawText(const CString& str, LPRECF lpRect, UINT nFormat);

ipRect 参数是用来指定绘制时的参考矩形。 nFromat表示文本的格式。

  CString str;str.Format(_T("A"));pDC->TextOut(A.x - 4 * fR, A.y - 2 * fR, str);

上面这几句代码实现的作用是:将字符串中的内容保存到str中,然后再将str中的内容输出来;

  CPen* pDPen = new CPen;CPen newPen;pDPen->CreatePen(PS_INSIDEFRAME, 3, RGB(50, 100, 150));newPen.CreatePen(PS_SOLID, 5, m_color);pDC->SelectObject(pDPen);

CPen是一个类,实现画笔的功能,其成员函数CreatePen()是实现画笔的特性;第一个参数是线条类别,第二个参数是线条大小,第三个参数是画笔颜色; pDC是一个CDC指针,其成员函数SelectObject() 用来选择画笔给当前设备环境中,其参数为一个CPen指针;

pDC->Ellipse(A.x - fR, A.y - fR, A.x + fR, A.y + fR);

BOOL Ellipse(int x1, int y1, int x2, int y2)

画一个椭圆,x1, y1, x2, y2 表示椭圆外接矩形的位置;

 CRect rect;GetClientRect(&rect); //这一句一定需要,否则绘画不出图形来

该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)。这里应该注意一下:坐标包含两种:屏幕坐标与客户区坐标。

void CLiMotionView::OnDraw(CDC* pDC)
{CLiMotionDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码if (op == 1){float fTemp = (fh - fL1 * sin(fFai1)) / fL2;fFai2 = asin(fTemp);if (fTemp < 0)fFai2 += Pi;if (fFai2 > Pi / 2)    fFai2 -= Pi / 2;fs = fL1 * cos(fFai1) + fL2 * cos(fFai2);CRect rect;GetClientRect(&rect);float fCenterX = (rect.right - rect.left) / 2.0;float fCenterY = (rect.bottom - rect.top) / 2.0;float fR = 5;A.x = fCenterX - 100;A.y = fCenterY + 100;B.x = A.x + fL1 * cos(fFai1);B.y = A.y - fL1 * sin(fFai1);C.x = A.x + fs;C.y = A.y - fh;D.x = A.x + fs;D.y = A.y;Move_A.x = C.x - UnitX, Move_A.y = C.y - UnitY;Move_B.x = C.x + UnitX, Move_B.y = C.y - UnitY;Move_C.x = C.x + UnitX, Move_C.y = C.y + UnitY;Move_D.x = C.x - UnitX, Move_D.y = C.y + UnitY;UL.x = A.x - 100, UL.y = Move_B.y;UR.x = rect.right - 50, UR.y = Move_B.y;DL.x = UL.x, DL.y = Move_C.y;DR.x = UR.x, DR.y = Move_C.y;CPen* pDPen = new CPen;CPen newPen;pDPen->CreatePen(PS_INSIDEFRAME, 3, RGB(50, 100, 150));newPen.CreatePen(PS_SOLID, 5, m_color);pDC->SelectObject(pDPen);//画出移动副的接触顶面pDC->MoveTo(UL);pDC->LineTo(UR);//画出移动副的接触底面pDC->MoveTo(DL);pDC->LineTo(DR);//pDPen->CreatePen(PS_SOLID, 5, m_color);pDC->SelectObject(&newPen);//画出三个转动副的中心点pDC->MoveTo(A);pDC->LineTo(B);pDC->LineTo(C);//画移动副pDC->MoveTo(Move_A);pDC->LineTo(Move_B);pDC->LineTo(Move_C);pDC->LineTo(Move_D);pDC->LineTo(Move_A);//画出三个转动副pDC->Ellipse(A.x - fR, A.y - fR, A.x + fR, A.y + fR);pDC->Ellipse(B.x - fR, B.y - fR, B.x + fR, B.y + fR);pDC->Ellipse(C.x - fR, C.y - fR, C.x + fR, C.y + fR);CString str;str.Format(_T("A"));pDC->TextOut(A.x - 4 * fR, A.y - 2 * fR, str);str.Format(_T("B"));pDC->TextOut(B.x + fR, B.y, str);str.Format(_T("C"));pDC->TextOutW(C.x + 2 * fR, C.y - fR, str);str.Format(_T("D"));pDC->TextOut(C.x + UnitX + fR, C.y, str);//画机架:pDC->SelectObject(pDPen);POINT M, N, O, P;M.x = A.x - fR / 2, M.y = A.y + fR;N.x = A.x - 3 * fR, N.y = A.y + 4 * fR;O.x = A.x + fR / 2, O.y = A.y + fR;P.x = A.x + 3 * fR, P.y = A.y + 4 * fR;UL.x = N.x - UnitX, UL.y = N.y;UR.x = N.x + 1.2 * UnitX, UR.y = N.y;DL.x = UL.x, DL.y = UL.y + UnitY;DR.x = UR.x, DR.y = UR.y + UnitY;pDC->MoveTo(M);pDC->LineTo(N);pDC->MoveTo(O);pDC->LineTo(P);pDC->MoveTo(UL);pDC->LineTo(UR);pDC->LineTo(DR);pDC->LineTo(DL);pDC->LineTo(UL);}else if (op == 2){fL = sqrt(fL1 * fL1 + fL4 * fL4 - 2 * fL1 * fL4 * cos(fFai1 - fSita4));fFai = atan((fL4 * sin(fSita4) - fL1 * sin(fFai1)) / (fL4 * cos(fSita4) - fL1 * cos(fFai1)));fFai3 = acos((fL2 * fL2 - fL * fL - fL3 * fL3) / (2 * fL * fL3)) + fFai;//fFai2 = atan((fL * sin(fFai) + fL3 * sin(fFai3)) / (fL * cos(fFai) + fL3 * cos(fFai3)));float fTemp = ((fL * sin(fFai) + fL3 * sin(fFai3)) / (fL * cos(fFai) + fL3 * cos(fFai3)));fFai2 = atan(fTemp);if (fTemp < 0)fFai2 += Pi;CRect rect;GetClientRect(&rect);float fCenterX = (rect.right - rect.left) / 2.0;float fCenterY = (rect.bottom - rect.top) / 2.0;A.x = fCenterX - fL4 / 2.0;A.y = fCenterY + 100;B.x = A.x + fL1 * cos(fFai1);B.y = A.y + fL1 * sin(fFai1);C.x = B.x + fL2 * cos(fFai2);C.y = B.y - fL2 * sin(fFai2);D.x = fCenterX + fL4 / 2.0;D.y = fCenterY + 100;CPen* pRedPen = new CPen;pRedPen->CreatePen(PS_SOLID, 5, m_color);pDC->SelectObject(pRedPen);//先画杆长:pDC->MoveTo(A);pDC->LineTo(B);pDC->LineTo(C);pDC->LineTo(D);//pDC->LineTo(A); //AD杆可以不用画出来float fR = 5;//再画转动副pDC->Ellipse(A.x - fR, A.y - fR, A.x + fR, A.y + fR);pDC->Ellipse(B.x - fR, B.y - fR, B.x + fR, B.y + fR);pDC->Ellipse(C.x - fR, C.y - fR, C.x + fR, C.y + fR);pDC->Ellipse(D.x - fR, D.y - fR, D.x + fR, D.y + fR);CString str;str.Format(_T("A"));pDC->TextOut(A.x - 4 * fR, A.y - 2 * fR, str);str.Format(_T("B"));pDC->TextOut(B.x , B.y + 2*fR, str);str.Format(_T("C"));pDC->TextOutW(C.x + 2 * fR, C.y - fR, str);str.Format(_T("D"));pDC->TextOut(D.x + fR, D.y + 2*fR, str);//画支座A:CPen *pDPen = new CPen;pDPen->CreatePen(PS_SOLID, 3, RGB(150, 100, 0));pDC->SelectObject(pDPen);POINT M, N, O, P;M.x = A.x - fR / 2, M.y = A.y + fR;N.x = A.x - 3 * fR, N.y = A.y + 4 * fR;O.x = A.x + fR / 2, O.y = A.y + fR;P.x = A.x + 3 * fR, P.y = A.y + 4 * fR;UL.x = N.x - UnitX, UL.y = N.y;UR.x = N.x + 1.2 * UnitX, UR.y = N.y;DL.x = UL.x, DL.y = UL.y + UnitY;DR.x = UR.x, DR.y = UR.y + UnitY;pDC->MoveTo(M);pDC->LineTo(N);pDC->MoveTo(O);pDC->LineTo(P);pDC->MoveTo(UL);pDC->LineTo(UR);pDC->LineTo(DR);pDC->LineTo(DL);pDC->LineTo(UL);//画支座DM.x = D.x - fR / 2, M.y = D.y + fR;N.x = D.x - 3 * fR, N.y = A.y + 4 * fR;O.x = D.x + fR / 2, O.y = D.y + fR;P.x = D.x + 3 * fR, P.y = D.y + 4 * fR;UL.x = N.x - UnitX, UL.y = N.y;UR.x = N.x + 1.2 * UnitX, UR.y = N.y;DL.x = UL.x, DL.y = UL.y + UnitY;DR.x = UR.x, DR.y = UR.y + UnitY;pDC->MoveTo(M);pDC->LineTo(N);pDC->MoveTo(O);pDC->LineTo(P);pDC->MoveTo(UL);pDC->LineTo(UR);pDC->LineTo(DR);pDC->LineTo(DL);pDC->LineTo(UL);}else if (flag){// TODO: 在此添加命令处理程序代码CRect rect;GetClientRect(&rect); //这句必须要CRect rc(rect.left + 200, rect.top + 200, rect.right - 200, rect.bottom - 200);pDC->DrawText(_T("曲柄滑块机构是指用曲柄和滑块来实现转动和移动相互转换的平面连杆机构。,通过转动副联接曲柄和滑块的构件为连杆。曲柄滑块机构广泛应用于往复活塞式发动机、压缩机、冲床等的主机构中,把往复移动转换为不整周或整周的回转运动;压缩机、冲床以曲柄为主动件,把整周转动转换为往复移动。偏置曲柄滑块机构的滑块具有急回特性,锯床就是利用这一特性来达到锯条的慢进和空程急回的目的。曲柄滑块的运动特性常用曲柄转角与滑块行程s的关系曲线来表示。如果是对心曲柄滑块机构(如图1所示),没有急回特性,极位夹角为零。"), rc, DT_WORDBREAK | DT_VCENTER | DT_CENTER);double start = clock();while (flag){double stop = clock();if ((stop - start) / CLOCKS_PER_SEC > 5) break;}flag = 0;}
}
  • CcolorDialog 类为应用程序提供了“颜色”对话框,其成员函数DoModal若返回IDOK,则可以调用GetColor()函数,返回用户选择的颜色;

GetColor函数原型:COLORREF GetColor() const;

  • Invalidate(TRUE);

该函数会调用OnDraw()函数;


void CLiMotionView::OnColor()
{// TODO: 在此添加命令处理程序代码CColorDialog  dColor;if (dColor.DoModal() == IDOK)m_color = dColor.GetColor();
}void CLiMotionView::OnPrint()
{flag = 1;op = 0;Invalidate(TRUE);
}void CLiMotionView::On_CrankSilder()
{// TODO: 在此添加命令处理程序代码op = 1;//曲柄滑块的初始化数据fL1 = 150.0;fL2 = 400.0;fFai1 = Pi / 4;fFai2 = 0.0;fh = 200.0;Invalidate(TRUE);
}void CLiMotionView::On_HingedFourBar()
{// TODO: 在此添加命令处理程序代码op = 2;//铰链四杆的初始化数据fL = 0.0;fL1 = 150.0;fL2 = 300.0;fL3 = 250.0;fL4 = 280.0;fFai = 0.0;fFai1 = Pi / 4;fFai2 = 0.0;fFai3 = 0.0;fSita4 = 0.0;Invalidate(TRUE);
}
  1. 全局变量定义:

float fL, fL1, fL2, fL3, fL4;float fFai, fFai1, fFai2, fFai3, fSita4;POINT A, B, C, D; //分别表4个转动副的中心点;float  fh, fs;POINT Move_A, Move_B, Move_C, Move_D; //移动副POINT UL, UR; //移动副的接触顶面POINT DL, DR; //移动副的接触底面int flag = 0; //不为零就介绍曲柄滑块int op = 0; //为1画铰链四杆,为2画曲柄滑块COLORREF m_color;

定义位置在.h文件中,对应的位置如下图所示

  1. 具体实现功能展示:

MFC实现曲柄滑块以及铰链四杆机构的运动仿真相关推荐

  1. 基于MATLAB_GUI的发动机曲柄活塞铰链四杆机构优化设计与仿真

    目录 摘要 I Abstract II 第一章绪论 1 1.1 机构学的概念与发展 1 1.1.1机构学的概念与地位 1 1.1.2 机构学的发展与成果 1 1.1.3 机构学的未来 3 1.2 MA ...

  2. Matlab学习——曲柄滑块的运动仿真

    1.图解法 ①机构位置分析的图解法 选取适当的长度比例尺 μl=0.6:1{\mu _l} = 0.6:1 μl​=0.6:1 选取曲柄l1的铰链中心A 点的位置, 按主动杆 r=60mm{\rm{r ...

  3. 在moveit2中实现四连杆及曲柄滑块

    文章目录 四连杆机构 结构介绍 urdf文件 MoveIt设置 曲柄滑块机构 结构介绍 urdf文件 MoveIt设置 对于一些特殊的(比如说机械构件闭环的.存在被动关节的)运动模型,该如何用urdf ...

  4. adams 曲柄滑块机构,间隙运动影响分析

    新建两个仿真模型:上侧是曲柄滑块机构:下侧是有间隙的曲柄滑块机构,使用CONTACT添加接触力. 进行仿真分析 速度波动

  5. 利用matlab建立含间隙关节的曲柄滑块动力学分析

    好的. 建立含间隙关节的曲柄滑块动力学分析可以使用 Matlab 的机械设计工具箱 (Mechanical Toolbox) 进行.你需要了解曲柄滑块机构的几何特征和动力学模型,然后用 Matlab ...

  6. 机械设计——曲柄滑块

    机械设计--曲柄滑块 一.零件 1.主动杆 草图: 草图1:大圆直径20mm,两圆圆心之距60mm,连接线50mm,一边绘制小圆直径8mm. 草图2:在凸台面上无圆孔一端绘制小圆直径8mm. 特征: ...

  7. 跟我一起学Adams虚拟样机:(二) 动力学仿真基操,以曲柄滑块压力机为例

    这篇博文是Adams虚拟样机系列的第二篇.上篇内容 (一) 运动学仿真基操,以一个简单的曲柄摇杆机构为例 中,我们通过一个曲柄摇杆机构,学习了用Adams建立虚拟样机,进行运动学仿真,以及对仿真结果做 ...

  8. VS2015平面四杆机构运动仿真编程

    VS2015平面四杆机构运动仿真编程 一.软件运行界面 二. 编程步骤 1. 新建MFC应用程序,项目名取为"FourBar",在location中指定一个工作路径用于放置程序文件 ...

  9. 两个曲柄滑块机构组成简单机械系统

最新文章

  1. linux进程通信:pipe实现进程同步
  2. 索引文件核心头文件定义
  3. [存档]CxServer的项目周期管理
  4. opencv论坛_Opencv批量添加logo的解决方案
  5. 华为手机投屏电脑_华为手机如何投屏到电脑?这很实用
  6. android targetapi23,Android Studio 3.0+上的Kapt问题(TargetApi)
  7. vue 父循环怎么拿子循环中的值_Vue 父组件循环使用refs调用子组件方法出现undefined的问题...
  8. 10. Regular Expression Matching[H]正则表达式匹配
  9. Mybatis传递多个参数
  10. 试卷生成系统安装与卸载
  11. Drupal主题制作流程
  12. 已购买阿里云CDN流量包仍旧扣费的原因及解决方法
  13. 【多尺度密集递归融合网络:超分】
  14. C语言 命题公式真值表
  15. Linux 网络基础 C语言常用API 快速翻阅笔记 (字节序篇)
  16. 长沙医学院计算机科学与技术专业怎么样,长沙医学院有哪些专业及什么专业好...
  17. 读懂微信:从1.0到7.0版本,一个主流IM社交工具的进化史...
  18. SIGIR 2021 | FSCD-PreRank:面向效率和效果更加均衡的交互式粗排模型
  19. 高等数学考研笔记(八)
  20. SVN代码正确提交方法!

热门文章

  1. 高等数学学习笔记——第八十三讲——对弧长的曲线积分的概念与计算
  2. 用运算放大器组成仪表放大器-仪表放大器计算
  3. 每日思考第 67 期:如何致富,不靠运气
  4. 创意平板折叠桌-数学建模
  5. 计算机毕设Python+Vue在线答题系统(程序+LW+部署)
  6. 电脑怎么设置动态壁纸?关于Windows和Mac壁纸的设置方法
  7. android蓝牙源码分析
  8. php关于控制器和操作系统,ThinkPHP控制器学习(一)
  9. python暴力破解压缩包密码(python暴力破解zip压缩包)
  10. 【计算机网络】思科实验(7):网络地址转换之路由器静态NAT模拟