Viktor的Fortran手记之五 IFC可视化设计(二)

5 连接变量和对话框

对话框必须连接到变量上。变量的类型是

type(dialog)

并且定义在IFLOGM.F90模块中。(CFC是定义在DIALOGM模块中)具体的连接方式如下:

use iflogm
include 'resource.fd' !默认的资源文件头
type(dialog) dlg
logical retlog
retlog = DlgInit(IDD_WINDOW, dlg)

6 使用对话框的一般过程

  1. 建立TYPE(dialog)型变量,并调用DlgInitDlgInitWithResourceHandle函数连接对话框。
  2. DlgSet等手段,赋予控件初始值。
  3. 使用DlgSetSub函数,规定控件响应回调程序。
  4. 显示对话框。模态可用DlgModal,无模态情况下用DlgModeless函数调用,并在消息处理例程中增加DLGISDLGMESSAGE事件。
  5. DlgGet等手段取用控件值。
  6. DlgUninit释放对话框。(必要!)

7 Edit和Static

这些都是最普通的控件,使用时,没有必要附加属性指定,因为得以存取的,无非是字串(对应字串型)。DlgGet与DlgSet是重载函数。如果用逻辑型变量存取,修改的是Enabled属性。IFC Documentation给出了一个内部读写的例子,插在事件处理回调程序中:

!无关定义等略

character(256) text !按Viktor的习惯还是写character(len=256)好
logical retlog

select case (control_name)
    case (IDC_EDIT_CELSIUS)
        retlog = DlgGet(dlg, IDC_EDIT_CELSIUS, text) !将Edit内容装入text中
        read (text, *, iostat = retint) cel !所谓“内部读取”,其实是数据转化过程
        if (retint .eq. 0) then !成功,以免没有读到正确的值
            far = (cel - 0.0) * (212.0 - 32) / 100.0 + 32.0 !为什么不化简?
            write (text, *) far !内部输出。不用判断了。
            retlog = DlgSet(dlg, IDC_EDIT_FAR, trim(adjustl(text))) !左对齐好看
        end if
    !下略
end select case

Viktor的Fortran手记之四 IFC可视化设计(一)

呵呵……原来在日文版的浏览器下FCKEditor也会变日文版的……很好很强大……

下列内容根据Intel(R) Visual Fortran Compiler Documentation编译。

1 控件类型支持

除ActiveX外,Intel Visual Fortran Compiler(以下简称IFC)支持十五种控件:

  1. Button
  2. Check box
  3. Combo box
  4. Edit box
  5. Group box
  6. List box
  7. Picture
  8. Progress bar
  9. Radio button
  10. Scroll bar (horizonal)
  11. Scroll bar (vertical)
  12. Slider
  13. Spin control
  14. Static text
  15. Tab control

2 控件值的取用: DLGGET()

注意,该东西是个函数,返回逻辑型(.true.对应“成功”,.false.对应“成仁”)。需要什么,应该写成参数。写法是

逻辑值 = DlgGet(对话框变量, 控件ID, 存放值的变量, 需要的值的名称)

比如

retlog = DlgGet(dlg, IDC_SCROLLBAR_TEMPERATURE, slidepos, DLG_POSITION)

需要注意的是,读EDIT控件只能读字符串,存到字符串(一般可用txt之类的名字)中。需要数值时再用read读数值:

double precision :: tol

...

retlog = DlgGet(dlg, IDC_EDIT_TOL, text)
!因为Edit的默认属性就是框里的内容
read (text, *) tol

3 将H文件转化为FD文件

IFC提供DEFTOFD程序。是不是自动的,没试,不敢说。

4 主程序要求

必须

use iflogm

也必须包含.fd文件,如

include 'resource.fd'