精华内容
下载资源
问答
  • Android N Settings模块与Android M Settings模块差异

    千次阅读 热门讨论 2016-11-03 21:16:15
    android N settings 模块与android M settings 模块的差异

    Android N Settings 与之前的Android版本Settings模块在UI上右较大的改变,最直观的差异在于Android N 设置界面增加了向右滑动的抽屉效果。

    先回想下android M设置的主界面时怎么显示和交互的?

    android M设置的主界面是定义在res/xml/dashboard_categories.xml这个文件中,其SettingsActivity.java继承与Activity,在其onCreate方法中,通过mIsShowingDashboard变量,控制加载不同的布局R.layout.settings_main_dashboard或者 R.layout.settings_main_prefsSettings的主界面或者二级三级菜单),mIsShowingDashboard Boolear类型的变量是直接判断当前要启动的Activity的类是不是Settings.class,因为Settings这个类才是Settings的入口类。若是加载Settings的主界面,则是加载R.layout.settings_main_dashboard布局,这个布局里面仅仅只是一个FrameLayoutViewContainer

    SettingsActivity.javabuildDashboardCategories()->loadCategoriesFromResource(R.xml.dashboard_categories, categories, this) ->updateTilesList()去解析这个布局文件,动态添加或删除一级菜单的item,然后将主界面加载到FrameLayoutViewContainer中,这样一级菜单就显示出来了。

    对于二级菜单,在设置模块中有一个Settings.java的类,该类中定义了许多直接继承与SettingsActivity的空实现Activity,如果细心点还会发现,这些空实现的ActivityAndroidMainifest.xml中都有<meta-data/>属性,这是为什么呢?原因很简单,上面说过,既然这些Activity都是继承与SettingsActivity,那么要启动这些Activity时必然会走SettingsActivityonCreate()方法,刚在还提到SettingsActivityonCreate()方法是需要加载一级菜单还是加载二级菜单,取决于mIsShowingDashboard变量,而现在要确定加载的是二级菜单的具体哪个菜单?则需要用到AndroidMainifest.xml中声明该Activity时定义的<meta-data/>属性。

     

    当然,并不是所有的设置项都是这样,例如若要在Settings中添加一个选项,跳转到其他应用中,那么也可以直接在dashboard_categories.xml中添加相应的item,直接用intent跳转过去也时可以的。

     

    那么,Android N中的设置主界面又时怎么显示和交互的呢?

    Android N 在代码架构上和Android M最大的区别是Android N设置代码分为了两部分,一部分是在packages/apps/Settings,另一部分是在frameworks/base/packages/SettingsLib

    Android N Settings增加了向右滑动的抽屉效果,即无论在一级二级还是三级菜单界面下,只要向右滑动就可以调出Settings的主界面(事实上是无论哪一级菜单,只要改级菜单继承了SettingsActivity,那么就可以向右滑动调出设置的主界面)。接下来分析Android N Settings的启动流程。

    先看设置的入口类,Settings.java,该类和之前一样,没什么变化,一样继承与SettingsActivity.java,内部也定义了很多空实现的内部类,空Activity继承与SettingsActivity。那么应该和android M一样,真正的入口还是在SettingsActivity中。直接看SettingsActivity类,发现SettingsActivity不再是继承与Activity类,而是继承与rameworks/base/packages/SettingsLib下面的SettingsDrawerActivity,看一下SettingsDrawerActivity是什么鬼??

    SettingsDrawerActivity从名字来看,好像和实现滑动效果有关,到该类一看究竟,发现它加载的布局时settings_with_drawer.xml,这个布局中用到android.support.v4.widget.DrawerLayoutDrawerLayout 布局就具有左右滑动的抽屉效果。在看settings_with_drawer.xml布局中有一个listView控件,猜想该控件就是用来显示抽屉布局中的设置的主界面(后面在分析)。

    继续看SettingsActivityonCreate方法,其加载布局的地方和之前没什么区别,可是却发现有区别的地方在从DashboardSummary.class中的获取要加载item的数据部分,DashboardSummary.javarebuildUI()中,调用了SettingsDrawerActivitygetDashboardCategories()获取数据。也就是说在设置中主界面上要显示那些选项也是rameworks/base/packages/SettingsLib中的SettingsDrawerActivitygetDashboardCategories()获取来的,而不是像Android M一样将布局定义在res/xml/dashboard_categories.xml,现在在Settings模块下面已经没有了dashboard_categories.xml文件,那么数据到底是怎么获取出来的呢?

    现在来分析SettingsDrawerActivity类,在SettingsDrawerActivityonCreate方法中,如上面提到,它加载的布局是settings_with_drawer.xml,它是外层是DrawerLayout,所以能左右滑动(可自行百度DrawerLayout用法),该布局中有listView,这个listView就是我们左右滑动看到的DrawerLayout的主界面,listViewAdapterSettingsDrawerAdapter的实例,SettingsDrawerAdapter继承于BaseAdapter,SettingsDrawerActivity中通过getDashboardCategories()   >TileUtils.getCategories(this, sTileCache),获取的数据,它将数据也是封装成DashboardCategory类型。

    再来看 TileUtils类的getCategories()是如何返回DashboardCategory对象的List?先看代码:

     

    getCategories()方法差不多可分为三步:

    1.先调用getTilesForAction() ->getTilesForInten()从AndroidMainifast.xml中声明的activity信息中解析,并将解析的数据以Tile类型数据结构封装。

    2,遍历存储所有Tile的集合,将通过tile.category属性,将其分类,并构建成category,并将category存储在对应的categoryMap中。

    3.构建categories,并且排序,排序是按照DashboardCategorypriority排序的。

    先看一下Title数据类型,它里面封装的每一个变量都是和AndroidMainifast.xml中声明Activity<meta-data/>标签一一对应的。

     

     

    Title  : 对应每个item显示的标题

    icon   :对应每个Item显示的图标

    summary  : 对应每个item显示的详细信息,summary

    intent  :item 对应的intent

    cetagory :item 属于哪一个catagory

    priority  : item 的位置有关,排序会用到

    extras  Optional additional data for use by subclasses of the activity,从启动它的类携带过来的信息

    meta-data The metaData from the activity that defines this tile,定义的meta-data

     

    通过这样的方法获取到了Settings主菜单和左后滑动抽屉效果需要显示的数据,然后将数据抛给SettingsDrawerAdapter,在它的getView方法中去创建对应的view,就将界面展示出来了。

    总结一下:到了Android N设置中没有主界面显示的布局文件,而是直接解析AndroidManifast.xml文件,从该文件中获得并处理要显示的信息。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • MFC中m_ofn参数详解

    千次阅读 2013-10-08 16:23:18
    如果OFN_ENABLETEMPLATE标记被设置,hInstance是一个指向通过lpTemplateName成员命名的对话框模板的模块。如果两者都没有被设置,这个成员被忽略。   如果OFN_EXPLORER标记被设置,系统使用Explorer风格的默认...
    lStructSize 
    
      指定这个结构的大小,以字节为单位。 
      Windows 95/98和Windows NT 4.0:特意为Windows 95/98或Windows NT 4.0,及带有WINVER和_WIN32_WINNT >= 0x0500编译时,为这个成员使用OPENFILENAME_SIZE_VERSION_400。
      Windows 2000及更高版本:这个参数使用sizeof (OPENFILENAME) 。
      hwndOwner 
      指向所有者对话框窗口的句柄。这个成员可以是任意有效窗口句柄,或如果对话框没有所有者它可以为NULL。 
      hInstance 
      如果在Flags成员中设置了OFN_ENABLETEMPLATEHANDLE标记,hInstance成员指向包含一个对话框模板的内存对象。如果OFN_ENABLETEMPLATE标记被设置,hInstance是一个指向通过lpTemplateName成员命名的对话框模板的模块。如果两者都没有被设置,这个成员被忽略。 
      如果OFN_EXPLORER标记被设置,系统使用Explorer风格的默认对话框的子窗口作为指定模板来建立一个对话框。如果OFN_EXPLORER标记没有被设置,系统使用模板建立一个旧风格的对话框。
      lpstrFilter 
      指向一对以空字符结束的过滤字符串的一个缓冲。缓冲中的最后一个字符串必须以两个NULL字符结束。 
      第一个字符串是过滤器描述的显示字符串(例如,“文本文件”),第二个字符指定过滤样式(例如,“*.TXT”)。要为一个显示字符串指定多个过滤样式,使用分号(“;”)分隔样式(例如,“*.TXT;*.DOC;*.BAK”)。一个样式字符串中可以包含有效的文件名字字符及星号(*)通配符。不能在样式字符串中包含空格。
      系统不能改变过滤器的次序。它按lpstrFilter指定的次序显示在文件类型组合框中。
      如果lpstrFilter是NULL,对话框不能显示任何过滤器。
      lpstrCustomFilter 
      指向一个静态缓冲,它包含了一对以空字符结束的过滤器字符串,这个字符串是为了保留用户选择的过滤样式。第一个字符串是描述定制过滤器的显示字符串,第二个字符串是被用户选择的过滤器样式。第一次你的应用程序建立对话框,你指定的第一个字符串可以是任何非空的字符串。当用户选择了一个文件时,对话框复制当前过滤样式到第二个字符串。保留过滤样式可以是在lpstrFilter缓冲中指定的样式之一,或是用户输入的过滤器样式。在下一次对话框被建立时系统使用这个字符串去初始化用户自定义的文件过滤器。如果nFilterIndex成员是0,对话框使用定制过滤器。 
      如果这个成员是NULL,对话框不能保留用户自定义过滤器样式。
      如果这个成员不是NULL,nMaxCustFilter成员的值必须指定以TCHARs为单位的lpstrCustomFilter缓冲的大小。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。
      nMaxCustFilter 
      指定特意为lpstrCustomFilter准备的以TCHARs为单位的缓冲大小。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。这缓冲应该最小在40个字符长。如果lpstrCustomFilter成员是NULL或是指向NULL的字符串,这个成员被忽略。 
      nFilterIndex 
      指定在文件类型控件中当前选择的过滤器的索引。缓冲指向被lpstrFilter包含的一对定义了的过滤器的字符串。过滤器的第一对字符串的索引值为1,第二对为2,等等。0索引指出是通过lpstrCustomFilter指定的定制过滤器。你可以为对话框指定一个索引作为最初的过滤器描述及过滤器样式。当用户选择了一个文件时,nFilterIndex返回当前显示的过滤器的索引。 
      如果nFilterIndex是0及lpstrCustomFilter是NULL,系统使用在lpstrFilter缓冲中的第一个过滤器。如果所有的三个成员都是0或NULL,系统不使用任何过滤器,在对话框的列表文件中不显示任何文件。
      lpstrFile 
      指向包含初始化文件名编辑控件使用的文件名的缓冲。如果不需要初始值,这个缓冲的第一个字符必须是NULL。当GetOpenFileName或GetSaveFileName函数返回成功时,这个缓冲包含驱动器,路径,文件名,及所选择的文件的扩展名。 
      如果OFN_ALLOWMULTISELECT标记被设置并且用户选择了多个文件,缓冲包含了当前目录下被选择文件的文件名。对于Explorer风格对话框,目录和文件名字符串是被NULL分开的,在文件名之后有一个额外的NULL。对于旧风格对话框,字符串是被空格分开的并且函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在长短文件名之间转换。如果用户只选择了一个文件,lpstrFile字符串在路径和文件名之间没有分隔。
      如果缓冲太小,函数返回FALSE并且CommDlgExtendedError函数返回FNERR_BUFFERTOOSMALL.。既然这样,lpstrFile缓冲的首先两个字节包含必需的大小(字节或字符)。
      nMaxFile 
      指定lpstrFile缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。这个缓冲必须足够存储路径和文件名字符串,包含结尾的null字符。如果缓冲太小,GetOpenFileName和GetSaveFileName函数返回假(FALSE)缓冲最小应该在256个字符长。 
      lpstrFileTitle 
      指向接收选择的文件的文件名和扩展名的缓冲(不带路径信息)。这个成员可以是NULL。 
      nMaxFileTitle 
      指定lpstrFileTitle缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字节的个数。如果lpstrFileTitle是NULL,这个成员被忽略。 
      lpstrInitialDir 
      指向以空字符结束的字符串,可以在这个字符串中指定初始目录。Pointer to a null terminated string that can specify the initial directory. 在不同的平台上,为选择初始目录有不同的运算法则。 
      Windows 2000:
      如果lpstrFile包含了一个路径,这个路径就是初始目录。 
      否则,lpstrInitialDir指定的为初始目录。 
      如果lpstrInitialDir为NULL,并且当前目录下包含有一些指定过滤器类型的文件,初始目录就是当前目录。 
      否则,如果应用程序在过去使用过打开哐另存为对话框,使用最近选择的路径作为初始目录。然而,如果一个应用程序长时间没有运行过,它保存的选择的路径将被丢弃。 
      否则,初始目录是当前用户的私人文件目录(即我的文档)。 
      否则,初始目录是桌面文件夹。 
      Windows 98:
      lpstrInitialDir指定初始目录。 
      如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是初始目录。 
      否则,如果当前目录包含了一些指定的过滤类型的文件,那么初始化目录是当前目录。 
      否则,初始目录是当前用户的私人文件目录(即我的文档)。 
      Windows和Windows NT/ 2000的早期版本:
      lpstrInitialDir指定初始目录。 
      如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是初始目录。 
      否则,初始目录是当前目录。 
      lpstrTitle 
      指向在对话框的标题栏中放置的字符串。如果这个成员是NULL,系统使用默认标题(另存为或打开) 
      Flags 
      位标记的设置,你可以使用来初始化对话框。当对话框返回时,它设置的这些标记指出用户的输入。这个成员可以是下列标记的组合。 标记 含意 
      OFN_ALLOWMULTISELECT 指定文件名列表框允许多选。如果同时你设置了OFN_EXPLORER标记,对话框使用Explorer风格用户界面;否则它使用旧风格用户界面。 
      如果用户选择了一个以上的文件,lpstrFile缓冲返回当前目录下所有被选择的文件的文件名。nFileOffset成员是到第一个文件名的偏移量(字节或字符),并且nFileExtension成员不被使用。对于Explorer风格对话框,目录和文件名是被NULL分隔的,在最后的文件名后带有额外的NULL。这个格式使Explorer风格的对话框能返回包含空格的长文件名。对于旧风格对话框,目录和文件字符串是被空格分隔的,函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在短文件名和长文件名之间转换。
      如果你为一个旧风格对话框指定了一个定制的模板,文件名列表框的定义必须包含LBS_EXTENDEDSEL值。
      OFN_CREATEPROMPT 如果用户指定了一个不存在的文件,这个标记使用对话框能提示用户是否新建这个文件。如果用户选择了新建这个文件,对话框关闭并且函数返回指定的名字;否则,对话框继续停留。如果你使用带有OFN_ALLOWMULTISELECT标记的这个标记,对话框允许用户去指定一个不存在的文件。 
      OFN_DONTADDTORECENT Windows 2000:防止系统为选择的文件增加快捷链接到最近使用文档中。要找回目录的位置,调用还有CSIDL_RECENT标记的SHGetSpecialFolderLocation函数。 
      OFN_ENABLEHOOK 激活在lpfnHook成员中指定的钩子函数。 
      OFN_ENABLEINCLUDENOTIFY Windows 2000:当用户打开一个文件夹时,引起对话框发送CDN_INCLUDEITEM通知消息到你的OFNHookProc程序。对话框为在最近打开的文件夹中的每一个项目发送一个通知。这些消息使你能够控制那些在对话框中显示的文件夹项目的列表。 
      OFN_ENABLESIZING Windows 2000,Windows 98:使Explorer风格的对话框可以使用鼠标或键盘调整大小。缺省时,Explorer风格的打开和另存为对话框允许被调整大小,不顾这个标记是否被设置。这标记仅在你提供了一个钩子程序或定制模板时是必需的。旧风格的对话框不允许调整大小。 
      OFN_ENABLETEMPLATE 指出lpTemplateName成员是指向对话框模板资源的名字,这个模板资源在能被hInstance成员识别的模块中。 
      如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用旧风格的对话框替代默认的对话框。
      OFN_ENABLETEMPLATEHANDLE 指出hInstance成员能识别的包含预载对话框模板的数据块。如果这个标记被指定的,系统忽略lpTemplateName。 
      如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格对话框替代默认对话框。
      OFN_EXPLORER 指出任何打开或另存为对话框使用新的Explorer风格的用户化模块。关于更多的信息,参见Explorer-Style Hook Procedures和Explorer-Style Custom Templates。 
      缺省下,打开和另存为对话框使用Explorer风格用户界面,不顾这个标记是否设置。这个标记仅在你提供了一个钩子程序或定制模板或设置了OFN_ALLOWMULTISELECT标记时是必需的。
      如果你想使用旧风格的界面,省略OFN_EXPLORER 标记,并且提供一个代替的旧风格模板或钩子程序。如果你想用旧风格但不需要一个定制模板或钩子程序,简单的提供一个钩子程序,让它返回FALSE。
      OFN_EXTENSIONDIFFERENT 指定用户输入的一个文件的扩展名与lpstrDefExt指定的扩展名不同。如果lpstrDefExt是NULL,函数不使用这个标记。 
      OFN_FILEMUSTEXIST 指定用户仅可以在文件名登录字段中输入已存在的文件的名字。如果这个标记被指定的并且用户输入了一个无效的名字,对话框程序显示一个等待消息框。如果这个标记被指定,OFN_PATHMUSTEXIST标记也被使用。 
      OFN_FORCESHOWHIDDEN Windows 2000:强制显示系统和隐藏属性的文件,从而压倒用户设置的显示或不显示隐藏文件。否则,带有系统和隐藏标记的文件不被显示。 
      OFN_HIDEREADONLY 隐藏只读复选框。 
      OFN_LONGNAMES 对于旧风格对话框,这个标记引起对话框使用长文件名。如果这个标记没有被指定,或如果OFN_ALLOWMULTISELECT标记也被设置,旧风格对话框为带有空格的文件名使用短文件名(8.3格式)。 
      Explorer风格对话框忽略这个标记,通常显示长文件名。
      OFN_NOCHANGEDIR 如果当搜索文件时用户改变了目录的时候,恢复当前目录到它的初始值。 
      OFN_NODEREFERENCELINKS 引导对话框为选择的快捷方式(.LNK)文件返回路径和文件名。如果这个值没有被指定,对话框返回这个快捷方式所引用文件的路径和文件名。 
      OFN_NOLONGNAMES 对于旧风格对话框,这个标识引起对话框去使用短文件名(8.3格式)。 
      Explorer风格对话框忽略这个标记,通常显示长文件名。
      OFN_NONETWORKBUTTON 隐藏和显示风格按钮。 
      OFN_NOREADONLYRETURN 指定返回的文件不带有只读复选框,不是在写保护的目录中。 
      OFN_NOTESTFILECREATE 指定文件不是在对话框关闭前建立的。如果应用程序保存文件到一个建立的非映象风格共享上,这个标记应该被指定的。当一个应用程序指定了这标记,库不能检查写保护,磁盘满,打开驱动器门或网络保护。应用程序使用这个标记必须小心执行文件操作,因为一旦文件被关闭,它不能重新打开。 
      OFN_NOVALIDATE 指定公共对话框允许在返回的文件名中有无效的字符。典型的,正在调用的程序使用一个钩子程序通过FILEOKSTRING消息检查文件名。如果在编辑控件中的文本框是空的或只包含了空格,那么文件和目录列表框是被更新的。如果编辑控件中的文本框包含了别的东西,那么nFileOffset和nFileExtension的设置值是通过分析文本产生的。没有默认的扩展名被添加到文本,也没有文本被复制到lpstrFileTitle指定的缓冲。 
      如果通过nFileOffset指定的值比0小,文件是无效的。否则,文件名是有效的。如果OFN_NOVALIDATE没有被指定,nFileExtension和nFileOffset可以被使用。
      OFN_OVERWRITEPROMPT 如果选择的文件已经存在,使用另存为对话框产生一个消息框。用户必须确认是否复盖这个文件。 
      OFN_PATHMUSTEXIST 指定用户仅能输入的路径和文件名。如果这个标记被使用并且用户在文件名输入字段中键入了一个用效的路径和文件名,对话框函数显示一个等待消息。 
      OFN_READONLY 当对话框建立时,显示被选择的只读复选框。这个标记指出当对话框被关闭时只读复选框的状态。 
      OFN_SHAREAWARE 指出如果调用OpenFile函数因为网络共享冲突而失败,这个错误被忽略并且对话框返回选择的文件名。 
      如果这个标记没有被设置,当用户选择的文件名发生网络共享冲突时,对话框发送通知到你的钩子程序。如果你设置了OFN_EXPLORER标记,对话框发送CDN_SHAREVIOLATION消息到钩子程序。如果你没有设置OFN_EXPLORER,对话框发送SHAREVISTRING注册的消息到钩子程序。
      OFN_SHOWHELP 使对话框显示帮助按钮。hwndOwner成员必须指定一个窗口,这个窗口作为接收对话框发送的HELPMSGSTRING注册的消息,当用户单击帮助按钮时对话框发送这个消息。 
      当用户单击帮助按钮时,一个Explorer风格的对话框发送CDN_HELP通知消息到你的钩子程序。
      nFileOffset 
      指定从路径开始到通过lpstrFile指定的文件名字符串基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。例如,如果lpstrFile指向下列的字符串,“c:\dir1\dir2\file.ext”,这个成员包含指出“file.ext”字符串偏移的位置值13。 
      如果用户选择了多于一个的文件,nFileOffset是到第一个文件名的偏移。
      nFileExtension 
      指定从路径开始到通过lpstrFile指定的文件名字符串中扩展名基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字节的个数。例如,如果lpstrFile指向下列的字符串,“c:\dir1\dir2\file.ext”,这个成员包含的值是18。如果用户没有输入一个扩展名并且lpstrDefExt是NULL,这个成员指定的偏移是结束字符NULL。如果用户在文件名中输入一个“.”作为最后的字符,这个成员是0。 
      lpstrDefExt 
      指向包含默认扩展名的缓冲。如果用户忘记输入扩展名,GetOpenFileName和GetSaveFileName附加这个扩展名到文件名中。这个字符串可以是任一长度,但但只有头三个字符被附加。字符串不应该包含一个句点(.)。如果这个成员是NULL并且用户忘记了输入一个扩展名,那么将没有扩展名被附加。 
      lCustData 
      指定应用程序定义的数据,这数据是能被lpfnHook成员识别的系统传到的钩子程序。当系统发送WM_INITDIALOG消息到程序,消息的lParam参数指向当对话框建立时指定的OPENFILENAME结构。钩子程序可以使用这个指针获得lCustData的值。 
      lpfnHook 
      指向一个钩子程序。除非Flags成员中包含OFN_ENABLEHOOK标记,要么这个成员将被忽略。 
      如果在Flags成员中OFN_EXPLORER标记没有被设置,lpfnHook指向一个OFNHookProcOldStyle钩子程序,这个程序有意的从对话框接收消息。钩子程序返回FALSE传递一个消息到默认的对话框程序或返回TRUE丢弃消息。
      如果OFN_EXPLORER被设置,lpfnHook指向一个OFNHookProc钩子程序。这个钩子程序接收从对话框发出的通知消息。这个钩子程序也接收你通过一个子对话框模板定义的附加控件的消息。钩子程序不有意接收默认对话框的标准控件的消息。
      lpTemplateName 
      指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,资源保存在能被hInstance成员识别的模块中。对于有限的对话框资源,这可以是通过MAKEINTRESOURCE返回的值。除非在Flags成员中设置了OFN_ENABLETEMPLATE标记,要么这个成员被忽略。 
      如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格的对话框来替代默认对话框。
      pvReserved 
      保留。 
      dwReserved 
      保留。 
      FlagsEx 
      Windows 2000:设置位标记,你可以使用来初始化对话框。这个成员可以是下列标记的组合。 标记 含意 

      OFN_EX_NOPLACESBAR 如果这个标记被设置,则位置栏被不显示。如果这个标记没有设置,则Explorer风格的对话框包含一般使用文件图标的位置栏,例如像收藏夹和桌面。

    转自:http://blog.csdn.net/hczhiyue/article/details/8056617

    展开全文
  • JSN-SR04T倒车雷达超声波测距模块

    千次阅读 2019-10-26 13:54:29
    JSN-SR0T4-2.0 超声波测距模块可提供 20cm-600cm 的非接触式距离感测功能,测距精度可达高到 2mm,采用工业级一体化超声波探头设计,防水型,性能稳定,兼容市场上所有的 MCU 工作。 基本原理 作为超声波测距模块...

    JSN-SR0T4-2.0 超声波测距模块可提供 20cm-600cm 的非接触式距离感测功能,测距精度可达高到 2mm,采用工业级一体化超声波探头设计,防水型,性能稳定,兼容市场上所有的 MCU 工作。
    实物图
    模块规格参数

    基本原理

    作为超声波测距模块,本模块与HC-SR04雷同,二者可相互作为参考。
    (JSN-SR04T和HC-SR04似乎是同一家公司的产品,其中,JSN-SR04T的模式一与HC-SR04的基本使用相兼容)

    超声波测距模块,原理自然而然就是超声波测距,通过计算超声波在空气中经过的路程来测量距离,具体原理为:
    超声波时序图
    对模块的Trig引脚发送一个持续时间不小于10us的高电平脉冲作为触发信号,当模块接收到触发信号后,模块内部向外界发出8个40kHz的超声波脉冲,同时Echo引脚由0置1。当超声波脉冲遇到被测障碍物并反射回测距模块时,Echo引脚电平由1置0,一次测距结束。通过计算Echo引脚高电平持续时间即可求得超声波传输时间,进而求解出所测距离。
    .
    .
    .

    代码思路

    代码思路有两种,一种是通过定时器的输入捕获来计算时间,另一种是通过外部中断结合定时器的开闭来计算时间,个人觉得第二种比较简单,故采用第二种。

    具体思路为:
    通过MPU不断控制Trig控制端发送触发信号,使得模块处于实时测距状态,定时器和外部中断开启,每当测距模块向外发送高频信号时,将触发Echo引脚的外部中断,外部中断中,通过控制定时器的开闭来测量反应时间,从而通过换算得到距离。
    .
    .
    .

    部分代码

    初始化函数

    简单对GPIO进行初始化

    //initialize the pin of jsn-sr04t
    void JSN_SR04T_Init(void)
    {
    	//定义GPIO初始化结构体
    	GPIO_InitTypeDef GPIO_InitStruct;
    	
    	//初始化相应IO口时钟
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    	
    	//初始化GPIO参数	引脚Trig,用于输出一个持续10us的高电平触发信号,触发超声波模块开始发送超声波
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;		//这里的推挽是针对输出的
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    	GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;	//速度是针对输出的
    	GPIO_Init(GPIOE, &GPIO_InitStruct);
    	
    	//初始化GPIO参数	引脚Echo,用于检测超声波的发射/接收状态
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;		//这里的上拉是针对输入来说的,下拉先复位,等待高电平
    	GPIO_Init(GPIOE, &GPIO_InitStruct);
    }
    

    .
    .

    触发函数

    根据模块工作原理进行简单的电平处理

    //let jsn-sr04t to let out a signal to begin to detecting
    void JSN_SR04T_Start(void)
    {
    	GPIO_SetBits(GPIOE,GPIO_Pin_0);		//置位
    	delay_us(10);						//持续10us的高电平
    	GPIO_ResetBits(GPIOE,GPIO_Pin_0);	//复位,实现一次触发超声波测距模块
    }
    

    .
    .

    外部中断响应函数

    用于对定时器的控制进而计算反应时间

    /*外部中断用于检测触发引脚Echo的状态:*/
    /*当模块Trig发出一次触发信号,模块将向外发送高频信号,同时Echo将被拉高;当模块接收到反射回来的高频信号,Echo将被拉低;*/
    /*当Echo被拉高进入外部中断函数,不断readBit判断Echo是否被拉低,从而得到TIM4的持续时间*/
    
    u8 exti_i = 0;					//用于表示求和次数
    float temp = 0;					//用于暂存Distance,以便求和
    float Distance;					//超声波测到的距离
    float sum = 0;					//用于累加Distance,以便求平均
    float Distance_error = 0.717;	//超声波测距模块的系统误差
    
    //中断响应函数
    void EXTI1_IRQHandler(void)
    {
    	delay_us(10);		//延时消抖
    	
    	if( EXTI_GetITStatus(EXTI_Line1) != RESET )
    	{
    		TIM_SetCounter(TIM4,0);								//重置计时器的值
    		TIM_Cmd(TIM4,ENABLE);								//使能定时器开始计数
    		while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1));		//定时器计数的同时,死循环等待低电平,即接收到反射超声波
    		TIM_Cmd(TIM4,DISABLE);								//失能定时器,定格计数值
    
    		//先换算成时间单位秒,然后乘以声速344得到路程,再除以2得到距离,最后转换成cm单位
    		//Distance = TIM_GetCounter(TIM4) * 0.0001f * (344.0f+5.0f*0.607f) * 0.5f + Distance_error;	//频率1Mhz,计数一次为0.001ms,TIM_GetCounter(TIM4)*(10^-6)*344m/s*0.5*10^2
    		//通常所指的常温是指20℃时的气温(344m/s),气温每升高1℃,声速就增加0.607m/s				//实际拿来计算的值为:得到的值再加上系统误差Distance_error
    		temp = TIM_GetCounter(TIM4) * 0.0001f * (344.0f+5.0f*0.607f) * 0.5f + Distance_error;		//频率1Mhz,计数一次为0.001ms,TIM_GetCounter(TIM4)*(10^-6)*344m/s*0.5*10^2	//这里之所以乘的是0.0001是因为单位换算m换成cm
    		sum += temp;
    		exti_i++;
    		
    		if(exti_i==10)//求和10次之后求平均
    		{
    			Distance = sum / 10.0f;
    			exti_i = 0;
    			sum = 0;
    		}
    
    		EXTI_ClearITPendingBit(EXTI_Line1);		//清除LINE0上的中断标志位
    	}
    }
    

    .
    .
    这样,main函数里只要反复触发反复向串口打印测得数据即可:
    main函数

    与HC-SR04模块的区别

    使用这个模块,一个原因是因为其一体化防水设计,将主控板和收发器件分离,使得模块能够在潮湿甚至多水的环境下正常工作。

    另外,HC-SR04测距范围为2cm-400cm,较适用于短距离的测距;
    而JSN-SR04T的测量范围为20cm-600cm,能够满足大空间的距离测量;

    但是,本模块的测量角度高达75°,测距时容易受周边环境的影响;
    而 HC-SR04的测量角度为15°,受周边环境的影响较小;
    如果要对管道内物体的距离进行测量,则要求模块的测量角度越小越好,否则容易影响模块的正常使用。

    展开全文
  • 如果OFN_ENABLETEMPLATE标记被设置,hInstance是一个指向通过lpTemplateName成员命名的对话框模板的模块。如果两者都没有被设置,这个成员被忽略。    如果OFN_EXPLORER标记被设置,系统使用Explorer风格的默认...

     

    lStructSize 
      指定这个结构的大小,以字节为单位。 
      Windows 95/98和Windows NT 4.0:特意为Windows 95/98或Windows NT 4.0,及带有WINVER和_WIN32_WINNT >= 0x0500编译时,为这个成员使用OPENFILENAME_SIZE_VERSION_400。
      Windows 2000及更高版本:这个参数使用sizeof (OPENFILENAME) 。
      hwndOwner 
      指向所有者对话框窗口的句柄。这个成员可以是任意有效窗口句柄,或如果对话框没有所有者它可以为NULL。 
      hInstance 
      如果在Flags成员中设置了OFN_ENABLETEMPLATEHANDLE标记,hInstance成员指向包含一个对话框模板的内存对象。如果OFN_ENABLETEMPLATE标记被设置,hInstance是一个指向通过lpTemplateName成员命名的对话框模板的模块。如果两者都没有被设置,这个成员被忽略。 
      如果OFN_EXPLORER标记被设置,系统使用Explorer风格的默认对话框的子窗口作为指定模板来建立一个对话框。如果OFN_EXPLORER标记没有被设置,系统使用模板建立一个旧风格的对话框。
      lpstrFilter 
      指向一对以空字符结束的过滤字符串的一个缓冲。缓冲中的最后一个字符串必须以两个NULL字符结束。 
      第一个字符串是过滤器描述的显示字符串(例如,“文本文件”),第二个字符指定过滤样式(例如,“*.TXT”)。要为一个显示字符串指定多个过滤样式,使用分号(“;”)分隔样式(例如,“*.TXT;*.DOC;*.BAK”)。一个样式字符串中可以包含有效的文件名字字符及星号(*)通配符。不能在样式字符串中包含空格。
      系统不能改变过滤器的次序。它按lpstrFilter指定的次序显示在文件类型组合框中。
      如果lpstrFilter是NULL,对话框不能显示任何过滤器。
      lpstrCustomFilter 
      指向一个静态缓冲,它包含了一对以空字符结束的过滤器字符串,这个字符串是为了保留用户选择的过滤样式。第一个字符串是描述定制过滤器的显示字符串,第二个字符串是被用户选择的过滤器样式。第一次你的应用程序建立对话框,你指定的第一个字符串可以是任何非空的字符串。当用户选择了一个文件时,对话框复制当前过滤样式到第二个字符串。保留过滤样式可以是在lpstrFilter缓冲中指定的样式之一,或是用户输入的过滤器样式。在下一次对话框被建立时系统使用这个字符串去初始化用户自定义的文件过滤器。如果nFilterIndex成员是0,对话框使用定制过滤器。
      如果这个成员是NULL,对话框不能保留用户自定义过滤器样式。
      如果这个成员不是NULL,nMaxCustFilter成员的值必须指定以TCHARs为单位的lpstrCustomFilter缓冲的大小。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。
      nMaxCustFilter 
      指定特意为lpstrCustomFilter准备的以TCHARs为单位的缓冲大小。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。这缓冲应该最小在40个字符长。如果lpstrCustomFilter成员是NULL或是指向NULL的字符串,这个成员被忽略。 
      nFilterIndex 
      指定在文件类型控件中当前选择的过滤器的索引。缓冲指向被lpstrFilter包含的一对定义了的过滤器的字符串。过滤器的第一对字符串的索引值为1,第二对为2,等等。0索引指出是通过lpstrCustomFilter指定的定制过滤器。你可以为对话框指定一个索引作为最初的过滤器描述及过滤器样式。当用户选择了一个文件时,nFilterIndex返回当前显示的过滤器的索引。 
      如果nFilterIndex是0及lpstrCustomFilter是NULL,系统使用在lpstrFilter缓冲中的第一个过滤器。如果所有的三个成员都是0或NULL,系统不使用任何过滤器,在对话框的列表文件中不显示任何文件。
      lpstrFile 
      指向包含初始化文件名编辑控件使用的文件名的缓冲。如果不需要初始值,这个缓冲的第一个字符必须是NULL。当GetOpenFileName或GetSaveFileName函数返回成功时,这个缓冲包含驱动器,路径,文件名,及所选择的文件的扩展名。 
      如果OFN_ALLOWMULTISELECT标记被设置并且用户选择了多个文件,缓冲包含了当前目录下被选择文件的文件名。对于Explorer风格对话框,目录和文件名字符串是被NULL分开的,在文件名之后有一个额外的NULL。对于旧风格对话框,字符串是被空格分开的并且函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在长短文件名之间转换。如果用户只选择了一个文件,lpstrFile字符串在路径和文件名之间没有分隔。
      如果缓冲太小,函数返回FALSE并且CommDlgExtendedError函数返回FNERR_BUFFERTOOSMALL.。既然这样,lpstrFile缓冲的首先两个字节包含必需的大小(字节或字符)。
      nMaxFile 
      指定lpstrFile缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。这个缓冲必须足够存储路径和文件名字符串,包含结尾的null字符。如果缓冲太小,GetOpenFileName和GetSaveFileName函数返回假(FALSE)缓冲最小应该在256个字符长。 
      lpstrFileTitle 
      指向接收选择的文件的文件名和扩展名的缓冲(不带路径信息)。这个成员可以是NULL。 
      nMaxFileTitle 
      指定lpstrFileTitle缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字节的个数。如果lpstrFileTitle是NULL,这个成员被忽略。 
      lpstrInitialDir 
      指向以空字符结束的字符串,可以在这个字符串中指定初始目录。Pointer to a null terminated string that can specify the initial directory. 在不同的平台上,为选择初始目录有不同的运算法则。 
      Windows 2000:
      如果lpstrFile包含了一个路径,这个路径就是初始目录。 
      否则,lpstrInitialDir指定的为初始目录。 
      如果lpstrInitialDir为NULL,并且当前目录下包含有一些指定过滤器类型的文件,初始目录就是当前目录。 
      否则,如果应用程序在过去使用过打开哐另存为对话框,使用最近选择的路径作为初始目录。然而,如果一个应用程序长时间没有运行过,它保存的选择的路径将被丢弃。 
      否则,初始目录是当前用户的私人文件目录(即我的文档)。 
      否则,初始目录是桌面文件夹。 
      Windows 98:
      lpstrInitialDir指定初始目录。 
      如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是初始目录。 
      否则,如果当前目录包含了一些指定的过滤类型的文件,那么初始化目录是当前目录。 
      否则,初始目录是当前用户的私人文件目录(即我的文档)。 
      Windows和Windows NT/ 2000的早期版本:
      lpstrInitialDir指定初始目录。 
      如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是初始目录。 
      否则,初始目录是当前目录。 
      lpstrTitle 
      指向在对话框的标题栏中放置的字符串。如果这个成员是NULL,系统使用默认标题(另存为或打开) 
      Flags 
      位标记的设置,你可以使用来初始化对话框。当对话框返回时,它设置的这些标记指出用户的输入。这个成员可以是下列标记的组合。 标记 含意 
      OFN_ALLOWMULTISELECT 指定文件名列表框允许多选。如果同时你设置了OFN_EXPLORER标记,对话框使用Explorer风格用户界面;否则它使用旧风格用户界面。 
      如果用户选择了一个以上的文件,lpstrFile缓冲返回当前目录下所有被选择的文件的文件名。nFileOffset成员是到第一个文件名的偏移量(字节或字符),并且nFileExtension成员不被使用。对于Explorer风格对话框,目录和文件名是被NULL分隔的,在最后的文件名后带有额外的NULL。这个格式使Explorer风格的对话框能返回包含空格的长文件名。对于旧风格对话框,目录和文件字符串是被空格分隔的,函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在短文件名和长文件名之间转换。
      如果你为一个旧风格对话框指定了一个定制的模板,文件名列表框的定义必须包含LBS_EXTENDEDSEL值。
      OFN_CREATEPROMPT 如果用户指定了一个不存在的文件,这个标记使用对话框能提示用户是否新建这个文件。如果用户选择了新建这个文件,对话框关闭并且函数返回指定的名字;否则,对话框继续停留。如果你使用带有OFN_ALLOWMULTISELECT标记的这个标记,对话框允许用户去指定一个不存在的文件。 
      OFN_DONTADDTORECENT Windows 2000:防止系统为选择的文件增加快捷链接到最近使用文档中。要找回目录的位置,调用还有CSIDL_RECENT标记的SHGetSpecialFolderLocation函数。 
      OFN_ENABLEHOOK 激活在lpfnHook成员中指定的钩子函数。 
      OFN_ENABLEINCLUDENOTIFY Windows 2000:当用户打开一个文件夹时,引起对话框发送CDN_INCLUDEITEM通知消息到你的OFNHookProc程序。对话框为在最近打开的文件夹中的每一个项目发送一个通知。这些消息使你能够控制那些在对话框中显示的文件夹项目的列表。 
      OFN_ENABLESIZING Windows 2000,Windows 98:使Explorer风格的对话框可以使用鼠标或键盘调整大小。缺省时,Explorer风格的打开和另存为对话框允许被调整大小,不顾这个标记是否被设置。这标记仅在你提供了一个钩子程序或定制模板时是必需的。旧风格的对话框不允许调整大小。 
      OFN_ENABLETEMPLATE 指出lpTemplateName成员是指向对话框模板资源的名字,这个模板资源在能被hInstance成员识别的模块中。 
      如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用旧风格的对话框替代默认的对话框。
      OFN_ENABLETEMPLATEHANDLE 指出hInstance成员能识别的包含预载对话框模板的数据块。如果这个标记被指定的,系统忽略lpTemplateName。 
      如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格对话框替代默认对话框。
      OFN_EXPLORER 指出任何打开或另存为对话框使用新的Explorer风格的用户化模块。关于更多的信息,参见Explorer-Style Hook Procedures和Explorer-Style Custom Templates。 
      缺省下,打开和另存为对话框使用Explorer风格用户界面,不顾这个标记是否设置。这个标记仅在你提供了一个钩子程序或定制模板或设置了OFN_ALLOWMULTISELECT标记时是必需的。
      如果你想使用旧风格的界面,省略OFN_EXPLORER 标记,并且提供一个代替的旧风格模板或钩子程序。如果你想用旧风格但不需要一个定制模板或钩子程序,简单的提供一个钩子程序,让它返回FALSE。
      OFN_EXTENSIONDIFFERENT 指定用户输入的一个文件的扩展名与lpstrDefExt指定的扩展名不同。如果lpstrDefExt是NULL,函数不使用这个标记。 
      OFN_FILEMUSTEXIST 指定用户仅可以在文件名登录字段中输入已存在的文件的名字。如果这个标记被指定的并且用户输入了一个无效的名字,对话框程序显示一个等待消息框。如果这个标记被指定,OFN_PATHMUSTEXIST标记也被使用。 
      OFN_FORCESHOWHIDDEN Windows 2000:强制显示系统和隐藏属性的文件,从而压倒用户设置的显示或不显示隐藏文件。否则,带有系统和隐藏标记的文件不被显示。 
      OFN_HIDEREADONLY 隐藏只读复选框。 
      OFN_LONGNAMES 对于旧风格对话框,这个标记引起对话框使用长文件名。如果这个标记没有被指定,或如果OFN_ALLOWMULTISELECT标记也被设置,旧风格对话框为带有空格的文件名使用短文件名(8.3格式)。 
      Explorer风格对话框忽略这个标记,通常显示长文件名。
      OFN_NOCHANGEDIR 如果当搜索文件时用户改变了目录的时候,恢复当前目录到它的初始值。 
      OFN_NODEREFERENCELINKS 引导对话框为选择的快捷方式(.LNK)文件返回路径和文件名。如果这个值没有被指定,对话框返回这个快捷方式所引用文件的路径和文件名。 
      OFN_NOLONGNAMES 对于旧风格对话框,这个标识引起对话框去使用短文件名(8.3格式)。 
      Explorer风格对话框忽略这个标记,通常显示长文件名。
      OFN_NONETWORKBUTTON 隐藏和显示风格按钮。 
      OFN_NOREADONLYRETURN 指定返回的文件不带有只读复选框,不是在写保护的目录中。 
      OFN_NOTESTFILECREATE 指定文件不是在对话框关闭前建立的。如果应用程序保存文件到一个建立的非映象风格共享上,这个标记应该被指定的。当一个应用程序指定了这标记,库不能检查写保护,磁盘满,打开驱动器门或网络保护。应用程序使用这个标记必须小心执行文件操作,因为一旦文件被关闭,它不能重新打开。 
      OFN_NOVALIDATE 指定公共对话框允许在返回的文件名中有无效的字符。典型的,正在调用的程序使用一个钩子程序通过FILEOKSTRING消息检查文件名。如果在编辑控件中的文本框是空的或只包含了空格,那么文件和目录列表框是被更新的。如果编辑控件中的文本框包含了别的东西,那么nFileOffset和nFileExtension的设置值是通过分析文本产生的。没有默认的扩展名被添加到文本,也没有文本被复制到lpstrFileTitle指定的缓冲。 
      如果通过nFileOffset指定的值比0小,文件是无效的。否则,文件名是有效的。如果OFN_NOVALIDATE没有被指定,nFileExtension和nFileOffset可以被使用。
      OFN_OVERWRITEPROMPT 如果选择的文件已经存在,使用另存为对话框产生一个消息框。用户必须确认是否复盖这个文件。 
      OFN_PATHMUSTEXIST 指定用户仅能输入的路径和文件名。如果这个标记被使用并且用户在文件名输入字段中键入了一个用效的路径和文件名,对话框函数显示一个等待消息。 
      OFN_READONLY 当对话框建立时,显示被选择的只读复选框。这个标记指出当对话框被关闭时只读复选框的状态。 
      OFN_SHAREAWARE 指出如果调用OpenFile函数因为网络共享冲突而失败,这个错误被忽略并且对话框返回选择的文件名。 
      如果这个标记没有被设置,当用户选择的文件名发生网络共享冲突时,对话框发送通知到你的钩子程序。如果你设置了OFN_EXPLORER标记,对话框发送CDN_SHAREVIOLATION消息到钩子程序。如果你没有设置OFN_EXPLORER,对话框发送SHAREVISTRING注册的消息到钩子程序。
      OFN_SHOWHELP 使对话框显示帮助按钮。hwndOwner成员必须指定一个窗口,这个窗口作为接收对话框发送的HELPMSGSTRING注册的消息,当用户单击帮助按钮时对话框发送这个消息。 
      当用户单击帮助按钮时,一个Explorer风格的对话框发送CDN_HELP通知消息到你的钩子程序。
      nFileOffset 
      指定从路径开始到通过lpstrFile指定的文件名字符串基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。例如,如果lpstrFile指向下列的字符串,“c:\dir1\dir2\file.ext”,这个成员包含指出“file.ext”字符串偏移的位置值13。 
      如果用户选择了多于一个的文件,nFileOffset是到第一个文件名的偏移。
      nFileExtension 
      指定从路径开始到通过lpstrFile指定的文件名字符串中扩展名基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字节的个数。例如,如果lpstrFile指向下列的字符串,“c:\dir1\dir2\file.ext”,这个成员包含的值是18。如果用户没有输入一个扩展名并且lpstrDefExt是NULL,这个成员指定的偏移是结束字符NULL。如果用户在文件名中输入一个“.”作为最后的字符,这个成员是0。 
      lpstrDefExt 
      指向包含默认扩展名的缓冲。如果用户忘记输入扩展名,GetOpenFileName和GetSaveFileName附加这个扩展名到文件名中。这个字符串可以是任一长度,但但只有头三个字符被附加。字符串不应该包含一个句点(.)。如果这个成员是NULL并且用户忘记了输入一个扩展名,那么将没有扩展名被附加。 
      lCustData 
      指定应用程序定义的数据,这数据是能被lpfnHook成员识别的系统传到的钩子程序。当系统发送WM_INITDIALOG消息到程序,消息的lParam参数指向当对话框建立时指定的OPENFILENAME结构。钩子程序可以使用这个指针获得lCustData的值。 
      lpfnHook 
      指向一个钩子程序。除非Flags成员中包含OFN_ENABLEHOOK标记,要么这个成员将被忽略。 
      如果在Flags成员中OFN_EXPLORER标记没有被设置,lpfnHook指向一个OFNHookProcOldStyle钩子程序,这个程序有意的从对话框接收消息。钩子程序返回FALSE传递一个消息到默认的对话框程序或返回TRUE丢弃消息。
      如果OFN_EXPLORER被设置,lpfnHook指向一个OFNHookProc钩子程序。这个钩子程序接收从对话框发出的通知消息。这个钩子程序也接收你通过一个子对话框模板定义的附加控件的消息。钩子程序不有意接收默认对话框的标准控件的消息。
      lpTemplateName 
      指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,资源保存在能被hInstance成员识别的模块中。对于有限的对话框资源,这可以是通过MAKEINTRESOURCE返回的值。除非在Flags成员中设置了OFN_ENABLETEMPLATE标记,要么这个成员被忽略。 
      如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格的对话框来替代默认对话框。
      pvReserved 
      保留。 
      dwReserved 
      保留。 
      FlagsEx 
      Windows 2000:设置位标记,你可以使用来初始化对话框。这个成员可以是下列标记的组合。 标记 含意 
      OFN_EX_NOPLACESBAR 如果这个标记被设置,则位置栏被不显示。如果这个标记没有设置,则Explorer风格的对话框包含一般使用文件图标的位置栏,例如像收藏夹和桌面。

     

     

    注:本文转载自:http://wenwen.soso.com/z/q168510147.htm


    展开全文
  • 编译了一个新的模块,在进行加载的时候出现了如下问题: /opt/autorun # insmod board_config.ko  board_config: disagrees about version of symbol __class_create board_config: Unknown symbol __
  • 隐藏自己的Linux内核模块

    千次阅读 2020-05-09 17:42:59
    前面我提倡使用oneshot模式加载模块,即让模块在init函数中把事情做完后就return -1,这样系统中便不存在这么一个模块,也就不需要隐藏了。 但是,由于THIS_MODULE宏的存在,我们发现实际上隐藏一个模块是多么地简单...
  • Python模块大全

    万次阅读 多人点赞 2016-12-23 11:09:19
    Python模块
  • 模块学习总结

    千次阅读 多人点赞 2020-08-23 00:48:28
    准确来说,光模块是几种类别的模块的统称,具体包括:光发送模块Transmitter、光接收模块Receiver、光收发一体模块Transceiver和光转发模块Transponder。通常我们所说的光模块,一般是指光收发一体模块(下同)。 ...
  • nginx高级模块

    万次阅读 2018-06-21 00:20:56
    nginx高级模块 secure_link_module模块 http_geoip_module模块 nginx高级模块 secure_link_module模块 作用:用于校验链接的真实性(md5)和有效时间(expires) nginx配置 server { listen ...
  • 蓝牙模块HC05

    千次阅读 多人点赞 2020-11-22 00:52:32
    1. USB-TTL驱动安装,连接蓝牙模块 2. 蓝牙模块的调试 2.1 两种工作模式: HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。在自动连接工作模式下模块又可分为主(Master...
  • Spring Core模块

    千次阅读 2018-02-12 20:51:29
    说明Core模块主要的功能是实现了反向控制IoC(Inversion of Control)与依赖注入DI(Dependency Injection)、Bean配置以及加载。Core模块中有Beans、BeanFactory、BeanDefinitions、ApplicationContext等几个重要的...
  • python之sys模块

    万次阅读 多人点赞 2018-01-05 17:51:31
    1: sys是python自带模块. 利用 import 语句输入sys 模块。 当执行import sys后, python在 sys.path 变量中所列目录中寻找 sys 模块文件。然后运行这个模块的主块中的语句进行初始化,然后就可以使用模块了 。 2: ...
  • Oracle Apps(EBS)模块名称 & SAP模块名称

    千次阅读 2012-08-01 12:14:55
    Oracle EBS算是比较庞大,有着非常多的模块,这里列出一些模块的缩写以及模块全称 ABM - Activity Based Management AD - Applications DBA AHL - Oracle Advanced Service Online AK - Oracle Common ...
  • 我们在日常开发过程中,在新建一个项目中,我们经常会将一个项目按照功能性、模块等将一个项目分成多个子项目,这些子项目都包含在主项目中。 对于Spring、SpringBoot中实现多模块化,网上有很多教程,这里就不在...
  • Nginx 模块开发

    千次阅读 热门讨论 2015-01-09 10:22:09
    通常,服务器启动时,任何 Handler 模块都有可能去处理配置文件中的位置(location)定义。若出现多个Handler 模块被配置成需要处理某一特定的位置location 时,最终只有其中一个Handler 模块是成功的。 若 Handler...
  • 【Linux】Linux基础知识(Linux模块

    万次阅读 2018-07-14 18:51:17
    Linux的内核模块机制允许开发者动态的向内核添加功能,我们常见的文件系统、驱动程序等都可以通过模块的方式添加到内核而无需对内核重新编译,这在很大程度上减少了操作的复杂度。模块机制使内核预编译时不必包含很...
  • 强力卸载内核模块

    万次阅读 2012-09-09 16:38:41
    卸载模块target时,不管是否为强制卸载,都输出: ERROR:Module target is in use. 用lsmod查看target,发现Used by计数为1,而据我所知,没有其它模块依赖target。 编写模块检查target的module结构,发现: ...
  • linux 内核编译驱动模块ko的配置以及加载模块、卸载模块实例测试一、要让linux系统支持动态加载驱动模块必须先对linux 内核进行相关的配置,不然编译不过,加载模块也会加载失败甚至导致设备重启。1、勾选内核Enable...
  • python math模块详解

    千次阅读 多人点赞 2019-10-13 20:06:12
    math模块主要包括数论与表示函数、幂函数与对数函数、三角函数、双曲函数、特殊函数,还有常量。还有math模块的一些小技巧
  • Linux内核模块编程与内核模块LICENSE——《Linux设备驱动开发详解(第3版)》预读
  • Python 模块

    千次阅读 2013-03-15 16:32:46
    简介 ...为了在其他程序中重用模块模块的文件名必须以.py为扩展名。 模块可以从其他程序 输入 以便利用它的功能。这也是我们使用Python标准库的方法。首先,我们将学习如何使用标准库模块。 使用
  • 今天拿ionic写新项目的时候,每次创建模块的时候都会出现一个错误 SyntaxError: C:\Users\**\.ionic\update.json: Unexpected end of JSON input at JSON.parse (<anonymous>) at E:\SoftWare\nodejs\global...
  • python中os模块用法

    万次阅读 多人点赞 2018-04-17 11:10:17
    一、os模块概述Python os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。(一语中的)二、常用方法1、os.name输出字符串指示正在使用的平台。如果是window 则用'nt'表示,...
  • python 常用模块简介string 模块

    千次阅读 2013-07-03 13:52:14
    python 中string模块常用函数
  • 51单片机通过WIFI模块ESP8266控制LED灯

    万次阅读 多人点赞 2018-06-16 18:47:40
    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...
  • 4G模块连接MQTT

    万次阅读 2020-06-28 09:56:36
    Air724模块内置MQTT协议,提供AT,LUAT,CSDK,DTU可供选择使用,接口简单使用方便。 MQTT简介 优势:长连接,低带宽,高可靠。 实用场景:需要服务器下发消息给设备,需要及时收到。例如,远程开关,充电桩等 几...
  • optparse模块

    千次阅读 2012-04-03 15:04:07
     该模块提供了解析命令行选项的接口,其中optparse已经在2.7以后的版本中已经不再继续开发好此模块,从2.7后,将开发argparse模块。 optparse模块使用的代码示例: #!/bin/sh # # This is a lear
  • python的模块

    千次阅读 2016-11-20 00:01:29
    核心模块 1.1. 介绍1.2. _ _builtin_ _ 模块1.3. exceptions 模块1.4. os 模块1.5. os.path 模块1.6. stat 模块1.7. string 模块1.8. re 模块1.9. math 模块1.10. cmath 模块1.11. operator 模块
  • python的Image模块

    万次阅读 2018-07-10 13:59:45
    Image 模块Image 模块提供了同名的类用来表示PIL的图像。Image模块还提供了许多工厂(factory)函数,包块从文件加载图像的函数,以及创建新图像的函数。 例子 下面的脚本加载了一个图像,并把它旋转了45度,然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 265,190
精华内容 106,076
关键字:

ofn模块