主题:喜欢Visual Fortran与API一起编吗?
whgary
[专家分:60] 发布于 2009-03-28 18:02:00
一起结合的好处:
(1)熟悉Fortran又没有大量时间学习其他高级语言或特别喜欢fortran不忍丢弃;
(2)可以利用70-80年代大量的fortran源程序;
(3)在同一平台下(Visual Studio)管理维护方便;
(4)现代Fotran 封装了API,就象sdk一样直接可以调用api函数,十分方便。
可以参考的书:
(1)windows程序设计,纯api,比Charles的书讲得更简介实用;
(2)彭国伦的fotran编程序
望大家经常讨论,共同提高!
回复列表 (共6个回复)
沙发
whgary [专家分:60] 发布于 2009-03-29 10:07:00
一个用VF6.0开发win32对话框的例子,适合初学者.
(1)步骤:采用向导创建win32对话框框架
(2)在"资源"菜单下插入对话框资源,加入控件,如本列一个为圆半径静态框及编辑框,另一个为计算结果的圆面积静态框及编辑框;
(3)象Quickwin一样编写回调函数.以下为程序
! DiaExam1.f90
!
! FUNCTIONS:
! WinMain() - 应用入口(主程序)
! 显示主窗口,处理消息循环
! DiaExam1Sub() - 主对话框回调程序
! DiaExam1Apply()- 应用按钮回调程序
!
!****************************************************************************
!
! 函数: WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
!
! 用途: 应用主程序
!
! 注解: 变量名等
!
!****************************************************************************
integer*4 function WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'WinMain' :: WinMain
!DEC$ ENDIF
use user32
use kernel32
use dflogm
use DiaExam1Globals
implicit none
integer*4 hInstance
integer*4 hPrevInstance
integer*4 lpszCmdLine
integer*4 nCmdShow
include 'resource.fd'
external DiaExam1Sub
external DiaExam1Apply
! Variables
type (T_MSG) mesg
integer*4 ret
logical*4 lret
ghInstance = hInstance
ghModule = GetModuleHandle(NULL)
ghwndMain = NULL
lret = DlgInit(IDD_DIAEXAM1_DIALOG, gdlg)
if (lret == .FALSE.) goto 99999
lret = DlgSetSub(gdlg, IDD_DIAEXAM1_DIALOG, DiaExam1Sub)
lret = DlgSetSub(gdlg, IDM_APPLY, DiaExam1Apply)
lret = DlgModeless(gdlg, nCmdShow)
if (lret == .FALSE.) goto 99999
! Read and process messsages
do while( GetMessage (mesg, NULL, 0, 0) )
if ( DlgIsDlgMessage(mesg) .EQV. .FALSE. ) then
lret = TranslateMessage( mesg )
ret = DispatchMessage( mesg )
end if
end do
call DlgUninit(gdlg)
WinMain = mesg.wParam
return
99999 &
ret = MessageBox(ghwndMain, "Error initializing application DiaExam1"C, &
"Error"C, MB_OK)
WinMain = 0
end
!****************************************************************************
!
! 函数: DiaExam1Sub ( dlg, id, callbacktype )
!
! 用途: 初始化和终止对话框回调
!
! 注解:
!
!****************************************************************************
SUBROUTINE DiaExam1Sub( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: DiaExam1Sub
use user32
use dflogm
implicit none
type (dialog) dlg
integer id, callbacktype
!当用户按"Exit"键盘,缺省回调调用DLGEXIT,使得callbacktype==dlg_destroy。
! 我们调用PostQuitMessage 导致WinMain中的消息循环终止。
if (callbacktype == dlg_destroy) then
call PostQuitMessage(0)
endif
END SUBROUTINE DiaExam1Sub
!****************************************************************************
!
! 函数: DiaExam1Apply ( dlg, id, callbacktype )
!
! 用途: 应用按钮回调函数
!
! 注解:
!
!****************************************************************************
SUBROUTINE DiaExam1Apply( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: DiaExam1Apply
use dflogm
implicit none
type (dialog) dlg
integer id, callbacktype
if (callbacktype == dlg_clicked) then
CALL StartCalculate(dlg)
! TO DO; Add your APPLY logic here
板凳
whgary [专家分:60] 发布于 2009-03-29 10:08:00
endif
END SUBROUTINE DiaExam1Apply
!****************************************************************************
!
! 函数: StartCalculate ( dlg)
!
! 用途: 设置计算
!
! 注解:
! 自创时间:2008-10-03 晚22:46
!
!****************************************************************************
SUBROUTINE StartCalculate( dlg )
use dflogm
implicit none
include 'resource.fd'
type (dialog) dlg
integer hwnd,iret
logical lret
real*8 area,radius
character*256 text
lret = DlgSet(dlg,IDC_EDIT1,.true.,DLG_ENABLE)
lret = DlgSet(dlg,IDC_EDIT2,.true.,DLG_ENABLE)
!
lret = DlgGet(dlg,IDC_EDIT1,text)
read(text,*,iostat = iret) radius !将字符串转换成实数
if(iret==0) then
area = 3.1415926*radius**2
write(text,'(f11.5)') area !将数值写成字符串
lret = DlgSet(dlg,IDC_EDIT2,trim(adjustl(text)))
else
write(*,'("数据读入错误!")')
stop
endif
RETURN
END SUBROUTINE StartCalculate
!****************************************************************************
! 公共数据
!首先采用导向生成一个框架(轮廓),以后自己根据需要增减
!****************************************************************************
module DiaExam1Globals
use dflogm
implicit none
! Parameters
integer*4, parameter, public :: SIZEOFAPPNAME = 100
! Global data
integer ghInstance
integer ghModule
integer ghwndMain
type (dialog) gdlg
end module
!原形位于DiaExam1.fi中
!DEC$ FREEFORM
!/********************* Prototypes ***********************/
interface
integer*4 function MainWndProc ( hwnd, mesg, wParam, lParam )
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_MainWndProc@16' :: MainWndProc
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'MainWndProc' :: MainWndProc
!DEC$ ENDIF
integer*4 hwnd
integer*4 mesg
integer*4 wParam
integer*4 lParam
end function
end interface
!以下为采用开发平台创建控件时自动生成的代号
!MS$FREEFORM
! Microsoft Developer Studio generated include file.
! Used by DiaExam1.rc
!
integer, parameter :: IDD_DIAEXAM1_DIALOG = 101
integer, parameter :: IDC_STATIC1 = 1006
integer, parameter :: IDC_EDIT1 = 1007
integer, parameter :: IDC_STATIC2 = 1008
integer, parameter :: IDC_EDIT2 = 1009
integer, parameter :: IDM_EXIT = 30001
integer, parameter :: IDM_APPLY = 30002
3 楼
臭石头雪球 [专家分:23030] 发布于 2009-04-08 09:14:00
做过一些这方面的工作,觉得直接用 API 的 SDK 编程还是比较麻烦一点。
有一些 VC++ 的宏,Fortran 里也没有,调用某些 API 的时候,还得饶饶弯路。
而且 Visual Fortran 的导入库比较陈旧,一些新公布的 API 还不能直接调用。
希望能用公司开发 Fortran 的 API 封装库...呵呵...
4 楼
whgary [专家分:60] 发布于 2009-04-08 15:18:00
十分赞同你的观点,但人们似乎在慢慢疏远Fortran,为什么这样说呢,一是原本Fortran只是科技工作者喜欢的语言,不免显得呆板;二是好不容易到了接近面向对象编程与VB、VC++等通用编程更靠近时,盛传的全面面向对象的Fortran2003等后续版本迟迟不出,现在铺天盖地是VB,其运算速度慢于VF是大家公认的;三是从Fortran编译系统多次易主可以看出其中存在困难,市场不旺。于是乎在我国,原来工科学生常选修的具有强大计算有时的Fortran慢慢退出了历史舞台,只有年纪稍大的人喜欢用,但他们中对于fortran的oop和继承、重载特性了解的不多,大家能看到的具有这些描述的是台湾鹏国伦的和美国的J.E.Akin的书了
在现在的VF6.0里调用api与在C语言里很相似,不向MFC封装很深,这对于我们了解其运行机制大有好处,而且只要在公共模块里写上COMMCTL32.LIB就可以调用制作列表视图、工具栏的常用界面了。
5 楼
lmlxt [专家分:700] 发布于 2009-06-06 19:24:00
以前用Fortran调用win32api做简单的界面,总体来说,比较复杂,不过当有整体框架的时候,就会变得简单一些,即便是这样,要做一些工具栏等相关的一些命令响应,还是复杂......后来知道了TCL/TK,从那里才知道,原来界面原来可以这样简单,从此开始,就几乎丢弃了win32api编程,用TK就能够“堆出”自己想要的界面,虽然运行速度有点慢。
6 楼
cgl_lgs [专家分:21040] 发布于 2009-09-09 07:28:00
我用FORTRAN时几乎不用API——用了就跨不了平台了。。。
且:用FORTRAN做图形界面个人认为本来就是一种低效的表现!
我还是那个原则:让合适的语言和开发环境做合适的事儿:)
我来回复