none
MessageBox中按钮如何实现多语言 RRS feed

  • 问题

  • 软件设置语言为中文时显示

    软件设置为英文时显示

    其中的字符串都是读的资源文件,但是英文时(是否)两个按钮一直是中文,请问各位如何解决?

    只能重写自定义消息框吗?


    初见未来
    2011年10月11日 10:09

答案

全部回复

  • MessageBox 是对于 MessageBoxEx() API 函数的包装。MessageBoxEx 本身是基于当前 Windows 语言的,比如当前用户系统设置语言为 zh-CN 那么 MessageBox 就显示确定、取消。如果设置为 en-US 就显示 OK、Cancel。

    注意,这个与 .NET Framework 的安装语言/语言包无关。

    所以,还是自己写一个 MessageBox 来解决您的问题。


    Mark Zhou
    2011年10月11日 11:03
  • 谢谢mazhou的答复,我自己写了控件,但是现在有几个新问题

     

    1.怎样得到系统里的图片(红框所示)

    2.怎样得到要显示的信息显示出来时所占用的宽度(因为要以此设置提示框的大小)

    3.如果第二条解决,那么还有这个问题,当显示宽度超出最大宽度时换行显示,此时占用的显示高度如何得到(因为要以此设置提示框的高度)


    初见未来
    2011年10月12日 1:00
  • Hi 初见未来,

    欢迎来到MSDN论坛!

    关于您的原始帖中所涉及的问题,您可以参考下面链接,文章是英文的:

    Localizing System MessageBox 

    http://www.codeproject.com/KB/miscctrl/Localizing_MessageBox.aspx

     

    它提供了一个 MessageBoxManager 类。该类使用Windows钩子,来根据需求改变 MessageBox 按钮的文本。

     

    同时,关于第二个问题,您可以参照下面链接以参考如何自定义消息框:
    Creating A Custom Message Box Part 2
    http://www.codeproject.com/KB/cs/Custom_Message_2.aspx

    下面是另外一个很有趣的项目:
    MessageBoxManager - A Windows Forms component that provides enhanced MessageBox functionality
    http://www.codeproject.com/KB/dialog/MessageBoxManager.aspx

    如果您有任何问题,不妨告诉我们。

    祝你一切顺利!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月13日 7:18
    版主
  • 系统图标有几种方法获取。最简单的,是 SystemIcons 类。直接用就好了。另外还可以通过  ExtractIconEx API 实现,传递  IDI_XXX 给它也可以得到系统标准图标。

    长度问题可以用 System.Drawing 下面的类型,我记得貌似有一个 MeasureString 还是什么的,在 Graphics 下面,可以计算字符串的像素长度。


    Mark Zhou
    2011年10月14日 6:21
  • 谢谢Yoyo Jiang的答复,那些例子给我很多启发,知道了一些以前不知道的信息。
    初见未来
    2011年10月14日 8:05
  • 再次感谢mazhou,终于知道如何计算字符串所占像素。
    初见未来
    2011年10月14日 8:21
  • dear

    以下范例可取得系统图示

    http://www.dotblogs.com.tw/yc421206/archive/2011/03/12/21808.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年10月14日 8:25
  • 谢谢余小章,但是


    初见未来
    2011年10月17日 1:21
  • Hi 初见未来,

    欢迎来到MSDN论坛!

    关于您的原始帖中所涉及的问题,您可以参考下面链接,文章是英文的:

    Localizing System MessageBox 

    http://www.codeproject.com/KB/miscctrl/Localizing_MessageBox.aspx

     

    它提供了一个 MessageBoxManager 类。该类使用Windows钩子,来根据需求改变 MessageBox 按钮的文本。

     

    同时,关于第二个问题,您可以参照下面链接以参考如何自定义消息框:
    Creating A Custom Message Box Part 2
    http://www.codeproject.com/KB/cs/Custom_Message_2.aspx

    下面是另外一个很有趣的项目:
    MessageBoxManager - A Windows Forms component that provides enhanced MessageBox functionality
    http://www.codeproject.com/KB/dialog/MessageBoxManager.aspx

    如果您有任何问题,不妨告诉我们。

    祝你一切顺利!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    第一个钩子的最实用,目前没有发现BUG,第二个连接的实例如果多次show出MessageBox取图标那块回报错,第三个连接C++的,大致看了下,不是很懂。

    初见未来
    2011年10月17日 1:30
  • Hi 初见未来,

    我把余老师提到链接中,我认为与本主题相关的有用信息,贴在下面,以供您参考:

    仿不完全的档案总管
    http://www.dotblogs.com.tw/yc421206/archive/2011/03/12/21808.aspx

    1.加入ListView时显示那些档案的icon,基本上是取得OS的档案关联图标,这是利用SHGetFileInfo API来达成。

    2. 您可以从以下链接中获取该文提供的源代码:

    https://skydrive.live.com/redir.aspx?cid=37142ebae462f7f1&resid=37142EBAE462F7F1!118

    3. 以下是这篇文章中提到的两个介绍 SHGetFileInfo API 使用方法的链接:

    如何使用 SHGetFileInfo函数来获取与 Visual C#.net 中的文件相关联的图标
    http://support.microsoft.com/kb/319350/zh-ch

    Obtaining (and managing) file and folder icons using SHGetFileInfo in C# http://www.codeproject.com/KB/files/fileicon.aspx

    祝,一切顺利!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2011年10月17日 2:12
    版主
  • Hi 初见未来,

    1. 这是第二个项目中,FAQ中的一个解决方案。我贴在这儿,供您参考:

    I've learned a lot from this example you've created and I have constructed my own messaging system for a project at work using some of the principles found in this article.
     
    It was producing errors after displaying the messages several times as peopole have pointed out and I have a fix:
     
    Fix:

       IntPtr[] largeIcon = new IntPtr[250];
       IntPtr[] smallIcon = new IntPtr[250];
    
       ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 250);
       tmpIcon = Icon.FromHandle(largeIcon[iconNumber]);
       imageIcon = new Bitmap(tmpIcon.ToBitmap(), 38, 38);
    
       for (int i = 0; i < 250; i++)
       {
           DestroyIcon(largeIcon[i]);
           DestroyIcon(smallIcon[i]);
       }
    

    如果还不能解决您的问题,您不妨直接联系下文章作者。

     

    2. 关于第三个方案,如果您有兴趣的话,可以在以下的 MSDN 指定论坛中提问: 

    Visual C++
    http://social.msdn.microsoft.com/Forums/zh-CN/visualcpluszhchs/threads


    祝您一切顺利!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.




    2011年10月17日 2:26
    版主