文章目录

  • 简介
  • 一、开发环境
  • 二、步骤
    • 2.1 建立QuickWin工程
    • 2.2 添加源代码和文件
    • 2.3 添加资源文件
    • 2.4 向 .rc 文件中添加资源
    • 2.5 设计对话框
    • 2.6 获取控件ID
    • 2.7 编写主程序和回调例程
    • 2.8 生成exe
  • 参考资料
  • 写在最后

简介

学习Fortran QuickWin应用程序开发,编写了一个带有用户界面的简单的气体物性计算软件,可以称为超级低配版NIST Refprop(功能上比Refprop简单很多:只有氮气一种气体;没有添加绘制曲线的功能)

下面主要介绍QuickWin部分的内容,有关计算的例程和模块由我的小伙伴编写,使用了理想气体状态方程、van der Waals方程和R-K方程,迭代算法采用最简单的Newton迭代法。

With my partner: (1105808579@qq.com)


一、开发环境

IDE: Microsoft Visual Studio 2019 Community
编译器: Intel Parallel Studio XE 2020
源代码格式:Fortran 90

二、步骤

2.1 建立QuickWin工程

在VS中创建新项目,语言为Fortran,选择QuickWin Application
(这里命名为Ex01.slnEx01.vfproj )

2.2 添加源代码和文件

在解决方案资源管理器的Source Files目录下添加源代码文件
Source1.f90

2.3 添加资源文件

在Resource Files目录下新建资源文件 Resource1.rc
步骤同上

2.4 向 .rc 文件中添加资源

双击打开 .RC 文件,右键“添加资源”,然后选择对话框组件(Dialog)


除对话框外,还可以向 .rc 文件中添加菜单Menu、版本信息Version、位图Bitmap等;
要在对话框组件中插入位图,就需要先向 .rc 文件添加bitmap资源。
添加并配置Version资源,即可设置最终exe的属性-详细信息。

2.5 设计对话框

添加Dialog组件后,进入对话框的编辑界面

Ctrl + Alt + X 打开工具箱,可以将工具箱中的控件直接拖动到对话框里面
F4 打开属性窗口


(上图仅为简单示例)

在这里添加对话框中的按钮、文本框、滚动条等控件,通过工具栏中的工具调整控件的大小、位置和对齐方式,通过属性窗口设置控件显示文本(Caption)、控件ID、边缘粗细、可视性、文本对齐方式等属性。

控件可大致分为两类,一类是有触发回调例程(Callback Subroutine)的,例如按钮、EDIT文本框,另一类则是不能触发回调例程的,如 Static Text 和 Picture Control.

2.6 获取控件ID

每一个控件都有一个唯一ID作为其身份标识,ID和控件是一一对应的。例如,添加的第一个 Static Text 类型控件的ID是IDC_STATIC1,对话框1的控件ID是IDD_DIALOG1。然而这种形式的控件ID无法在程序中被直接识别。因为在保存了 .rc 文件后,每一个ID也被赋予一个与其对应的代码,如本例中IDD_DIALOG1的代码为101,IDC_EDIT1的代码为1000. 在程序中引用控件需要通过控件代码,因此,保存 rc 文件之后,首先打开工程目录下的 resource.h 文件,这是系统生成的一个C++文件,里面包含着控件ID与控件身份标识代码的对应关系。

人为读取之后,用模块的形式写入f90源文件中
(后面需要访问控件的例程都必须包含此模块)

MODULE CONTROLSinteger,parameter::IDD_DIALOG1 = 101integer,parameter::IDD_EDIT1 = 1000integer,parameter::IDD_EDIT2 = 1001integer,parameter::IDD_EDIT3 = 1002
END MODULE CONTROLS

P.S. 本来应该用命令行将resource.h转化为Fortran能够识别的.fd文件然后直接将其包含在程序中,但多次尝试都无法实现,此时只能手动包含控件信息。

2.7 编写主程序和回调例程

这里附上氮气物性计算软件的源代码:

