1IntelVisualFortran窗口程序设计实例作者:汪华是一种高级的计算机编程语言,所有Fortran程序源码必须经过编译器的编译、链接,才能被翻译成计算机所能识别的机器码,从而完成源程序设定的任务。Fortran语言的编译器较多,PC中Windows平台上常见的有:FortranPowerStation4.0微软公司将Fortran90集成到DeveloperStudio开发环境中之后推出的Fortran编译器,真正实现了Fortran的可视化编程;DigitalVisualFortran微软公司和数据设备公司(DEC)联合开发的功能更强大的Fortran编译器;CompaqVisualFortran数据设备公司(DEC)和康柏公司(Compaq)合并后推出的Fortran编译器以及康柏公司并入惠普后推出的最新版本;IntelVisualFortran11.x惠普公司将Windows下的编译器转售给Intel公司后,由Intel公司开发的Fortran编译器,目前是最新版。SalfordFortran95由silverfrost公司开发的能用于基于Win32平台和.net平台的应用程序开发,支持完整的Fortran95语法和部分Fortran2003语法。其实,Fortran编译器还有很多,如LaheyFortran、AbsoftFortran和OpenWatcom等。从目前的使用情况来看,前四个编译器在Windows平台上最为常见。本文所有的程序都基于IntelVisualFortran11.x编译器。跟C++一样,Fortran语言本身没有提供图形界面输出方面的功能,所以为了用Fortran编写Windows图形接口程序,必须借助编译器提供的扩展功能。IntelVisualFortran编译器封装了几乎完整的Win32API和OpenGL函数,提供了良好、稳定的编程接口,所以,借助IntelVisualFortran编译器,Fortran既能完成UI设计,也能胜任图形编程,从这个意义上讲,C能做到的,Fortran也能做到。IntelVisualFortran中的项目类型1.ConsoleApplication是基于字符模式的应用程序,这类项目适于不需要图形输出的程序设计,优点是执行速度快。2.Library其中包括两种库文件工程:StaticLibraries静态库文件,是已编译的、独立于主程序的程序段,适合于大型项目中程序的结构组织和程序间函数或子程序的重复调用。但是,静态库文件会插入程序调用点,磁盘空间浪费较大;同时当静态库文件需要升级的时候,会带来工作效率的低下。为了解决这些问题,出现了动态链接库。Dynamic-linkLibrary动态链接库,很好地解决了静态库文件存在的问题,所以广泛使用在Windows程序设计中。3.QuickWinApplication多文档窗口应用程序。编译器封装了部分Win32API函数,使Fortran界面的开发变得更加容易。4.StandardGraphicsApplication单文档窗口应用程序,通常以全屏的形式出现,跟QuickWinApplication不同,StandardGraphicsApplication程序界面中并没有菜单栏和状态栏。5.WindowingApplication窗口界面应用程序。经过编译器封装,WindowingApplication应用程序能够调用完整的Win32API系统函数,所以WindowingApplication应用程序的弹性更大、更加复杂。这里使用QuickWinApplication多文档窗口应用程序实例1.画图2ModulePlotModUseIFQWinImplicitNoneInteger::lines=500!用多少线段来画函数曲线Real(8)::X_Start=-5.0!X轴最小范围Real(8)::X_End=15.0!X轴最大范围Real(8)::Y_Top=5.0!Y轴最大范围Real(8)::Y_Bottom=-15.0!Y轴最小范围Logical(2)::fInvert=.True.ContainsSubroutineDraw_Sub(func)Real(8),External::func!待绘图的函数Integer(4)::status!绘图函数的运行状态Integer(4)::color!颜色值Real(8)::step!循环增量Real(8)::x,y,newX,newYType(wxycoord)::wt!指上一次的窗口坐标位置CallClearScreen($GCLEARSCREEN)!清屏!设定窗口坐标系,第一个参数逻辑真表示Y轴正向朝上status=SetWindow(fInvert,X_Start,Y_Top,X_End,Y_Bottom)color=RGBToInteger(255,0,0)!将RGB转换成字节整数status=SetColorRGB(color)!设定画笔颜色为红色CallMoveTo_W(X_Start,0.0_8,wt)!画X轴status=LineTo_W(X_End,0.0_8)CallMoveTo_W(0.0_8,Y_Top,wt)!画Y轴status=LineTo_W(0.0_8,Y_Bottom)status=SetColorRGB(RGBToInteger(0,255,0))!设定画笔为蓝色step=(X_End-X_Start)/linesDox=X_Start,X_End-step,stepy=func(x)newX=x+stepnewY=func(newX)3CallMoveTo_W(x,y,wt)status=LineTo_W(newX,newY)EndDoEndSubroutineDraw_Sub!所要绘图的函数Real(8)Functionf1(x)Real(8),Intent(In)::xf1=sin(x)EndFunctionf1Real(8)Functionf2(x)Real(8),Intent(In)::xf2=cos(x)EndFunctionf2Real(8)Functionf3(x)Real(8),Intent(In)::xf3=(x+2)*(x-2)EndFunctionf3EndModulePlotModProgramEx_15!主程序UseIFQwinUsePlotModImplicitNoneInteger::TUnit=17,GUnit=10!单元号Logical::statusInteger::input=1Open(TUnit,File='User',Title=菜单命令窗口C)!打开菜单命令窗口status=DisplayCursor($GCURSORON)!打开光标显示Open(GUnit,File='User',Title=绘图窗口C)!打开绘图窗口status=DisplayCursor($GCURSOROFF)!关闭光标显示status=ClickMenuQQ(QWIN$TILE)!程序执行Windows菜单中的Tile命令,平铺窗口status=FocusQQ(TUnit)DoWhile(input0.and.input4)Write(TUnit,*)'1:Plotf(x)=sin(x)'Write(TUnit,*)'2:Plotf(x)=cos(x)'Write(TUnit,*)'3:Plotf(x)=(x+2)*(x-2)'Write(TUnit,*)'OthertoExit'Read(Tunit,*)inputstatus=SetActiveQQ(GUnit)!使绘图窗口成为活动窗口SelectCase(input)Case(1)CallDraw_Sub(f1)Case(2)CallDraw_Sub(f2)Case(3)CallDraw_Sub(f3)4EndSelectEndDoEndProgramEx_152.读取鼠标移动时的坐标programcatchmouseUSEIFQWINimplicitnoneinteger(kind=4)::results,state,x,y,eventtype(qwinfo)::winfoexternal::showlocationwinfo%type=QWIN$MAX!最大化子窗口results=SETWSIZEQQ(0,winfo)!鼠标移动时,调用ShowLocationevent=MOUSE$MOVEresults=RegisterMouseEvent(0,event,ShowLocation)!等待鼠标输入dowhile(.true.)results=WaitOnMouseEvent(MOUSE$MOVE,state,x,y)enddo!取消提示信息results=SETEXITQQ(QWIN$EXITPERSIST)endprogramcatchmouse5subroutineshowlocation(iunit,ievent,ikeystate,ixpos,iypos)USEIFQWINimplicitnoneinteger(kind=4)::iunit!鼠标所在的窗口的代号integer(kind=4)::ievent!鼠标事件integer(kind=4)::ikeystate!其它控制键的状态integer(kind=4)::ixpos,iypos!鼠标位置write(0,100)ixpos,iypos100format(当前鼠标位置:(X=,I4,Y=,I4,))endsubroutineshowlocation3.简单二次方程求解器moduleCONTROLSinteger,parameter::IDD_DIALOG1=101integer,parameter::IDC_EDIT1=1000!a值integer,parameter::IDC_EDIT2=1001!b值integer,parameter::IDC_EDIT3=1002!c值integer,parameter::IDC_STATIC1=1003!,=或integer,parameter::IDC_STATIC2=1004!解的第一部分integer,parameter::IDC_STATIC3=1005!解的第二部分integer,parameter::IDC_STATIC4=1006!实根还是虚根character(len=1)::text1character(len=4)::text2endmoduleCONTROLS!主程序6programmainUSEIFQWINimplicitnoneinteger(kind=4)::resultslogical(kind=4)::restype(qwinfo)::winfotype(windowconfig)::wcwinfo%type=QWIN$MAXres=GETWINDOWCONFIG(wc)!最大化子窗口results=SETWSIZEQQ(0,winfo)results=SETEXITQQ(QWIN$EXITPERSIST)dowhile(.true.)enddoendprogrammain!初始化界面尺寸和菜单LOGICAL(4)FUNCTIONINITIALSETTINGS()USEIFQWINimplicitnoneinteger(kind=4)::resultslogical(kind=4)::restype(qwinfo)::winfoexternal::Dialoginputwinfo%w=800winfo%h=600winfo%type=QWIN$SETresults=SetWSizeQQ(QWIN$FRAMEWINDOW,winfo)res=appendmenuqq(1