大家都知道,CPropertySheet的下面几个按钮,在英文操作系统中为:OK,Cancel,Apply,Help,在中文操作系统中为:确定,取消,应用,和帮助,这些资源会随着操作系统而改变,现在,我要在一个标准的CDialog(请注意不是CPropertySheet)里也要用到这几个按钮,也希望达到这种效果,能做到吗?

解决方案 »

  1.   

    想想Windows是怎么实现的,也许参照这个方法,就有办法了。
    1,我想,你的意思是:你的一个对话框,有几个按钮,就是确定、取消、应用和帮助,然后这几个按钮在不同的语言的操作系统中,将自动选择该语言所用的文本;
    2,如果是这样,那问题就好办了。我想Windows的实现中,对每一种语言,都有相应的对话框资源,而资源中使用的文本随着操作系统语言的不同而不同,比如中文操作系统,做一个中文的对话框,其中的按钮使用中文的;在英文操作系统中,做一个英文的对话框,其中的按钮使用英文的;
    3,这些资源可以做在不同的动态库中,这些动态库可以使用相同的文件名,不过,在不用的操作系统中,使用不同的动态库文件。
    4,不知道说明白了没有。
      

  2.   

    我想这个和你在用VC建立工程的时候所选择的语言有关,如果你在中文操作系统中选择的是英语,那么这些默认的按钮显示的就是英语,如果你在英文操作系统上选择的语言是中文,默认的按钮的文本就应该是中文的!这个只不过是建立工程时生成的资源文件的不同,现在有很多汉化的游戏,包括现在中文版的windows不都是通过汉化资源文件和其他一些和资源有关的东西来实现的吗!上面是我对此问题的一些看法,楼主可以参考一下!希望对你有所帮助!
      

  3.   

    谢谢大家的建议,我想MilitaryMiniatures(++)第一点说的就是我的意思,大家说的方法我也知道,为了这几个按钮标准化如果让我做n多个版本,再说如果这个东西如果要在几十个国家(语言)应用,我不是要做几十个语言的版本?
    但是我希望的是能利用一个VC里提供的什么函数直接得到这个字符串,类似于得到系统资源的串值一样,如:
    BOOL GetComputerName(
      LPTSTR lpBuffer,  // computer name
      LPDWORD lpnSize   // size of name buffer
    );
    就能得到计算机名;UINT GetSystemDirectory(
      LPTSTR lpBuffer,  // buffer for system directory
      UINT uSize        // size of directory buffer
    );
    通过lpBuffer就能得到system directory名大家帮我想想哈,高分等着~~~~
      

  4.   

    "这个只不过是建立工程时生成的资源文件的不同"
    这句话,在概念上,我不是很赞同。说说我的浅见,不对的地方,请大家指正。
    1,这句话的意思,是我们生成的资源文件中,资源的语言类型会根据操作系统的语言来确定,也就是说,如果我们使用的是中文的操作系统,生成的资源文件将会是中文的,如果我们使用的是英文的操作系统,生成的资源文件将会是英文的;
    2,既然1是对的,那么,也就是生成的资源文件只有一种类型,也就是说,待生成了可执行文件之后,在不同的操作系统中,这个软件都只能显示一种语言文字,比如在英文操作系统,在中文操作系统下,都只能显示英文/或只能显示中文;
    3,对于属性框,资源文件里面,没有属性框的资源,只有属性页的资源;
    4,可以生成一个test程序,其中包含一个属性框,然后在英文操作系统、中文操作系统下分别运行这个程序,那么将会发现,这几个按钮“确定”“取消”等,将按照操作系统的语言类型显示不同的文种;这和2是矛盾的;
    5,一些英文软件,在中文操作系统下,属性框中的几个按钮也将显示中文;
    6,注意,我这里说的是,就事论事,属性框(MFC中CPropertySheet),当然这种情况也适用于文件、打印、颜色等几个常用的对话框(Common Dialog);
    7,综上所述,属性框应该是在Windows中实现的,而不是在生成的资源文件中的,既然是Windows中实现了这个属性框,那么自然它可以按照不同的操作系统的语言不同,选择不同的资源了;
    8,事实上,CPropertySheet只是一个MFC类,实现属性框的API函数也是有的,既然是API,那么自然它就不是MFC的一部分。这个API函数就是:
    int PropertySheet(
        LPCPROPSHEETHEADER lppsph
    );
      

  5.   

    3DMan (子弹满满)的想法,我很支持!因为,事实上,我做的软件也一直朝这个方面努力!算是志同道合!这个方面也是通用软件,或者说,自适应能力强的软件方面努力。
    如果是自己的对话框,一般的实现方法需要根据不同的语言类型,作不同的资源dll,当然,只限于资源动态库。然后按照不同的语言类型,安装不同的资源动态库。
      

  6.   

    嗯,还是MilitaryMiniatures(++) 研究的深入,佩服~~我开始也想着用CPropertySheet来代替我要的CDialog,因为我的Dialog里只有一个页面,所以我想将那些资源先放在一个无Title的child窗口里,然后嵌进这个CPropertySheet里,而且我不希望出现那个tab,但发现CPropertySheet不加CPropertySheetPage好像显示不出来(我用代码测试了一下,也有可能我的代码有问题)。