好文档 - 专业文书写作范文服务资料分享网站

Intel Visual Fortran窗口程序设计 - 图文

天下 分享 时间: 加入收藏 我要投稿 点赞

中对话框的真实状态,可通过单击图5.9所示的“对话框编辑器”工具栏上的第一个按钮来查看。 图5.10 对话框布局 此时,我们已经完成了对话框的制作,为了保证所作工作的可靠性,请单击工具栏上的“保存”按钮完成资源文件的存盘。如果现在打开项目所在的文件夹,我们发现在原文件数目的基础上多出了三个文件如图5.11所示。 图5.11 资源文件 这三个文件中,第一个是我们最关心的。用记事本打开它,内容为: //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Resource1.rc // #define IDD_DIALOG1 101 #define IDC_EDIT1 1000 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif 乍一看,似乎根本看不懂。但是读者不要着急,我们首先来个大胆的猜想:对话框中出现了很多控件,程序又如何能识别呢?如果每个控件都有独一无二的名字,显然程序识别就没有困难。幸运的是,我们的想法非常真确!当我们在对话框中“构筑”一个个控件的同时,编译器已经为每个控件起好了名字,不仅如此,为了便于和程序代码的衔接,编译器同时给每个控件加以编号! 让我们先回到资源编辑器中。用鼠标左键单击编辑框控件,然后单击鼠标右键,在弹出的快捷菜单中选择“属性”,编译器界面中出现了如图5.12所示的控件属性对 - 36 - 话框。在对话框中,我们看到编辑框的ID属性值为IDC_EDIT1,如图5.12(左);如果此时单击对话框本身,则对话框的ID为IDD_DIALOG1,如图5.12(右)。 图5.12 资源属性对话框 回到图5.11所示的第一个文件,原来文件中的第5行和第6行的目的是将控件和特定的编号一一对应。如此一来,程序设计就变得方便、简单。 有读者可能问:对话框中还有两个按钮,怎么没有出现它们的名称和代号呢?原因是这两个按钮控件为常用控件,程序中只需要用控件名称就足够了。 ■ 最后,为对话框编写驱动程序。 为了在程序中控制对话框,首先在程序代码中包含语句“USE IFLOGM”,在这个模块中,编译器将对话框相关的派生变量和接口封装起来便于使用;其次,将已经创建好的对话框和派生自对话框类的变量联系起来,做法如下: integer( kind=4 ) :: results type( dialog )::datadlg retlog = DLGINIT(IDD_DIALOG1, datadlg) 通过以上代码,对话框IDD_DIALOG1和程序联系起来了。在随后的代码中,如果需要,将对话框的名称IDD_DIALOG1和派生自对话框类的变量datadlg按参数传递就可以了;最后,为了节约空间,用函数DLGUNINIT释放对话框所占内存。下面是对话框IDD_DIALOG1完整的驱动程序: #001 subroutine Datainput #002 USE IFWIN #003 USE IFLOGM #004 USE CONTROLS #005 implicit none #006 integer( kind=4 ) :: results #007 character( len=256 )::text #008 logical( kind=4 )::retlog - 37 - #009 type( dialog )::datadlg #010 #011 retlog = DLGINIT(IDD_DIALOG1, datadlg) #012 #013 results = DLGMODAL (datadlg) #014 if(results == IDOK) then #015 retlog = DLGGET(datadlg, IDC_EDIT1, text) #016 write(0,*) text #017 endif #018 call DLGUNINIT (datadlg) #019 end subroutine Datainput 程序中,第9行定义了一个对话框类变量;第11行用来初始化对话框,也就是将变量和对话框联系起来;第13行将对话框显示出来;第14~17行进行判断,如果用户按下“确定”按钮,则用函数DLGGET获取编辑框内输入的文本并保存在字符串变量“text”中;第18行程序释放对话框所占内存空间。 到目前为止,一切似乎很顺利。将上面的程序段加入之前的主程序,编译运行,编译器却出现了提示错误!原因是编译器并不知道IDD_DIALOG1和IDC_EDIT1究竟是谁。再次回到图5.11所示资源文件中的第一个文件,原来这个文件是Microsoft Visual C++自动产生,Fortran编译器并不能自动识别,所以,我们必须将其中的控件名称和其对应的代号翻译过来,让Fortran编译器在程序运行的时候能够自动识别。翻译后的代码如下: module CONTROLS integer, parameter :: IDD_DIALOG1 = 101 integer, parameter :: IDC_EDIT1 = 1000 end module CONTROLS 将上述代码段加入主程序,继续编译运行,终于成功了。注意:第一,如果控件比较少,则将上述模块和主程序放在一起,方便修改编译,如果控件较多,此时应将该模块单独放在一个文件中,方便修改;第二,在翻译形成该模块的时候,请借助于有列编辑功能的编辑器,如Uedit32等,这样可提高工作效率。 至此,第一个对话框程序完成了。为了有更加清晰的思路,下面给出这个例子的完整代码。 #001 ! Example 5-2 #002 module CONTROLS #003 integer, parameter :: IDD_DIALOG1 = 101 #004 integer, parameter :: IDC_EDIT1 = 1000 #005 end module CONTROLS #006 #007 program main #008 USE IFQWIN #009 implicit none #010 integer( kind=4 ) :: results #011 logical(kind=4)::res #012 type (qwinfo) :: winfo #013 type (windowconfig) :: wc #014 #015 winfo%type = QWIN$MAX #016 res = GETWINDOWCONFIG(wc) #017 ! 最大化子窗口 - 38 - #018 results = SETWSIZEQQ (0, winfo) #019 results = SETEXITQQ (QWIN$EXITPERSIST) #020 do while (.true.) #021 enddo #022 end #023 #024 LOGICAL(4) FUNCTION INITIALSETTINGS( ) #025 USE IFQWIN #026 implicit none #027 integer( kind=4 ) :: results #028 logical(kind=4)::res #029 type (qwinfo) :: winfo #030 external:: Datainput #031 #032 winfo%w = 400 #033 winfo%h = 400 #034 winfo%type = QWIN$SET #035 results = SetWSizeQQ( QWIN$FRAMEWINDOW, winfo ) #036 res = appendmenuqq(1, $MENUENABLED, '文件'C, NUL) #037 res = appendmenuqq(1, $MENUENABLED, '数据...'C,Datainput) #038 INITIALSETTINGS= .true. #039 return #040 END FUNCTION INITIALSETTINGS #041 #042 subroutine Datainput(checked) #043 USE IFWIN #044 USE IFLOGM #045 USE CONTROLS #046 implicit none #047 integer( kind=4 ) :: results #048 character( len=256 )::text #049 logical( kind=4 )::retlog,checked #050 type( DIALOG )::datadlg #051 #052 retlog = DLGINIT(IDD_DIALOG1, datadlg) #053 results = DLGMODAL (datadlg) #054 if(results == IDOK) then #055 retlog = DLGGET(datadlg, IDC_EDIT1, text) #056 write(0,*) text #057 endif #058 call DLGUNINIT (datadlg) #059 end subroutine Datainput 运行结果如图5.13所示。 图5.13 Example5-2程序运行界面 - 39 - 前面这个例子中,对话框中仅有一个编辑框控件。其实对Quickwin工程来说,所有的对话框及其控件的使用方法都是一样的,不同的仅仅是控件的相关参数。至于Intel编译器支持的其他控件的用法,这将是下一节的内容。 5-2 各种控件的用法 Fortran编译器支持的控件非常丰富,包括静态文本框,编辑框和按钮控件等。下面就不同控件的具体用法展开详细的讨论。 ■ 编辑框 程序中使用编辑框可以使用户方便地输入相关数据。在文本编辑框中,不管是用户输入的内容,还是程序返回编辑框中的内容,一律被视为字符串。如果程序想通过编辑框输入数据或相反的操作,则必须进行数据类型的转换,具体方法是内部文件法。 文本编辑框有两个常见的动作,一是用函数DLGDET将用户输入的数据提取出来,二是用函数DLGSET将计算所得结果返回编辑框内。下面是详细步骤: USE IFLOGM type ( dialog )::dlg logical( kind=4 ):: retlog character( len=* ):: text retlog = DLGSET ( dlg, IDC_EDITBOX1, text ) retlog = DLGGET ( dlg, IDC_EDITBOX1, text ) 为从编辑框中读出输入的数据,需要进行数据类型转换。首先将编辑框内的数据按照字符串读入字符串变量text,接着用内部文件将text内的字符串读入实型变量。代码如下: real( kind=8 ) :: x logical( kind=4 ) :: retlog character( len=256 ) ::text retlog = DLGGET ( dlg, IDC_EDITBOX1, text ) read (text, *) x 下面的代码是将整型数值返回文本编辑框的过程: integer( kind=4 ) :: j logical( kind=4 ) :: retlog character( len=256 ):: text write (text,'(i4)') j retlog = DLGSET (dlg, IDC_EDITBOX1, text) ■ 静态文本框 一般用来显示描述性的文字或者输出结果。如果在程序中仅仅用来显示描述性文字,则静态文本框的用法非常简单,只需将静态文本框的“Caption”属性值改为需要的文字即可;如果需要在程序中用静态文本框显示计算结果,则资源文件中必须赋予静态文本框独立的名称和代号,然后在代码中用函数DLGSET更改静态文本框的内容,方法同编辑框。 - 40 -

Intel Visual Fortran窗口程序设计 - 图文

中对话框的真实状态,可通过单击图5.9所示的“对话框编辑器”工具栏上的第一个按钮来查看。图5.10对话框布局此时,我们已经完成了对话框的制作,为了保证所作工作的可靠性,请单击工具栏上的“保存”按钮完成资源文件的存盘。如果现在打开项目所在的文件夹,我们发现在原文件数目的基础上多出了三个文件如图5.11所示。图5.11资源文件这三个文件中,第一个是我们最关心的。用记事本打开它,内
推荐度:
点击下载文档文档为doc格式
3hbyy7eayt5nd0e7mk29
领取福利

微信扫码领取福利

微信扫码分享