挑战全国VB高手:能否用VB里的form替代res文件里的Dialog模板???

NiceFeather 2000-09-09 07:32:00
如果res文件里有一Dialog模板,能否用VB里的form替代此Dialog模板用于标准Windows对话框(如颜色选择框、文件框等)的childwindow,并在hook中实现其控制?请简述解决方案!
...全文
1130 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
prefix 2000-09-26
  • 打赏
  • 举报
回复
我使用@cnshare.net的信箱,最近都收不到。今天没看到你的贴子以为怎么没了,查找了一下才发现已经给了分。最近只有这里的信我没收到。已经好多天了,不知是怎的。
Herro 2000-09-24
  • 打赏
  • 举报
回复
奇怪,有这种问题?
NiceFeather 2000-09-24
  • 打赏
  • 举报
回复
我是贴主,封封收到!
prefix 2000-09-24
  • 打赏
  • 举报
回复
最近各位有没有收到有人参与讨论问题的email?最近一段时间总是当有人参与讨论时我都没收到。
prefix 2000-09-23
  • 打赏
  • 举报
回复
哦,多谢NiceFeather和Gempin。马上去改正。
shines77 2000-09-23
  • 打赏
  • 举报
回复
不会吧,竟然是这样的错误,我还以为是故意这样做的呢,我就不信,我也来试试。
prefix 2000-09-23
  • 打赏
  • 举报
回复
我发现了一个大XX!
Easy editor导入的原因是按checkbox时dialog box 收到了ok的消息!!!
多么奇怪的事。我还发现,如果窗体中有checkbox、command button等(但textbox不行),它会把第一、二个分别当做ok和cancel对待,你使用右键就能看到它说哪个是ok,哪个是cancel了。虽然实际上窗体没有和commondialog相互影响,就算是command button也没有,但它一样会生效。当窗体上放有两个command button,就算不要去对它做其它操作,只放在窗体上就行,它就会自动被认为是ok和cancel的复本,这样就不会影响到其它控件了。
NiceFeather 2000-09-22
  • 打赏
  • 举报
回复
to prefix:
关于这个论题,我看过你的Easy Editor里的“Open...”,确实不错,但有些问题,可能是你的疏忽,试一下连续按模板里的checkbox看看,还有“跳转”框里的值框,连打任意数字键至满,按ok就出事!
Gempin 2000-09-22
  • 打赏
  • 举报
回复
我说的checkbox的问题意思是当文本预览框里有文本时,连续按模板里的checkbox时选中的文件会自动导入文档,此时我还未按“是”键,怎么能认为user要选此文件呢?
prefix 2000-09-22
  • 打赏
  • 举报
回复
谢谢NiceFeather的提醒。跳转的值是因为数据溢出的原因,而且程序使用了多处hook和winproc,所以才出问题。至于checkbox的,不知你所说是什么问题?是不是commondialog会刷新一下?除些之外我没发现其它问题呀?刷新是因为此时我的程序已经转向了其它窗体上的菜单操作,所以才这样。
NiceFeather 2000-09-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.

NiceFeather 2000-09-16
  • 打赏
  • 举报
回复
prefix说的不错!
有没有不需重写CommonDialog的类而实现上述功能的其它方法呢?
欢迎所有感兴趣的大虾前来继续积极参与讨论!请!
prefix 2000-09-16
  • 打赏
  • 举报
回复
不重写类?就是要使用vb的那个ocx了?
prefix 2000-09-11
  • 打赏
  • 举报
回复
要先安排好还不容易?使用Frame不就行了?这个和你的做法并不同。这里所有操作都 可以和一般窗体一样把代码写在窗体中和控件中,不需要对每对整个窗体hook,操作起来出错机率小、而且方便许多。就算可以把窗体拼合起来,但拼合窗体(实际上有这种方法)会使操作产生延迟,并且拼合的效果不太好。如你所需,使用frame作为容器(或picture box也可),先安排安各控件于容器中,需要时只需要移动容器就行了,不是十分方便吗?
NiceFeather 2000-09-11
  • 打赏
  • 举报
