首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Fortran中更改SHBrowseForFolder的初始目录

在Fortran中更改SHBrowseForFolder的初始目录可以通过以下步骤实现:

  1. 导入所需的Windows API函数和数据类型:
代码语言:txt
复制
use, intrinsic :: iso_c_binding
interface
    ! 定义Windows API函数和数据类型
    function SHBrowseForFolder(lpbi As type(c_ptr)) bind(C, name='SHBrowseForFolderA')
        import
        type(c_ptr), value :: lpbi
        type(c_ptr) :: SHBrowseForFolder
    end function SHBrowseForFolder

    function SHGetPathFromIDList(pidl As type(c_ptr), pszPath As type(c_ptr)) bind(C, name='SHGetPathFromIDListA')
        import
        type(c_ptr), value :: pidl
        type(c_ptr), value :: pszPath
        type(c_int) :: SHGetPathFromIDList
    end function SHGetPathFromIDList

    subroutine CoTaskMemFree(pv As type(c_ptr)) bind(C, name='CoTaskMemFree')
        import
        type(c_ptr), value :: pv
    end subroutine CoTaskMemFree

    type, bind(C) :: ITEMIDLIST
        sequence
        type(c_short) :: mkid.cb
        type(c_ushort) :: mkid.abID(:)
    end type ITEMIDLIST

    type, bind(C) :: BROWSEINFO
        type(c_ptr) :: hwndOwner
        type(c_ptr) :: pidlRoot
        type(c_ptr) :: pszDisplayName
        type(c_char) :: lpszTitle(*) ! 标题
        type(c_int) :: ulFlags
        type(c_ptr) :: lpfn
        type(c_long) :: lParam
        type(c_ptr) :: iImage
    end type BROWSEINFO

    type, bind(C) :: CoTaskMemAlloc
        sequence
        type(c_size_t) :: cb
    end type CoTaskMemAlloc
end interface
  1. 编写Fortran子程序来更改SHBrowseForFolder的初始目录:
代码语言:txt
复制
subroutine SetInitialFolder(initialFolder)
    character(len=*), intent(in) :: initialFolder
    type(BROWSEINFO) :: bi
    type(ITEMIDLIST), pointer :: pidl
    character(len=:), allocatable :: pszPath
    type(CoTaskMemAlloc) :: ctmAlloc

    ! 初始化BROWSEINFO结构体
    bi%hwndOwner = c_null_ptr
    bi%pidlRoot = c_null_ptr
    bi%pszDisplayName = c_null_ptr
    bi%lpszTitle = c_null_ptr
    bi%ulFlags = 0
    bi%lpfn = c_null_ptr
    bi%lParam = 0
    bi%iImage = c_null_ptr

    ! 设置初始目录
    if (len_trim(initialFolder) > 0) then
        ! 分配内存以存储初始目录路径
        ctmAlloc%cb = (len(initialFolder) + 1) * c_sizeof(c_char)
        pszPath = c_loc(ctmAlloc)

        ! 将初始目录路径复制到分配的内存中
        call c_f_pointer(pszPath, pszPathChar)
        pszPathChar = initialFolder // c_null_char

        ! 设置BROWSEINFO结构体的pidlRoot字段
        bi%pidlRoot = c_loc(pszPath)
    end if

    ! 调用SHBrowseForFolder函数
    pidl = SHBrowseForFolder(c_loc(bi))

    ! 获取所选文件夹的路径
    if (associated(pidl)) then
        pszPath = c_loc(ctmAlloc)
        call SHGetPathFromIDList(c_loc(pidl), pszPath)
        call c_f_pointer(pszPath, pszPathChar)
        print *, "选择的文件夹路径:", trim(pszPathChar)
    end if

    ! 释放内存
    if (associated(pidl)) then
        call CoTaskMemFree(c_loc(pidl))
    end if
    if (allocated(pszPath)) then
        call CoTaskMemFree(c_loc(pszPath))
    end if
end subroutine SetInitialFolder
  1. 在主程序中调用SetInitialFolder子程序并传递初始目录路径:
代码语言:txt
复制
program main
    call SetInitialFolder("C:\Path\To\Initial\Folder")
end program main

