回 帖 发 新 帖 刷新版面

主题:喜欢Visual Fortran与API一起编吗?

一起结合的好处:
  (1)熟悉Fortran又没有大量时间学习其他高级语言或特别喜欢fortran不忍丢弃;
  (2)可以利用70-80年代大量的fortran源程序;
  (3)在同一平台下(Visual Studio)管理维护方便;
  (4)现代Fotran 封装了API,就象sdk一样直接可以调用api函数,十分方便。
可以参考的书:
  (1)windows程序设计,纯api,比Charles的书讲得更简介实用;
  (2)彭国伦的fotran编程序
望大家经常讨论,共同提高!

回复列表 (共6个回复)

沙发

一个用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

板凳


  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 楼

做过一些这方面的工作,觉得直接用 API 的 SDK 编程还是比较麻烦一点。

有一些 VC++ 的宏,Fortran 里也没有,调用某些 API 的时候,还得饶饶弯路。

而且 Visual Fortran 的导入库比较陈旧,一些新公布的 API 还不能直接调用。

希望能用公司开发 Fortran 的 API 封装库...呵呵...

4 楼


  十分赞同你的观点,但人们似乎在慢慢疏远Fortran,为什么这样说呢,一是原本Fortran只是科技工作者喜欢的语言,不免显得呆板;二是好不容易到了接近面向对象编程与VB、VC++等通用编程更靠近时,盛传的全面面向对象的Fortran2003等后续版本迟迟不出,现在铺天盖地是VB,其运算速度慢于VF是大家公认的;三是从Fortran编译系统多次易主可以看出其中存在困难,市场不旺。于是乎在我国,原来工科学生常选修的具有强大计算有时的Fortran慢慢退出了历史舞台,只有年纪稍大的人喜欢用,但他们中对于fortran的oop和继承、重载特性了解的不多,大家能看到的具有这些描述的是台湾鹏国伦的和美国的J.E.Akin的书了
  在现在的VF6.0里调用api与在C语言里很相似,不向MFC封装很深,这对于我们了解其运行机制大有好处,而且只要在公共模块里写上COMMCTL32.LIB就可以调用制作列表视图、工具栏的常用界面了。

5 楼

以前用Fortran调用win32api做简单的界面,总体来说,比较复杂,不过当有整体框架的时候,就会变得简单一些,即便是这样,要做一些工具栏等相关的一些命令响应,还是复杂......后来知道了TCL/TK,从那里才知道,原来界面原来可以这样简单,从此开始,就几乎丢弃了win32api编程,用TK就能够“堆出”自己想要的界面,虽然运行速度有点慢。

6 楼

我用FORTRAN时几乎不用API——用了就跨不了平台了。。。
且:用FORTRAN做图形界面个人认为本来就是一种低效的表现!
我还是那个原则:让合适的语言和开发环境做合适的事儿:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册