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大虾前来讨论这个问题!
这个嘛,Prefix太拿手了,只是要看他愿不愿意了。
to Prefix,听shines说你是这方面的高高手,为了技术上的交流,为了我国的软件事业,为了你能拿这个问题的满分,为了......,希望你不要吝啬啊,教教我们吧!这个问题传统的解决方法(VB里)我和shines已攻克,现在开始研究能否用form替代Dialog的问题。希望你来指点! 为了表示我的诚意,我在位这个问题加20分!
to Prefix,听shines说你是这方面的高高手,为了技术上的交流,为了我国的软件事业,为了你能拿这个问题的满分,为了......,希望你不要吝啬啊,教教我们吧!这个问题传统的解决方法(VB里)我和shines已攻克,现在开始研究能否用form替代Dialog的问题。希望你来指点! 为了表示我的诚意,我再为这个问题加20分!
如果能将此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.
to prefix: 关于这个论题,我看过你的Easy Editor里的“Open...”,确实不错,但有些问题,可能是你的疏忽,试一下连续按模板里的checkbox看看,还有“跳转”框里的值框,连打任意数字键至满,按ok就出事!
我非常关注这个问题,欢迎所有VB、VC大虾前来讨论这个问题!
为了表示我的诚意,我在位这个问题加20分!
为了表示我的诚意,我再为这个问题加20分!
先要对commondialo hook,改变其大小,把vb form中那些控件放上去,我使用setparent的api使vb的form中的控件与commondialog合在一起,但不是整个form合在一起。因为要控制比较麻烦和复杂,所以建议先写成使用api来调用commondialog的类(把大部分功能都加上去),然后操作时使用对象的方法,不然会很麻烦,特别是出错时。
我不知你的“使用api来调用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!
欢迎所有感兴趣的大虾前来参与!
有没有不需重写CommonDialog的类而实现上述功能的其它方法呢?
欢迎所有感兴趣的大虾前来继续积极参与讨论!请!
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.
关于这个论题,我看过你的Easy Editor里的“Open...”,确实不错,但有些问题,可能是你的疏忽,试一下连续按模板里的checkbox看看,还有“跳转”框里的值框,连打任意数字键至满,按ok就出事!
Easy editor导入的原因是按checkbox时dialog box 收到了ok的消息!!!
多么奇怪的事。我还发现,如果窗体中有checkbox、command button等(但textbox不行),它会把第一、二个分别当做ok和cancel对待,你使用右键就能看到它说哪个是ok,哪个是cancel了。虽然实际上窗体没有和commondialog相互影响,就算是command button也没有,但它一样会生效。当窗体上放有两个command button,就算不要去对它做其它操作,只放在窗体上就行,它就会自动被认为是ok和cancel的复本,这样就不会影响到其它控件了。