这样,当运行Fortran程序时,SHBrowseForFolder对话框将显示初始目录为"C:\Path\To\Initial\Folder"。请注意,为了使上述代码正常工作,您需要在Windows操作系统上编译和运行Fortran程序,并且需要将Windows API函数和数据类型正确导入到Fortran代码中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CMake 秘籍(五)

每个项目都必须处理依赖关系,而 CMake 使得在配置项目的系统上查找这些依赖关系变得相对容易。第三章,检测外部库和程序,展示了如何在系统上找到已安装的依赖项,并且到目前为止我们一直使用相同的模式。然而,如果依赖关系未得到满足,我们最多只能导致配置失败并告知用户失败的原因。但是,使用 CMake,我们可以组织项目,以便在系统上找不到依赖项时自动获取和构建它们。本章将介绍和分析ExternalProject.cmake和FetchContent.cmake标准模块以及它们在超级构建模式中的使用。前者允许我们在构建时间获取项目的依赖项,并且长期以来一直是 CMake 的一部分。后者模块是在 CMake 3.11 版本中添加的,允许我们在配置时间获取依赖项。通过超级构建模式,我们可以有效地利用 CMake 作为高级包管理器:在您的项目中,您将以相同的方式处理依赖项,无论它们是否已经在系统上可用,或者它们是否需要从头开始构建。接下来的五个示例将引导您了解该模式,并展示如何使用它来获取和构建几乎任何依赖项。

02

numpy库reshape用法详解

a:array_like 要重新形成的数组。 newshape:int或tuple的整数 新的形状应该与原始形状兼容。如果是整数,则结果将是该长度的1-D数组。一个形状维度可以是-1。在这种情况下,从数组的长度和其余维度推断该值。 order:{‘C’,’F’,’A’}可选 使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。’C’意味着使用C样索引顺序读取/写入元素,最后一个轴索引变化最快,回到第一个轴索引变化最慢。’F’意味着使用Fortran样索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。注意,’C’和’F’选项不考虑底层数组的内存布局,而只是参考索引的顺序。’A’意味着在Fortran类索引顺序中读/写元素,如果a 是Fortran 在内存中连续的,否则为C样顺序。

03

ADINA常见问题解答

Q:怎样改进ADINA-AUI 中实体的显示效果?  A:在某些情况下,ADINA-AUI 显示的实体在边界上不光滑,这仅仅是显示的问题,并不影响几何尺寸的精确度。为了改进显示的效果, 1 点击Modify Mesh Plot 。 2 点击Line Depiction 。 3 将ADINA-M Chord Angle 由默认的0.4改为0.1 并且点击OK。 4 点击Surface Depiction 。 5将ADINA-M Chord Angle 由默认的0.4改为0.1 并且点击OK。 6 点击OK,关闭Modify Mesh Plot 对话框。 Q:为什么AUI 的图形功能在我的计算机上不能正常的工作?  A:有些计算机的显卡在Open GL 图形系统中不能正常的工作。请切换到Windows GDI 图形系统,在Edit 菜单中,点击Graphics System ,然后选择Windows GDI 图形系统。 Q:当我从ADINA-AUI 打印文件时,为什么打印不出来任何结果?  A:注意只有Windows 版本才会发生这样的问题。 当使用Open GL 图形方式时,有的打印机会出现上述问题。为解决该问题,当打印的时候,选择Windows GDI 图形方式。从菜单Edit > Graphics System… 中选择Windows GDI 作为图形系统,然后开始打印。 注意打印结束后,可以将图形系统切换回Open GL 以便获得更快的图形效果。 Q:为什么安装了浮动License(Floating Industry或者Floating Educational)后,Adina无法启动? A:如果安装过程正确,而且电脑上的防火墙不阻止Adina读取服务器上的License,那么这样的问题一般是由于计算机使用了中文名。不论是Adina的服务器还是Adina客户端,都不允许使用中文计算机名。 Q:如何将壳单元厚度显示出来? A:在Display-->Geometry/Mesh Plot-->Modify打开的窗口中点击Element Depiction,在新打开的窗口中的Shell Element Attributes域中选择Top/Bottom(默认是Mid-Surface)。

01
领券