最近的用VB+Webbrowser做了一个应用程序框架,webbrowser完全覆盖了VB主窗体(无边框无标题栏),所有的操作全部都是通过javascript控制,包括窗体移动、缩放。呵呵,费了九牛二虎之力,研究了一通API才搞定。有没有有相关经验的大虾指点指点,这种框架有些什么要注意的问题?为了避免IE的默认设置的影响,Webbbrowser的废弃了statusTextChange,用titleChange完成一些数据返回。就是这一类的问题很头痛,发现了问题再去解决的话,web代码就要大幅修改。

解决方案 »

  1.   

        二楼的问得我很不好意思,不过是我表达有误。web中的的javascript并不能直接控制VB。我所做的框架在初始化时,VB和javascipt通过各自的代码将位置、大小元素等生成相同的值,然后在javascript中进行后续处理,在这期间,VB窗体中的timer不停的刷新同步,读取javascript变量,以此来控制窗口大小位置等。正如三楼所说的“尊重用户习惯”,使用API来实现圆角窗口,控制最大化以及定制系统菜单,使无标题无边框窗口能像普通窗口一样操作。使用API基本达到这个目的。不过还有一个没做到的是:最大化时,如何自动适应屏幕大小。我知道,这个要通过API来截取相关的消息,但是刚刚开始学习C++,还没弄清楚是截获哪类消息。这个框架尝试用JAVASCRIPT+XML+HTML+CSS来实现数据存取,想将界面做的和MSN一样漂亮(理论上是可以的);数据都是XML,VB的作用是做外壳和为XML数据编制索引以及封装各种网页代码。如果用C++来实现更理想,但是到现在还没弄明白IWEBBROWSER2是如何工作的。
        在这个框架中一个关键问题是,IE的默认设置可能会产生灾难性的后果,毕竟强制用户更改IE设置,是非常不尊重用户的。至于为什么一定要用这个框架,我的理由是:1、就是想在UI方面做得像MSN一样漂亮;2、网页换肤很好控制;3、做一下实验,webbrowser加载的网页中有1000个文本框和一个VB窗体的添加了1000个文本框,且不说工作量,就比试一下这两种方式在内存占用和响应速度,我选择用webbrowser;4、当然,一些很复杂的控件,比如datagrid、treeview,在网页中很难完全实现,但一些基本功能,比如排序、滚动、拖放还是能做做到的,而且通CSS控制他们的样式,效果非常好,其实你看看本网站论坛左边的树结构,相信无论是C++还是C#,想将treeview更换一个样式绝没有CSS容易。5、将网页代码放在本地,执行速度看起来和普通的EXE没什么区别(这一点不敢保证,好像IE的有些设置会影响到本地文件的读取)。
        有没有做过类似工作的大虾,给我一些建议。
      

  2.   

    突然想到这篇文章对楼主可能有重要的参考价值:
    http://blog.csdn.net/vansoft/archive/2008/12/18/3547261.aspx
     VB6实现界面与功能代码分离
      

  3.   

    谢谢2楼的:
    在网页中用javascript构造函数创建了一个对象,在VB中通过webbrowser引用。如果直接用document.script.对象变量名,得到的结果用varType检查,显示为8,即字符串,但是用document.script.对象变量名.对象属性名,则可以得到在javascipt中相应的数据类型。
    想直接在VB中引用javascript中的对象,但如此
    dim abc as object
    set object=web.document.script.对象变量名
    然后abc.网页对象属性名。失败了,因为“web.document.script.对象变量名”是字符串。
    但是,用Type定义一个结构myabc,,然后
    dim abc as new myabc
    set abc =web.document.script.对象变量名
    再abc.网页对象属性名,居然成功了。
    不过,我不知道这是什么道理。而且,即使所Type的结构,可以与javascript的对象的结构完全不同,而abc.网页对象属性名都是正确的。生成的EXE中也能正常运行,但是不知道道理所在,很担心什么时候突然会崩溃。
    以上是我在另一个帖子中问到的问题,但至今没人回。事实上确实遇到了一个可怕的问题:使用上述方法获取javascript结构体变量后,VB中不能再定义其它任何结构体,否则永远不能成功。这里所谓的永远是指:生成的EXE测试失败后,回头修改VB代码,将后来定义的结构体代码删除,很不幸,生成的测试EXE中,在读取javascript结构体变量时失败。所幸的是听了某位大虾的建议,备份勤奋,能用备份还原了。