
VisualFortran高级编程技术.doc
11页Visual Fortran 高级编程技术 Microsof 公司推出了支持 32 位的 FORTRAN POWER STATION1.0 到FORTRAN POWER STATION4.0 编译器后将其卖给了 DEC 公司DEC 随即推出了DVF5.0(Digital Visual FORTRAN 5.0),其工作环境与 MFC5.0 完全一致,最近 DEC 又推出了 DVF6.0(Digital Visual FORTRAN 6.0,其工作环境与MFC6.0 完全一致FORTRAN 在 DOS 下的编程技术相信早以为大家熟悉有关 FORTRAN90 方面的书籍也不少见,因此这里不再赘述以下主要以最新的 DVF5.0 讲述有关FORTRAN 图形编程的方法1 DVF 概述2 QuickWin Application3 Win32 Application4 OpenGL1 DVF 概述1. 1 安装1) 在安装选项中,注意选择 /Samples,这里包含了 DVF 的丰富例子2) 要拷贝 /Msdn 子目录,这里包含了 API 及 OPENGL 函数的帮助3) 可以网上下载升级。
1.2 语言1) 书写格式● 不受列的限制,可自由书写● 注释在任何地方由'!'开始● 续行在行尾加'&'2) 动态数组● 优点:动态数组的维界在程序执行过程中随时可按需要变化,数据需要占多少内存,就可在程序中动态地分配给数组多少内存;如果该数组以后不再使用,又可释放该数组,把该数组占用的内存归还给系统另作他用这样可以节约使用内存,提高内存使用效率动态数组主程序与子程序● 语句:? 属性说明语句ALLOCATABLE? 分配语句ALLOCATE(数组名 1(形状描述),数组名 2(形状描述),…[STAT=变量 名])? 释放语句DEALLOCATE(动态数组名 1,动态数组名 2,…[STAT=变量名])● 例子程序 1REAL(8),ALLOCATABLE::X(:),Y(:),Z(:)INTEGER(4)::NODEREAD(*,*) NODEALLOCATE (X(1:NODE),Y(1:NODE),Z(1:NODE))DO I=1,NODEX(I)=1.0Y(I)=1.0Z(I)=IEND DODO I=1,NODEWRITE(*,*) X(I),Y(I),Z(I)END DODEALLOCATE(X,Y,Z)END3) 模块● 优点:模块是一种在主程序单元之外独立编写的程序单元。
模块程序单元内没有可执行语句,除了说明语句外,最多包含模块过程主要作用是供其他程序单元引用,即数据的共享与模块过程的复制包含了 COMMON 与 INCLUDE 的全部功能● 语句:a 模块的编写MODULE 模块名类型说明部分[CONTAINS][模块过程 1]…[模块过程 N]END MODULE [模块名]b 模块的引用USE 模块 1,模块 2,…,模块 n● 例子程序 2:! 模块***************************************MODULE MYDATAINTEGER NODE,NELEND MODULE MYDATA!*******************************************!主程序*************************************USE MYDATANODE=100NEL=90WRITE(*,*)"IN MAIN PROGRAM :"WRITE(*,*)"NODE=",NODEWRITE(*,*)"NEL=",NELCALL SUBPROGRAM()END!*******************************************!子程序*************************************SUBROUTINE SUBPROGRAM()USE MYDATAWRITE(*,*)"IN SUBPROGRAM :"WRITE(*,*)"NODE=",NODEWRITE(*,*)"NEL=",NELEND SUBROUTINE!*******************************************1.2 开发环境1) 建立新文件、新项目● "File" → "New" → "Files"文件类型:a 固定格式b 自由格式● "File" → "New" → "Projects"项目类型:a Win32 Console Application:基于命令行的程序(字符界面)。
b Standard Graphics Application:单窗口单任务绘图应用程序,易学易用c Quick Win Application多窗口单任务绘图应用程序,易学易用d Win32 Application多窗口多任务应用程序,有固定的程序结构,复杂难学2) 建立资源文件● "Insert" → "Resource"资源文件类型:a 加速键b 对话框c 图象d 菜单2 Quick Win Application2.1 画图1) 例子程序 3SUBROUTINE PLOT_JU()USE DFLIBTYPE (XYCOORD) POSOPEN(8,FILE='USER',TITLE='矩形')I=SETBKCOLOR(3)CALL CLEARSCREEN($GCLEARSCREEN)I=SETCOLORRGB(#FFFFFF)I=RECTANGLE($GFILLINTERIOR,100,100,300,300)END2) 注意点:● 必需包含 DFLIB 库● 子窗口用 OPEN(窗口号,FILE='USER') 打开● 用 QuickWin 编写的绘图程序不能被 Win32 Application 引用。
2.2 菜单1) 编辑菜单2) 菜单的应用例子程序 4LOGICAL(4) FUNCTION INITIALSETTINGS()USE DFLIBLOGICAL(4) RESULTEXTERNAL PLOT_TYPERESULT=APPENDMENU(1,$MENUENABLED,'画图(&P)'C,PLOT_TYPE)INITIALSETTINGS=.TRUE.END FUNCTION INITIALSETTINGS2.3 对话框1) 编辑对话框2) 对话框的应用例子程序 5SUBROUTINE PLOT_TYPE(L)USE DIALOGMIMPLICIT NONEINCLUDE 'RESOURCE.FD'LOGICAL RET,LTYPE(DIALOG)DLGEXTERNAL PLOTRET=DLGINIT(IDD_PLOT_TYPE,DLG)RET=DLGSET(DLG,IDC_PLOT_S1,'图形类型:')RET=DLGSET(DLG,IDC_PLOT_L1,2,DLG_NUMITEMS)RET=DLGSET(DLG,IDC_PLOT_L1,'矩形'C,1)RET=DLGSET(DLG,IDC_PLOT_L1,'圆'C,2)RET=DLGSETSUB(DLG,IDOK,PLOT)RET=DLGMODAL(DLG)CALL DLGUNINIT(DLG)RETURNEND SUBROUTINESUBROUTINE PLOT(DLG,CONTROL_NAME,CALLBACKTYPE )USE DFLOGMINCLUDE 'RESOURCE.FD'TYPE (DIALOG) DLGINTEGER CONTROL_NAME,CALLBACKTYPE,LOCAL_CALLBACKTYPEINTEGER VALUELOGICAL RETLOCAL_CALLBACKTYPE = CALLBACKTYPERET=DLGGET(DLG,IDC_PLOT_L1,VALUE,1)SELECT CASE (VALUE)CASE(1)CALL PLOT_JU()CASE(2)CALL PLOT_YUAN()CASE DEFAULTEND SELECTCALL DLGEXIT(DLG)END SUBROUTINE3 Win32 Application3.1 概念1) 窗口是 Windows 应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。
2) 事件驱动Windows 程序设计围绕事件或消息的产生驱动运行处理函数3) 消息Windows 应用程序通过发送和接收统一格式的消息与其他应用程序和 Windows系统进行信息交换4) 对象与句柄Windows 系统通过句柄标识不同的对象和同类对象中不同的实例3.2 程序结构1) WinMain 函数● WinMain 函数是应用程序的入口函数,其功能是完成一系列的定义和初始 化工作,并产生消息循环● 例子程序 62) 窗口函数● 定义了应用程序对接收到的不同消息的响应,是消息处理分支控制语句的 集合● 例子程序 73.3 菜单例子程序 83.4 对话框例子程序 9INTEGER*4 FUNCTION FILE_INPUT(HWND, MESSAGE, WPARAM, LPARAM)!DEC$ IF DEFINED(_X86_)!DEC$ ATTRIBUTES STDCALL, ALIAS : '_FILE_INPUT@16' ::FILE_INPUT!DEC$ ELSE!DEC$ ATTRIBUTES STDCALL, ALIAS : 'FILE_INPUT' ::FILE_INPUT!DEC$ ENDIFUSE DFWINAUSE MYDATAINTEGER*4 HWND, MESSAGE, WPARAM, LPARAM,HLOGICAL BRETCHARACTER*30 STRSELECT CASE (MESSAGE)CASE (WM_INITDIALOG)STR='对话框实例'H=GETDLGITEM(HWND,1201)I=SENDMESSAGE(H,CB_ADDSTRING ,0,LOC(STR(1:10)))RETURNCASE (WM_COMMAND)SELECT CASE (LOWORD(WPARAM))CASE (IDCANCEL)I = ENDDIALOG (HWND, 1)FILE_INPUT=TRUERETURNCASE (IDOK)I = ENDDIALOG (HWND, 1)FILE_INPUT=TRUERETURNEND SELECT END SELECTFILE_INPUT= FALSERETURNEND3.5 GDI 绘图例子程序 10SUBROUTINE PLOT(HDC)USE DFWINAUSE MYDATAUSE DFWININTEGER HDC,HFONTLOGICAL BRETID_PLOT=1IF (PLOT_TYPE==1) THENBRET= SELECTOBJECT(HDC, HPEN(1))BRET=ARC(HDC,300,200,700,600,300,200,300,200)BRET=SETTEXTCOLOR(HDC,RGB(0,0,0))BRET=SETBKCOLOR(HDC,RGB(255,255,255))H=65LINE_W=50CALL FONT(H,LINE_W,HFONT)BRET=SELECTOBJECT(HDC,HFONT)BRET=TEXTOUT(HDC,320,400,'GDI 画图例子 1',12)BRET=DELETEOBJECT(HFONT)ELSEBRET= SELECTOBJECT(HDC, HPEN(2))BRET=ARC(HDC,300,200,700,600,300,200,300,200)BRET=SETTEXTCOLOR(HD。
