找回密码
 立即注册

QQ登录

只需一步,快速开始

gw0506

超级版主

181

主题

4212

帖子

9049

积分

超级版主

Rank: 8Rank: 8

积分
9049

活字格认证

gw0506
超级版主   /  发表于:2009-12-18 14:13  /   查看:12313  /  回复:7
很多对象都有UITypeEditor,同样的一个editor可以通过SmartTag打开,可以通过Verb打开,也可以通过PropertyGrid打开。尽管他们都用的是同一个editor,但是他们的字体会不同。

    今天就发现一个bug,在Vista OS下,GcButton的TextAppearance属性的Editor可以通过SmartTag、Verb以及PropertyGrid三个地方打开,但是打开之后的Font是不同的。从SmartTag和Verb上弹出的UITypeEditor的Font貌似是Control.DefaultFont,而从PropertyGrid上弹出的Editor的Font是PropertyGrid的Font。而在Vista OS下,PropertyGrid的Font不是Control.DefaultFont。所以在Vista下就出现了这样的问题。

    其实解决办法很简单,就是在创建Editor时,用Code写出Font的值。因为通常不会修改Font值,因此它是默认值,不会生成Code,并且具有取父逻辑。由此可以想到,也许BackColor、ForeColor等等属性,也许默认值可以减少用户工作量,节省时间,并且有方便的取父逻辑,但是不一定是最合适的值。

7 个回复

倒序浏览
winking
葡萄城公司职员   /  发表于:2009-12-18 17:23:00
沙发
应该是从SmartTag和Verb上弹出UITypeEditor时没有通过IWindowsFormsEditorService来Show对话框,这个Service可以通过Designer的GetService获得。
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2009-12-19 09:37:00
板凳
如果没有Font的需求的话,我觉得给默认值是个好方法。因为当Editor复杂的时候(多层UserControl嵌套)。AutoScale会把Editor的布局搞的乱七八糟。如果牵涉到globalization的问题(不同语言布局不一样)就更乱。而且问题不好调试和修复。
但是,如果需要在不同的系统下Font不一样的话那就没办法了。以为Win7下默认字体很大,如果一概用Control.DefaultFont就会使Form看起来和环境很不协调。这时就不得不使用IWindowsFormsEditorService来ShowForm,并且老老实实的去解决掉AutoScale的问题了。
回复 使用道具 举报
gw0506
超级版主   /  发表于:2009-12-19 15:38:00
地板
既然说到AutoScale,还想请教一下楼上,一般你是怎么解决的。Font啊,DPI啊。呵呵~
回复 使用道具 举报
Arthas
葡萄城公司职员   /  发表于:2009-12-19 16:53:00
5#

回复 4# gw0506 的帖子

我觉得可以比较无耻的用table卡死~~
扯淡第一高手
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2009-12-21 08:46:00
6#
原帖由 gw0506 于 2009-12-19 15:38:00 发表
既然说到AutoScale,还想请教一下楼上,一般你是怎么解决的。Font啊,DPI啊。呵呵~


早就被AutoScale搞吐了。如果需要的话就只能慢慢调整了,各种Dpi和系统都试试,没有什么更好的办法。我想,可能尽量用Dock和LayoutPanel应该是正解吧。反正用绝对的Size和Location是比较危险的。另外,控件的Size不要调的刚刚好,最好留点空余。我们去年报了几个Bug都是在英文系统下可以显示全的字符串,在日文系统下就被截断了一点。(日文默认字体比英文的好像长一点)。如果可能的话,还是把这个功能禁掉把,呵呵。
回复 使用道具 举报
Leo
超级版主   /  发表于:2009-12-28 18:38:00
7#
貌似VS2005的时候,菜单什么的Font都可以设置。VS2008还没有找到怎么设置的。反正UITypeEditor的Font不是Control.DefaultFont.
Control.DefaultFont大概是这么取的:
早期版本(OSVersion.Version.Major<=4)的日文操作系统,hardcode "MS UI Gothic 9.0f"
某些诸如阿拉伯文的操作系统LCID & 0x3ff = 1 hardcode "Tahoma 8f"
然后通过API尝试从注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize]获取GUI Font字体。
以上全失败的话还会有一些后备策略,反正全是hardcode的值。
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2010-2-9 17:11:00
8#
1. VS中Dialog的Font用得不是系统Dialog的Font,也不是Control.DefaultFont,而是系统中Icon的Font。 VS2005以后的版本都不能通过Tools/Option来改变,而只能通过设置系统中Icon的Font来改变:
在XP系统下:右击桌面->点击属性->切到Appearance页面->点击Advanced->在Item里面选择Icon->改变Font。

这是微软的原话:
Note: The dialog font in Visual Studio is mapped to the system setting for ICON, not to the same font setting as system dialogs. System dialogs use the font DEFAULT_GUI_FONT (set to MS Sans Serif by default on the English operating system), and not exposed to the end user using Control Panel. We made the determination to use the setting for ICON in Visual Studio for two reasons: 1) There is a bug in the operating system in which MSSHellDlgFont2 does not correctly get mapped to Tahoma on Windows XP systems, and 2) the setting for ICON is the correct font for tool windows and treeview controls.
2.  正如Winking所说,UITypeEditor推荐使用IWindowsFormsEditorService.ShowDialog方法。而在其它地方,或者是IWindowsFormsEditorService取不到,则用IUIService.ShowDialog方法,实际上绝大多数IWindowsFormsEditorService的实现也是调用IUIService的。只有在上述Server都取不到的时候,才使用Form.ShowDialog().
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部