MODULE CONTROLS  !resource.h中的控件IDinteger, parameter :: IDD_DIALOG1 = 101integer, parameter :: IDD_DIALOG2 = 103integer, parameter :: IDC_EDIT1 = 1000integer, parameter :: IDC_EDIT2 = 1001integer, parameter :: IDC_EDIT3 = 1002integer, parameter :: IDC_STATIC1 = 1003integer, parameter :: IDC_STATIC2 = 1004integer, parameter :: IDC_STATIC3 = 1005integer, parameter :: IDC_STATIC4 = 1006
END MODULE CONTROLSMODULE NEWTON    !内核算法模块,包含方程IMPLICIT NONEREAL,PARAMETER::R=8.314REAL,PARAMETER::MM=0.028013 !氮气摩尔质量REAL,PARAMETER::A=0.1361,B=0.0385*0.001 !范德瓦尔方程正系数REAL,PARAMETER::AK=0.427480*R**2*126.2**2.5/3.39/(1E6),BK=0.08664*R*126.2/3.39/(1E6) !R-K方程正系数REAL::ML,VM,XCONTAINS    !范德瓦尔方程求解 REAL FUNCTION VANSOLVE(P,V,T)IMPLICIT NONEREAL::P,V,T,XML=P*V/(T*R/MM) !理想气体状态方程求解X=V/(ML/MM)VM=X-VANDER(P,V,T,X)/DVANDER(P,V,T,X)DO WHILE(ABS(X-VM)>1E-7)X=VMVM=X-VANDER(P,V,T,X)/DVANDER(P,V,T,X)END DOVANSOLVE=V/VM*MMEND FUNCTION VANSOLVEREAL FUNCTION VANDER(P,V,T,X) !范德瓦尔函数IMPLICIT NONEREAL P,V,T,XVANDER=P*X**3-(P*B+R*T)*X**2+A*X-A*BEND FUNCTION VANDERREAL FUNCTION DVANDER(P,V,T,X) !范德瓦尔导函数IMPLICIT NONEREAL::P,V,T,XDVANDER=3*P*X**2-2*(P*B+R*T)*X+AEND FUNCTION DVANDER!R-K方程求解REAL FUNCTION RKSOLVE(P,V,T)IMPLICIT NONEREAL::P,V,TML=P*V/(T*R/MM) !理想气体状态方程求解X=V/(ML/MM)VM=X-RK(P,V,T,X)/DRK(P,V,T,X)DO WHILE(ABS(X-VM)>1E-7)X=VMVM=X-RK(P,V,T,X)/DRK(P,V,T,X)END DORKSOLVE=V/VM*MMEND FUNCTION RKSOLVEREAL FUNCTION RK(P,V,T,X) !R-K函数IMPLICIT NONEREAL::P,V,T,XRK=P*X**3-R*T*X**2-(P*BK**2+BK*R*T-AK/(T**0.5))*X-AK*BK/(T**0.5) END FUNCTION RKREAL FUNCTION DRK(P,V,T,X) !R-K导函数IMPLICIT NONEREAL::P,V,T,XDRK=3*P*X**2-2*R*T*X-P*BK**2-BK*R*T+AK/(T**0.5)END FUNCTION DRK
END MODULE NEWTONPROGRAM MAINUSE IFQWIN !包含QuickWin和常用库implicit noneinteger(kind=4)::results !results保存调用函数之后的返回值logical(kind=4)::res !res保存调用函数之后返回的LOGICAL型变量type(qwinfo)::winfo    !qwinfo型变量winfo用以储存窗口信息type(windowconfig)::wc   !windowconfig型变量用以储存窗口设置信息winfo.type = QWIN$MAX    !最大化窗口  res = GETWINDOWCONFIG(wc)results = SETWSIZEQQ (0, winfo)results = SETEXITQQ (QWIN$EXITPERSIST)!维持程序运行do while (.true.)end do
END PROGRAM MAIN! 初始化界面尺寸和菜单
LOGICAL(4) FUNCTION INITIALSETTINGS( )USE IFQWINimplicit noneinteger( kind=4 ) :: resultslogical(kind=4)::restype (qwinfo) :: winfoexternal:: Dialoginput,InfoWindowwinfo.w = 520    !设置窗口宽度winfo.h = 420   !设置窗口高度winfo.x=650 !设置窗口左上角初始坐标winfo.y=250winfo.type = QWIN$SETresults = SetWSizeQQ(QWIN$FRAMEWINDOW, winfo)    !设置窗口大小res = appendmenuqq(1, $MENUENABLED, ' Start 'C,Dialoginput)   !设置菜单res = appendmenuqq(2, $MENUENABLED, ' Info...'C,InfoWindow) !设置Info窗口INITIALSETTINGS= .true.
END FUNCTION INITIALSETTINGS! 点击“开始”触发的回调子程序
subroutine Dialoginput(checked)USE IFWIN    !包含Win32 API例程USE IFLOGM    !包含对话框例程USE CONTROLS    !包含控件ID信息implicit noneinteger(kind=4)::resultslogical(kind=4)::retlog,checkedtype(dialog)::datadlg    !一级窗口为datadlgexternal:: dialogbasedApply    !声明外部例程! 调用dlgInit函数以初始化对话框retlog = DLGINIT(IDD_DIALOG1,datadlg)! 设置按钮“求解”的回调函数retlog = DlgSetSub(datadlg, IDOK, dialogbasedApply)    !IDOK为默认的确定按钮!IDCANCEL为默认的取消按钮! 激活对话框results = DLGMODAL (datadlg)! 释放占用资源call dlgUnInit(datadlg)
END subroutine Dialoginputsubroutine InfoWindow(checked)USE IFWIN   !包含Win32 API例程USE IFLOGM    !包含对话框例程USE CONTROLS    !包含控件ID信息implicit noneinteger(kind=4)::resultslogical(kind=4)::retlog,checkedtype(dialog)::dial   !一级窗口为datadlg! 调用dlgInit函数以初始化对话框retlog = DLGINIT(IDD_DIALOG2,dial)! 激活对话框results = DLGMODAL (dial)! 释放占用资源call dlgUnInit(dial)
END subroutine InfoWindow! 按钮“求解”触发的回调子程序
subroutine dialogbasedApply( dlg, id, callbacktype )!DEC$ ATTRIBUTES DEFAULT :: dialogbasedApplyUSE IFLOGMUSE CONTROLSUSE NEWTONimplicit nonetype(dialog) dlg   !二级子窗口为dlglogical*4 resultsinteger(kind=4)::id, callbacktype,ireal m1,m2,m3,prs,tmp,volcharacter(len=30)::str,str1,str2,str3! 提取编辑框中的数据results = DlgGet(dlg,IDC_EDIT1,str1)read(UNIT=str1,FMT=*,iostat=i)tmpresults = DlgGet(dlg,IDC_EDIT2,str2)read(UNIT=str2,FMT=*,iostat=i)prsresults = DlgGet(dlg,IDC_EDIT3,str3)read(UNIT=str3,FMT=*,iostat=i)volprs=prs*1e6    !MPa->Pa!调用内核算法函数求解质量m2=vansolve(prs,vol,tmp)m3=rksolve(prs,vol,tmp)m1=ML!用户非法输入if(m1<=0.OR.m2<=0.OR.m3<=0)thenm1=0m2=0m3=0end if!结果写入静态文本框    write(str,*)m1results = DlgSet(dlg,IDC_STATIC1,str)write(str,*)m2results = DlgSet(dlg,IDC_STATIC4,str)write(str,*)m3results = DlgSet(dlg,IDC_STATIC2,str)END subroutine dialogbasedApply

