如何在 Fortran 中创建一个对话框来收集用户输入

问题描述 投票:0回答:3

我正在尝试制作一个 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(或其他方式)来制作一个对话框来收集用户输入(例如,数字或文本),如下图所示。

有人对此有好主意吗?如果您分享一些智慧(例如示例代码),我们将不胜感激。

windows winapi fortran
3个回答
3
投票

如果您指定正在使用的 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 说明了许多使用它的控件。

您的示例代码仅显示一个消息框,而不是一个对话框。对话框需要使用资源编辑器来定义对话框,然后编写代码来显示对话框窗口,等待输入,然后处理用户的选择。


1
投票

*** 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

-3
投票

谢谢。非常有用的例程套件。易于使用。

© www.soinside.com 2019 - 2024. All rights reserved.