pe 排名 创东方:fortran绘图、界面功能简介之二

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 11:15:16
source:http://blog.sina.com.cn/s/blog_483ac0ab0100gq8t.html~type=v5_one&label=rela_nextarticle
对于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的模式,个人觉得(探讨)