本帖最后由 trickglom 于 2011-04-27 00:35:02 编辑

解决方案 »

  1.   

    我想帮忙,只是,我自己还有很大的一个问题,没看懂。可能是因为太瞌睡了,打个标记先睡觉。switch不会影响性能,case的常量值分布在256的大小以内时候,它是通过一个跳转表实现的,更大的分布范围也是通过二层跳转表就可以了。这样switch的数量对性能的影响可以忽略。LZ厉害,自己看书,然后就可以设计框架了,我以前写程序所有的提示和工作方式都是scanf+cin<<+printf+MessageBox方式的 /:^|
    不过我实在是看着很迷糊,LZ再来补充些内容,做具体点描述,再配合点总结性的介绍?
      

  2.   

    用WebRrowser做你这个项目是完全够用了,至于做成UI框架局限性还是非常大的。不太适合。
      

  3.   

    一切基于HTML的本地客户端UI都是扯淡!
      

  4.   

       HTML只能做到快速开发UI. 要想绚丽的UI,肯定不是HTML了.你看看HTML才支持多少图形特性.能灵活操纵的显然只可能是本地代码.比HTML更灵活一点的是flash或者MS的silverlight, 考虑考虑?   另外你想加密HTML那估计是不太可能的.所有用IE内核加载的html,都可以用com接口读出来.具体的方法你可以百度下,MSDN里就有 读取其它进程内嵌IE窗口数据的代码.你就算延迟加载, 它就等你加载完再读.
       另外关于语法细节,switch的case最大数字可能会影响所占用的内存(看具体的编译器优化),case的个数无所谓,不影响性能.
       某个基类的虚函数表太大,对性能影响应该也可以接受,因为子类都是引用这个表,而不是复制这个表.除非你的子类对基类的虚函数表修改太多了.因为这方面知识毫无应用意义,我很容易因遗忘而胡扯,仅供参考. 你可以考虑MFC式的宏来替代  数量大的以及子类对其修改多的虚函数体系.总之:
        1.若追求快速弄出个勉强的界面,(能有图片,能有基本的控件)  ->HTML
        2.若即绚丽又特别灵活                         
         方案1: ---> MFC自绘, 或者皮肤库.
         方案2: ---> Qt编程加载皮肤(其它的库 界面美化或加载皮肤 还不如MFC).
         方案3: --->使用3D图形库完成(OPENGL,D3D),但3D图形库,缺乏成熟的控件库,可以考虑CEGUI(也不那么成熟).这种方式好处在于未来可以加入很多劲爆的效果(爆炸? 荧光?各种透明?毛蓉蓉效果?),另外因为没有窗口句柄,可以达到directUI那样的安全效果,防止别人屏蔽你广告,子类化你的窗口处理函数,替代你的程序逻辑(一堆可怕的事情).
              使用3D图形库最好直接用引擎,节省开发时间. 如OGRE.    3.若绚丽但不那么灵活:  可以考虑下内嵌flash,silverlight, 但要花点时间学习.再总之: 
        反正很折腾,搞程序就一个悲剧, 折腾半死, 一分钱没有!!!!!
      

  5.   

    楼主要不试试 htmlayout, 这个做界面还是很不错的啊
      

  6.   

    感谢推荐!
    工作框架再稍作说明。
    框架很简单:
    1、先写一个基类,基类中写上所有与“子类的实现方法”同名的虚方法,只是这个虚方法可能有点多。2、APP有一个公共的IDispatch派生类,用来接收HTML的exernal。3、然后在每个子类中写需要实现的方法代码。4、每一个子类对对话框中都有一个Webbrowser,通过HTML发出external来调用子类对话框的方法来完成相应的任务。5、基类中还有一些公共的方法,子类中不需要重写,每一个子类都可以调用,也就没有用虚方法。这些方法会操作web页的内容,所以将Webbrowser对应的IDC存储在对话框成员里,调用Webbrowser就用GetDlgItem。6、自绘的模拟菜单也是采用类似的方法,只是不用通过IDispatch接口。每一个子类对话框都公共成员接收模拟菜单反馈的消息。比如,在子类中写一个方法ShutMenu。点击模拟菜单并没真正关闭,只是SW_HIDE,然后将菜单的点击位置传给子类对话框并调用子类的对话框ShutMenu方法,子类对话框的ShutMenu做两件事:A、真正关闭模拟菜单;B、根据反馈回来的消息执行任务。非常感谢moon解惑。
    作品只要不太难看就行,VC++才自学8个月,弄不了那些太高深的东西。如果不用顾虑虚方法对程序性能的影响,那么我的这个框架应该没什么问题。至于HTML加密,只要加密到不是阿猫阿狗都能破的地步就可了,自信还能做到,况且就算解出来,关键的处理逻辑封在MFC里面呢,html页只负责external调用。就是将原来自已写的JS函数全部改装成MFC的。这个框架完善之后,只需要向基类中添加虚方法、子类中写实现方法、向IDIspatch的派生类的GetIDsOfNames和Invoke添加相应的分支就可以了。方法实现么,我就两件事,操作HTML,操作XML。图像全静态,也不关MFC太多事,贴贴就可以。就是还有两个问题不太明白:
    1、GetIDsOfNames的参数cNames倒底是啥玩意儿的,
    2、还有就是“如果点击模拟菜单后new了一个新的对话框,模拟菜单ShowWindow(SW_HIDE)后,会在webbrowser上留一点残影,然后才弹出新的对话框,实在不知WHY。我的菜单是这么 工作的:点击菜单(非模态对话框模拟的)->隐藏菜单->调用主对话框的方法->在主对话框的方法中关闭菜单->主对话框打开一个新模态对话框。实在不明白为什么会有残影,如果菜单关闭后不是执行打开新窗口这种操作,就不会有残影。”
      

  7.   

    突然发觉有点多事,反正是写给自已调用的,GetIDsOfNames完全可以自己实现呀,比如,基类添加一个带一个参数的虚方法DoOther(Cstring funcNameWithParam),html页中就这样调用external.DoOther("funcNameWithParam"),然后在Invoke里解析uncNameWidthParam,根根据解析结果确定用哪个方法,这样的话,就避免在GetIDsOfNames里面写无数分支了。
      

  8.   

        使用HTML会影响效率吧,这样搞还不如直接用B/S模式了。
      

  9.   

    支持 /:^}
    这个框架很好用,UI和功能之间的接口只有exernal表,这样分隔开功能可以很方便用给另一种UI用。只是这儿有点奇怪:
    被继承的对话框里不用有所有的虚函数,只是哪个下层对话框要用这个方法时,再在它里面单独声明出来不就好?
    至于exernal里下层对话框特有的exeral类型,在被继承的对话框里直接有一个 default的exernal用来抛弃它们不就好了 /:^},不用被抛弃的exernal,再在下层对话框它自己virtual出来的特殊dispatch里做处理,这样下层对话框的就像MFC里的对话框例程一样,先自己处理需要管理的exernal,返回时候再调用继承过来的上层dispatch。我是小菜鸟,回帖主要是为了学习,说的有不妥当就权当见笑了
      

  10.   

    你会jQuery吗?我最近也做这种UI呢,会了jQuery才有好看的UI,要不还不如拖控件呢。
      

  11.   

    我才是菜鸟,45#Xpoy说的我不太明白,我学VC++没多久,这个框架的关键代码都是通过整合一些示例来完成的。其实想想应该有许多可以改进的地方,比如VC++和JS作适当的分工。据说通过接口实现比用javascript速度要快,但像为了this.value="xxx"这样一点小事好像用不着专门去写个MFC函数。
      

  12.   

    貌似明白了45#Xpoy的意思。我原来的VFP程序有二十多个窗口,如果在MFC也采用这种分布的话,也会像VFP一样比较臃肿,而且如果窗口的统一行为方面有一点变化,所有的对话框全都要重新调试。于是,为了压缩程序体积和方便更改,将应用的对话框分为四个级别:主对话框、复杂功能对话框、单独功能对话框和装载报表的对话框。像原来有些功能交叉的对话框就能整合在一起,然后在调用时只要装载不同的html代码就能实现不同功能的窗口。
      

  13.   

    特别是我准备将其中一个功能进行扩展,一个比较复杂的数据输入窗口,分为四种模式:
        可视化模式:所见即所得,输入窗口直接以报表为模板,使业务能力比较低的人易于理解;
        快速模式:因为报表的模式是固定的,但这种固定模式(报表模式不容更改),并没有适当的分类,不利于数据快速录入,所以将同一类型的数据放在一起,专门针对那业务相当精孰的客户;
        分类模式:因为该报表中的信息可能由不同环节的来填充,希望能给他们一个密切合作的可能,每一个环节的流转,他们填入各自相关的内容之后,再流转到下一个环节;
        学习模式:尽可能多的提示和帮助。
        这个用html页比较舒服,用CSS调整控件的位置很好弄,麻烦点的就是如何维护tab顺序,不同的模式输入顺序相差太多。
        其实这也是我想用用Webbrowser的主要原因。
      

  14.   

    推荐使用Codejock.Xtreme.Suite.Pro.ActiveX控件
      

  15.   

    用MFC+WebBrowser做界面有局限性。做很普通的界面还行,稍微有点要求的界面就不行了。
    不过用这种模式的成本确实很低。
    1. 标题栏的重绘就很难实现了。
    2. 有些控件无法用WebBrowser来实现。像聊天窗口等等。
    3. 有时用HTML实现的效果,还是不如重绘效果好。效率也不如重绘。
      

  16.   

    Webbrowser这控件在MFC中用,感觉太局限了,很多事件都不响应。
      

  17.   

    我来顶一下,楼主你荣幸啊。完全不懂,不过建议楼主看下htmlayout,看明白了,写个傻扑教程发给我。
      

  18.   

    要想通过webbrower操作调取的网页,获取数据,发送数据用什么语言效率更高?