不太明白你的意思。如果想要使用标准windows对话框,和res里的dialog有何关系?

解决方案 »

  1.   

    to prefix及所有关注者:res资源文件里可以放置各种资源,如图标、位图、字符串等,当然可以是Dialog,在对标准Windows对话框(如颜色选择框、文件框等)的界面型定制中,当然要用到一个Dialog模板作为此标准Windows对话框的childwindow,然后在此标准Windows对话框的hook里完成Dialog和标准Windows对话框的同步操作。在解决此类问题的标准方法中(包括VB、VC),这个Dialog一般置于res文件中作为具有ID值的资源存在,现在问题是由于在VB中要完全利用Windows API在此标准Windows对话框的hook中完成对Dialog的控制,比较麻烦,如果能用vb的form来代替此Dialog模板,在事先编好对此form控件进行控制的代码,然后直接在标准Windows对话框需要的地方引用,岂不是找到解决此类问题的又一捷径?!
    我非常关注这个问题,欢迎所有VB、VC大虾前来讨论这个问题!
      

  2.   

    这个嘛,Prefix太拿手了,只是要看他愿不愿意了。
      

  3.   

    to Prefix,听shines说你是这方面的高高手,为了技术上的交流,为了我国的软件事业,为了你能拿这个问题的满分,为了......,希望你不要吝啬啊,教教我们吧!这个问题传统的解决方法(VB里)我和shines已攻克,现在开始研究能否用form替代Dialog的问题。希望你来指点!
    为了表示我的诚意,我在位这个问题加20分!
      

  4.   

    to Prefix,听shines说你是这方面的高高手,为了技术上的交流,为了我国的软件事业,为了你能拿这个问题的满分,为了......,希望你不要吝啬啊,教教我们吧!这个问题传统的解决方法(VB里)我和shines已攻克,现在开始研究能否用form替代Dialog的问题。希望你来指点!
    为了表示我的诚意,我再为这个问题加20分!
      

  5.   

    我使用的方法是如你所说,使用vb的form来代替,因为比较复杂,这里给出大概方法:
    先要对commondialo hook,改变其大小,把vb form中那些控件放上去,我使用setparent的api使vb的form中的控件与commondialog合在一起,但不是整个form合在一起。因为要控制比较麻烦和复杂,所以建议先写成使用api来调用commondialog的类(把大部分功能都加上去),然后操作时使用对象的方法,不然会很麻烦,特别是出错时。
      

  6.   

    你说的方法我以前看过一个实例,是将CommonFileDialog这个控件做成了一个类,然后封装在DLL中,调用时他不但要先对此类进行实例化(象用控件一样),而且要用到RES中的模板。唯一感到方便的是:因为这个类具有自己的属性、方法、事件,特别是它将HOOK过程中的大部分Windows消息事件做成了这个类的事件接口,所以添加事件处理代码比较方便(算是在外部)。
    我不知你的“使用api来调用commondialog的类”是如何编法?能否更进一步说明一下,最好有简单的例子演示!
      

  7.   

      好吧,那我就说具体些。但还是无法完全说出来,Commondialog方面你就要自己完成,剩下的我帮你。
      首先你需要一个自己构造的CommonDialog,因为vb的那个ocx不合格。这个CommonDialog有一个要求,就是要能够取得它的hWnd和能够对它hook。然后你可以新建一个form(我们先把它称为frmPv),把要加到的东西都放在上面,然后对已经能够hook的CommonDialog操作。
      我的做法是,已经被hook的Commondialog要已经有了初始化、文件更改、终止这三个事件(这里只用到这三个),然后把这个Commondialog作为WithEvents 的接收者,即使用 Private WithEvents Cmd as CommonDialog为Commondialog准备好。此Commondialog的初始化事件在其被构造时就被执行,此时使用api:GetParent得到Commondialog的parent的hwnd(先称它为m_PhWnd),然后使用api:GetWindowRect得到此m_PhWnd的Rect。接下来使用api:SetParent一一为frmPv中要被放置到对话框的东西设置Parent,这里要将m_PhWnd作为Parent。到这里,你已经完成了大半了。
      下面就是要改变CommonDialog的大小,可以使用api:MoveWindow改变为你指定的大小,计算过程就自己完成吧。再使用MoveWindow设置frmPv中各控件在CommonDialog中的位置,因为此时它们的Parent已经是Commondialog了,所以其位置会以CommonDialog为参照并只会被放在CommonDialog中,到这里,如果您每一步都做对并且位置算得准确的话应该可以在你指定的CommonDialog中的位置看到控件们了。下一步,在已经被hook了的CommonDialog就可以按你要求对已经被选中的文件做操作,我把此事件放在FileChange中,可以方便的做出和Photoshop中一样选中文件就显示它的内容来。最后,你需要在CommonDialog的终止事件中把各控件的Parent还原成原frmPv,仍使用SetParent。
      这里已经把整个过程使用到的api和做法写出来了。我想你可能会有另一个问题,就是如何准确地放置各控件在CommonDialog中的位置,我提示一下,可以使用api:GetSystemMetrics(SM_CXDLGFRAME)
    得到CommonDialog的Frame宽,GetSystemMetrics(SM_CYCAPTION)可以得到标题栏的高度,还有如SM_CYDLGFRAME等,你可以参考使用以确定位置。
      好了,还有什么问题?应该可以解决了吧?Cheers!
      

  8.   

        你说的方法和我上面所说的看过的实例相似,只是将自己的form的控件“镶嵌”进CommonDialog这个做法和它不同,“镶嵌”的时候比较麻烦,而且灵活性不够,虽然也能解决问题,但要将其作为“用VB里的form替代此Dialog模板”的通用解决方案还不行,除非能将含控件的form(各控件已排列好,无需计算位置)直接“镶嵌”进CommonDialog,既然你已实现了将单个控件“镶嵌”进CommonDialog,那么我认为将整体“镶嵌”进CommonDialog是完全可能的,让我们都来想一想,好吗?
    欢迎所有感兴趣的大虾前来参与!
      

  9.   

    要先安排好还不容易?使用Frame不就行了?这个和你的做法并不同。这里所有操作都 可以和一般窗体一样把代码写在窗体中和控件中,不需要对每对整个窗体hook,操作起来出错机率小、而且方便许多。就算可以把窗体拼合起来,但拼合窗体(实际上有这种方法)会使操作产生延迟,并且拼合的效果不太好。如你所需,使用frame作为容器(或picture box也可),先安排安各控件于容器中,需要时只需要移动容器就行了,不是十分方便吗?
      

  10.   

    prefix说的不错!
    有没有不需重写CommonDialog的类而实现上述功能的其它方法呢?
    欢迎所有感兴趣的大虾前来继续积极参与讨论!请! 
      

  11.   

    不重写类?就是要使用vb的那个ocx了?
      

  12.   

    如果能将此VB的FORM转换成具有ID值的资源或许可以!因为
    OPENFILENAME.lpTemplateName As String,在VC中有MAKEINTRESOURCE,The MAKEINTRESOURCE macro converts an integer value to a resource type compatible with Win32 resource-management functions. This macro is used in place of a string containing the name of the resource. 
      

  13.   

    to prefix:
    关于这个论题,我看过你的Easy Editor里的“Open...”,确实不错,但有些问题,可能是你的疏忽,试一下连续按模板里的checkbox看看,还有“跳转”框里的值框,连打任意数字键至满,按ok就出事!
      

  14.   

    谢谢NiceFeather的提醒。跳转的值是因为数据溢出的原因,而且程序使用了多处hook和winproc,所以才出问题。至于checkbox的,不知你所说是什么问题?是不是commondialog会刷新一下?除些之外我没发现其它问题呀?刷新是因为此时我的程序已经转向了其它窗体上的菜单操作,所以才这样。
      

  15.   

    我说的checkbox的问题意思是当文本预览框里有文本时,连续按模板里的checkbox时选中的文件会自动导入文档,此时我还未按“是”键,怎么能认为user要选此文件呢?
      

  16.   

    哦,多谢NiceFeather和Gempin。马上去改正。
      

  17.   

    我发现了一个大XX!
    Easy editor导入的原因是按checkbox时dialog box 收到了ok的消息!!!
    多么奇怪的事。我还发现,如果窗体中有checkbox、command button等(但textbox不行),它会把第一、二个分别当做ok和cancel对待,你使用右键就能看到它说哪个是ok,哪个是cancel了。虽然实际上窗体没有和commondialog相互影响,就算是command button也没有,但它一样会生效。当窗体上放有两个command button,就算不要去对它做其它操作,只放在窗体上就行,它就会自动被认为是ok和cancel的复本,这样就不会影响到其它控件了。
      

  18.   

    最近各位有没有收到有人参与讨论问题的email?最近一段时间总是当有人参与讨论时我都没收到。
      

  19.   

    我使用@cnshare.net的信箱,最近都收不到。今天没看到你的贴子以为怎么没了,查找了一下才发现已经给了分。最近只有这里的信我没收到。已经好多天了,不知是怎的。