我正在尝试制作一个 Fortran 代码,显示一些适用于 Windows 环境的对话框。例如,我已经成功制作了一个简单的“确定/取消”对话框,如下所示。
PROGRAM test_dialog
!
implicit none
!
write(*,*) OKCancelDialog( "Continue?"//achar(0), "Test dialog"//achar(0) )
!
CONTAINS
!
FUNCTION OkCancelDialog( message, dlg_title ) RESULT( res )
!
use ifwin
!
implicit none
!
character( len = * ), intent( in ) :: message
character( len = * ), intent( in ) :: dlg_title
integer :: res
!
integer( SINT ) :: ret
!
ret = MessageBox( GetForegroundWindow(), message, dlg_title, MB_ICONQUESTION + MB_OKCANCEL )
!
res = 0
select case( ret )
case( IDOK )
res = 1
case( IDCANCEL )
res = 0
case default
res = 0
end select
!
END FUNCTION OkCancelDialog
!
END PROGRAM test_dialog
但是,我不知道如何通过从 Fortran 调用 Win32 API(或其他方式)来制作一个对话框来收集用户输入(例如,数字或文本),如下图所示。
有人对此有好主意吗?如果您分享一些智慧(例如示例代码),我们将不胜感激。
如果您指定正在使用的 Fortran 编译器,将会有所帮助,因为其中一些包括 Windows API 定义模块和其他有用的项目。英特尔 Visual Fortran 具有模块和大量示例,可作为 Intel Parallel Studio XE for Windows Samples Bundle 的一部分下载 - 请参阅其 compiler_f 子文件夹。对于纯 API 调用,Win32\Angle 示例包含一个它从中读取的对话框文本框,因此您可以研究它。这应该可以很好地翻译(除了模块名称)到其他编译器。请记住,WinAPI 调用都是 STDCALL(在 32 位上),因此请确保您使用的任何接口都指定了这一点。
Intel Fortran 还提供了一个对 Fortran 更友好的对话框库,可以处理很多你需要的东西。示例 Dialog\WHIZZY 说明了许多使用它的控件。
您的示例代码仅显示一个消息框,而不是一个对话框。对话框需要使用资源编辑器来定义对话框,然后编写代码来显示对话框窗口,等待输入,然后处理用户的选择。
*** v3.10 (2023):新的 FORTRAN 模块完全通过示例实现 ***
在 C 中,tinyfiledialogs 提供了许多模式跨平台对话框和弹出通知(图形和控制台模式)。我是作者。它包括一个如何从 fortran 调用此 C 代码的示例。
aTitle = "a Title" // char(0)
aMessage = "a Message" // char(0)
aDefaultInput = "an Input" // char(0)
cpointer = tinyfd_inputBox(aTitle, aMessage, c_loc(aDefaultInput) )
if ( c_associated(cpointer) ) then
call c_f_pointer(cpointer, fpointer) ! Convert C Pointer to Fortran pointer
string = fpointer(1:index(fpointer,c_null_char)-1) ! Remove NULL character at the end
write (*,'(A)') string
endif
谢谢。非常有用的例程套件。易于使用。