2.8 生成exe

程序界面如下:


参考资料

[1] 周振红,徐进军等. Intel Visual Fortran 应用程序开发. 黄河水利出版社,2006.

[2] 汪华. Intel Visual Fortran 窗口程序设计实例. http://blog.renren.com/blog/254997247/860686026

写在最后

本来是专业基础课的课程作业,只需要编程计算出结果就可以了,当时灵光一闪想到模仿Refprop写一个带有UI的应用程序,于是就做下来了,感觉还挺有趣的。

吐槽一下,原来宇宙最强IDE–VS也有不少bug,还有CSDN什么时候才能支持Fortran语言的代码块

基于 Fortran QuickWin 的物性计算应用程序开发示例相关推荐

  1. 相似度计算 java_Java基于余弦方法实现的计算相似度算法示例

    Java基于余弦方法实现的计算相似度算法示例 引导语:Java 编程语言的风格十分接近C.C++语言.Java是一个纯的面向对象的程序设计语言,以下是小编整理的Java基于余弦方法实现的`计算相似度算 ...

  2. 基于云应用的公众号后台程序开发-李朋伟-专题视频课程

    基于云应用的公众号后台程序开发-1748人已学习 课程介绍         微信公众号后台自带的功能不能满足你的需要,想要搭建自己的服务端?简单几步开发部署公众号后台服务程序.注册Bluemix 体验 ...

  3. python kivy显示图片_python基于Kivy写一个图形桌面时钟程序代码示例

    本篇文章小编给大家分享一下python基于Kivy写一个图形桌面时钟程序代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Kivy 是一个开源的 ...

  4. 一个微信小程序开发示例

    一个微信小程序开发示例(豆瓣电影) 新版本(不包含工作流)请移步至:https://github.com/zce/weapp-douban 当前仓库会暂缓更新,主要留下来给大家答疑 需要基础教程的朋友 ...

  5. 金仓数据库 Pro*C 迁移指南( 5. 程序开发示例)

    5. 程序开发示例 连接数据库 执行一条不返回结果的 SQL 语句 执行一条查询语句并获取结果 读写大字段数据 Oracle 动态方法 4 ANSI 动态方法 4 执行 PL/SQL 块 完整的编程示 ...

  6. 基于有Vue基础的微信小程序开发学习笔记

    微信小程序开发 文章目录 微信小程序开发 一.微信小程序介绍 二.小程序结构目录 1.小程序的文件结构 2.基本项目目录 三.配置文件详解 1.全局配置文件 2.页面配置文件 3.sitemap配置 ...

  7. matlab mbd 淘宝,完美起航-基于模型(MBD)的树莓派程序开发——设置树莓派自动连接wifi和使用指令连接Matlab/Simulink和树莓派(不使用树莓派连接向导连接)...

    前言--使用Matlab树莓派连接向导连接的问题 但是后面继续操作时,发现该向导没有提供已刷写软件后的树莓派连接方式,导致每次连接需要拔下内存卡插上电脑以跳过内存卡刷写那一步(如下,插上内存卡点nex ...

  8. 应用实战|微信小程序开发示例之在线商城

    "超能力"数据库-拿来即用,应用开发人员再也不用为撰写API而发愁.MemFire Cloud 为开发者提供了简单易用的云数据库(表编辑器.自动生成API.SQL编辑器.备份恢复. ...

  9. 应用实战|微信小程序开发示例之Super课表

    此示例提供了使用 MemFire Cloud 构建一个课表的小程序的步骤.小程序用到的MemFire Cloud的功能包括: 云数据库:存储小程序数据表的信息. 用户验证:小程序使用MemFire C ...

最新文章

  1. div+css内容需注意
  2. 腾讯的张小龙是一个什么样的人
  3. WEUI picker组件无法js动态改变选项
  4. str045漏洞提权linux,Linux运维知识之CVE-2016-5195 Dirtycow: Linux内核提权漏洞
  5. hessianphp java_hessian 在PHP中的使用
  6. android view滑动到顶部并固定在顶部
  7. “老鹰捉小鸡”小学数学题碾压成人智商,这样的题目有什么意义?
  8. swing中模态对话框(setModal(true))和显示对话框(setVisible(true))的编写顺序
  9. 文科生能学懂python吗_文科生也能学得懂的Python入门视频
  10. Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
  11. Qt4_写TCP客户/服务器应用程序
  12. t-sql 使用正则表达式_如何在T-SQL查询中使用可扩展表达式; 性能优势和实例
  13. 决策树-剪枝算法(二)
  14. Jquery第一章表格新增功能课后练习第二节2/2
  15. 图论及其应用 2012年 期末考试答案总结
  16. uniapp延迟执行_uniapp如何实现延迟加载
  17. 局部立体匹配算法介绍及代码实现
  18. photoshop标尺工具_如何在Photoshop中使用和掌握非常困难的钢笔工具
  19. 【STM32 .Net MF开发板学习-02】GPIO测试
  20. 第十五天 13-linux防火墙

热门文章

  1. java时间格式化与格式
  2. **.Eet Framework win7系统安装失败报 时间戳和日期不符**
  3. 最全面的常用Delphi第三方控件汇总—报表、图表、界面、数据库等
  4. 网络架构模式 B/S C/S
  5. 消防设施操作员考试真题、模拟练习题库(6)
  6. 小程序开发 和html的区别,h5和小程序有什么区别?
  7. 装系统时无法创建新的分区
  8. vue 鼠标拖动画矩形_vue中拖动元素效果实现,以及拖拽`缩放后的元素`效果实现...
  9. LaTex\TexStudio 数学矩阵
  10. 关于IPv6(超详细讲解)