对于fortran的程序界面方面,也简单做一个罗列:
1.混合编程:
用fortran做核心计算,然后利用VB、VC等做界面,这是大家认可的。具体的可以参考彭国伦、唐章宏等人写的书;
2.利用fortran的扩展功能
在上面的帖子里面已经给出例子,在QUICKWIN模式下可以利用原有的菜单,也可以自己订制菜单和对话框,如果程序仅仅需要一些简单的菜单和对话框的话,这个是不错的选择;唯一不足的就是缺少工具条的制作,当然如果调用API函数的话应该能够实现吧(探讨)。
3.利用API函数做界面
下面给出一个简单的例子,形成简单的菜单和模态对话框。从程序看,这个方法需要的代码比较多,相比较QUICKWIN工程中利用fortran的扩展功能而言,这个方法做界面就复杂一些。
- module hh
- integer hInst
- integer hDlg
- end module hh
- integer 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 dfwin
- use hh
- USE clipinc
- integer hInstance !定义句柄
- integer hPrevInstance !定义句柄
- integer nCmdShow
- integer lpszCmdLine
- !*****************************************************************
- 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
- !******************************************************************
- type (T_WNDCLASS) wc
- type (T_MSG) mesg
- integer hWnd,COLOR
- character*100 lpszClassName,lpszAppName,lpszMenuName
- COLOR=9 !这个用来改变窗口的背景颜色
- lpszCmdLine = lpszCmdLine
- nCmdShow = nCmdShow
- lpszClassName ="Generic"C
- lpszAppName ="窗口程序,非模态对话框"C
- lpszMenuName="menumenu"C
- if(hPrevInstance .eq. 0) then
- wc%lpszClassName = LOC(lpszClassName)
- wc%lpfnWndProc = LOC(MainWndProc)
- wc%style = IOR(CS_VREDRAW , CS_HREDRAW)
- wc%hInstance = hInstance
- wc%hIcon = LoadIcon( hInstance, "MYICON")
- wc%hCursor = LoadCursor( hInstance, "MYCURSOR" )
- wc%hbrBackground = ( COLOR_WINDOW+COLOR )
- wc%lpszMenuName = LOC(lpszMenuName)
- wc%cbClsExtra = 0
- wc%cbWndExtra = 0
- i1 = RegisterClass(wc)
- end if
- hWnd = CreateWindowEx( 0, lpszClassName, &
- lpszAppName, &
- INT(WS_OVERLAPPEDWINDOW), &
- CW_USEDEFAULT, &
- 0, &
- CW_USEDEFAULT, &
- 0, &
- NULL, &
- NULL, &
- hInstance, &
- NULL &
- )
- hInst=hInstance
- i = ShowWindow( hWnd, SW_SHOWNORMAL)
- do while( GetMessage (mesg, NULL, 0, 0))
- if(IsDialogMessage(hDlg,mesg)==0)then
- i = TranslateMessage( mesg )
- i = DispatchMessage( mesg )
- endif
- end do
- WinMain = mesg%wParam
- end
- !*********************************以下是窗口处理函数*************
- integer 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
- use user32
- use dfwin
- use hh
- USE clipinc
- !*****************************************************************
- interface
- logical function DialogFunc ( hdWnd, mesg, wParam, lParam )
- !DEC$ IF DEFINED(_X86_)
- !DEC$ ATTRIBUTES STDCALL, ALIAS : '_DialogFunc@16' :: DialogFunc
- !DEC$ ELSE
- !DEC$ ATTRIBUTES STDCALL, ALIAS : 'DialogFunc' :: DialogFunc
- !DEC$ ENDIF
- integer*4 hdWnd
- integer*4 mesg
- integer*4 wParam
- integer*4 lParam
- end function
- end interface
- !******************************************************************
- integer hWnd, mesg, wParam, lParam
- select case ( mesg )
- case(WM_COMMAND)
- select case(LOWORD(wParam))
- case(IDM_OPEN)
- hDlg=CreateDialog(hInst, LOC("AboutBox"C),hWnd,LOC(DialogFunc))
- case(IDM_DIALOG)
- call PostQuitMessage( 0 )
- end select
- case (WM_DESTROY)
- call PostQuitMessage( 0 )
- case default
- MainWndProc = DefWindowProc( hWnd, mesg, wParam, lParam )
- return
- end select
- end
- !**********************对话框窗口函数***********************
- logical function DialogFunc( hdWnd, mesg, wParam, lParam )
- !DEC$ IF DEFINED(_X86_)
- !DEC$ ATTRIBUTES STDCALL, ALIAS : '_DialogFunc@16' :: DialogFunc
- !DEC$ ELSE
- !DEC$ ATTRIBUTES STDCALL, ALIAS : 'DialogFunc' :: DialogFunc
- !DEC$ ENDIF
- use user32
- use dfwin
- USE clipinc
- use hh
- integer hdWnd, mesg, wParam, lParam
- integer*4 i
- logical logresult,F,T
- character*100 string
- F=10 !T的值为TRUE
- select case (mesg)
- case (WM_COMMAND)
- select case(LOWORD(wParam))
- case(IDOK)
- logresult=DestroyWindow(hdWnd)
- DialogFunc=T
- RETURN
- case(IDCANCEL)
- logresult=DestroyWindow(hdWnd)
- DialogFunc=T
- RETURN
- case(IDC_LIST1)
- if(HIWORD(wParam)==LBN_DBLCLK)THEN
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_GETCURSEL,0,0)
- write(string,"('你已经选择了第',I3,'项!')")i
- i=MessageBox(hdWnd,string,"提示框",MB_OK)
- ENDIF
- DialogFunc=T
- RETURN
- case(IDC_SELECT)
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_GETCURSEL,0,0)
- if(i==LB_ERR)THEN
- write(string,"('你没有作出选择!')")
- else
- write(string,"('你已经选择了第',I3,'项!')")i
- endif
- i=MessageBox(hdWnd,string,"提示框",MB_OK)
- DialogFunc=T
- RETURN
- case(IDC_EDITOK)
- i=GetDlgItemText(hdWnd,IDC_EDIT,string,100)
- i=MessageBox(hdWnd,string,"你输入的内容为:",MB_OK)
- DialogFunc=T
- RETURN
- end select
- case(WM_INITDIALOG)
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("计算机"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("物 理"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("数 学"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("语 文"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("英 语"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("历 史"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("地 理"C))
- i=SendDlgItemMessage(hdWnd,IDC_LIST1,LB_ADDSTRING,0,LOC("生 物"C))
- DialogFunc=T
- RETURN
- end select
- DialogFunc=F
- RETURN
- end
复制代码
4.用图形界面库XFT
对于习惯只用fortran编程,不会也没有时间学习VC, VB等进行界面变成的朋友,这里有一个十分好的用fortran编写界面的库XFT,其主页在http://www.xeffort.com/xeffort/home.htm ; 。该库封装了用于界面编程的windows API函数,包括XFTFile(文件处理), XFTGDI(图形设备接口), XFTWND(窗口), XFTReg(注册表), XFTMDI(多文档界面), XFTMenu(菜单), XFTCtrl(控制条), XFTApp(应用程序), XFTDialog(对话框)。所有的程序均为free的,源程序open,有详细的文档。(来自SIMWE)
大概看了一下这一部分,基本上还是API的模式,个人觉得(探讨)。
5.用FORTRAN95的Windows编程接口Winteracter
http://www.winteracter.com |