回复
你说的方法和我上面所说的看过的实例相似,只是将自己的form的控件“镶嵌”进CommonDialog这个做法和它不同,“镶嵌”的时候比较麻烦,而且灵活性不够,虽然也能解决问题,但要将其作为“用VB里的form替代此Dialog模板”的通用解决方案还不行,除非能将含控件的form(各控件已排列好,无需计算位置)直接“镶嵌”进CommonDialog,既然你已实现了将单个控件“镶嵌”进CommonDialog,那么我认为将整体“镶嵌”进CommonDialog是完全可能的,让我们都来想一想,好吗?
欢迎所有感兴趣的大虾前来参与!
Putao 2000-09-10
  • 打赏
  • 举报
回复
关注
Putao 2000-09-10
  • 打赏
  • 举报
回复
关注
who 2000-09-10
  • 打赏
  • 举报
回复
notice
prefix 2000-09-10
  • 打赏
  • 举报
回复
  好吧,那我就说具体些。但还是无法完全说出来,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!
NiceFeather 2000-09-10
  • 打赏
  • 举报
回复
你说的方法我以前看过一个实例,是将CommonFileDialog这个控件做成了一个类,然后封装在DLL中,调用时他不但要先对此类进行实例化(象用控件一样),而且要用到RES中的模板。唯一感到方便的是:因为这个类具有自己的属性、方法、事件,特别是它将HOOK过程中的大部分Windows消息事件做成了这个类的事件接口,所以添加事件处理代码比较方便(算是在外部)。
我不知你的“使用api来调用commondialog的类”是如何编法?能否更进一步说明一下,最好有简单的例子演示!
加载更多回复(6)
可再发行编码 - 有限使用: msjet35.dll msjint35.dll msjter35.dll msrd2x35.dll msrepl35.dll expsrv.dll vbajet32.dll msexch35.dll msexcl35.dll mspdox35.dll msltus35.dll mstext35.dll msxbse35.dll MSJTOR35.DLL MSJT4JLT.DLL mdac_typ.exe msorcl32.dll msdaora.dll 可再发行代码 - 扩展的使用: comct232.ocx comct332.ocx comctl32.ocx comdlg32.ocx dblist32.ocx hhctrl.ocx mci32.ocx msadodc.ocx mschrt20.ocx mscomct2.ocx mscomctl.ocx mscomm32.ocx MSDatGrd.ocx msdatlst.ocx MSDatRep.ocx msflxgrd.ocx mshflxgd.ocx msinet.ocx msmapi32.ocx msmask32.ocx msrdc20.ocx mswinsck.ocx picclp32.ocx richtx32.ocx sysinfo.ocx tabctl32.ocx wbclsdsr.ocx anibtn32.ocx dbgrid32.ocx gauge32.ocx graph32.ocx grid32.ocx gswdll32.dll keysta32.ocx mschart.ocx msoutl32.ocx spin32.ocx threed32.ocx adodcchs.dll cmct2chs.dll cmct3chs.dll cmctlchs.dll cmdlgchs.dll datgdchs.dll datlschs.dll DatRpchs.DLL DBGRDCHS.DLL dblstchs.dll flxgdchs.dll mcichs.dll MsCc2chs.dll msch2chs.dll MSCMCCHS.DLL MSCOMCHS.DLL MSHFGCHS.DLL inetchs.dll MSMPICHS.DLL MSMSKCHS.DLL rdc20chs.dll WINSKCHS.DLL pcclpchs.dll rchtxchs.dll SYSINCHS.DLL TABCTCHS.DLL mswcrchs.dll MSCHTCHS.DLL 可再发行代码 - 标准: oleaut32.dll secur32.dll compobj.dll ole2.dll ole32.dll olecnv32.dll olethk32.dll rpcltc1.dll rpcltc5.dll rpcltccm.dll rpclts5.dll rpcltscm.dll rpcns4.dll rpcrt4.dll rpcss.exe storage.dll stdole2.tlb stdole32.tlb imagehlp.dll dllhost.exe comcat.dll iprop.dll rpcmqcl.dll rpcmqsvr.dll olepro32.dll asycfilt.dll mfc40.dll msvcrt40.dll dcomcnfg.exe oledlg.dll ciscnfg.exe dcomcnfg.hlp IE4\MSJavx86.exe os\system\atl.dll os\system\ansi\atl.dll VB98\template\code\loadres.bas VB98\template\code\RegKeys.BAS VB98\template\controls\ListBtns.frm VB98\template\controls\ListBtns.frx VB98\template\controls\listpick.frm VB98\template\controls\listpick.frx VB98\template\controls\tvlv.frm

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