none
在C#中如何正确使用SendMessage + WM_SETFONT 更改DataGridView的字体 RRS feed

  • 问题

  • 问题最新更新:

    现在用SendMessage + WM_SETFONT已经成功更改了TextBox的字体了,但是DataGridView同样的方法没有起作用。

    ListView也是同样,里面的数据行的字体并没有发生变化。

    看起来这个Message并没有影响到DataGridView,ListView的子控件的字体。

     

    请问有人知道应该怎么解决吗

     

    -------------------------------------------------------------------------

    我想使用某一种OpenType字体,

    这种字体虽然我已经确实安装在Windows里了,但在.Net的 InstalledFontCollection.Families是看不到的。

    于是我用gdi32.dll的API取到这个字体的名字,但是却无法设置到WinForm画面的控件上。

    按照MSDN的说法

    http://msdn.microsoft.com/zh-cn/library/system.drawing.font.aspx

    “有关如何构造字体的更多信息,请参见如何:构造字体系列和字体 Windows 窗体应用程序支持 TrueType 字体,并且对 OpenType 字体提供有限的支持。 如果您尝试使用不受支持的字体,或者运行此应用程序的计算机上未安装要使用的字体,则用 Microsoft Sans Serif 字体替代该字体。”

     

    经过实验,确实如此,New Font()的结果,返回了一个【Microsoft Sans Serif】的Font对象。所以我决定采用SendMessage的方法

    但是下面的这段代码也没有效果,请问有没有人指教一下这个用法错误在哪里?谢谢

     

     [DllImport("User32.dll", EntryPoint = "SendMessage")]
     private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, int lParam);
    
     private const int WM_SETFONT = 0x0030; 
    
     Font newF = new Font("Agency FB", (float)(24.0));
     int r = SendMessage(textBox1.Handle, WM_SETFONT, newF.ToHfont(), 0);

     

    • 已编辑 cs.liwei 2011年1月27日 9:20
    2011年1月26日 10:15

答案

  • 你好 cs.liwei,

    据我所知,C#本身现在还没有现成的相关的类库用来支持OpenType字体。

    我想你可以使用下面的这个第三方类库进行开发:

    http://www.cete.com/Support/NET_Help_Library_08_05/Open_Type_Fonts.html

    // Create a OpenType font class.
    OpenTypeFont openTypeFont = new OpenTypeFont( "verdana.otf" ); 
    // Use the OpenType font in a text area Page Element. 
    page.Elements.Add( new TextArea("Text", 0, 0, 200, 12, openTypeFont, 12 ) );
    

    你可以从这里访问其官方网站:

     

    http://www.cete.com/Products/DynamicPDFForNET/Generator/

     

    Mike [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.

    This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information is found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.

    • 已标记为答案 cs.liwei 2011年2月20日 5:01
    2011年2月15日 15:07
    版主

全部回复

  • 只能用css来控制.因为大多字体都是系统默认的.有些用了css来设置也是不行了.除非自己的电脑还要装插件.
    you are welcome
    2011年1月26日 11:47
  • 我这里是WinForm啊...css貌似帮不上忙

     

     

    2011年1月26日 12:45
  •     [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, int lParam);
    
        private const int WM_SETFONT = 0x0030; 
    
          Font newF = new Font("Agency FB", (float)(24.0));
          int r = SendMessage(textBox1.Handle, WM_SETFONT, newF.ToHfont(), 0);


    上面的方法实验了一下,发现不起作用,textBox1的Font没有发生变化。请问有没有人知道哪里有问题...
    2011年1月26日 12:46
  • 更新了一下提问的主题,希望有WindowsAPI的高手帮助解答一下
    2011年1月27日 2:40
  • 试试

    Font newF = new Font("Agency FB", (float)(24.0));
    定义为字段。
    private Font newF = new Font("Agency FB", (float)(24.0));


    2011 c# mvp China
    2011年1月27日 7:13
    版主
  • 谢谢,不是这个问题。

    我发现自己可能犯了个错误,可能SendMessage已经起作用了,只是控件的Font属性值没有发生变化。继续研究中

    2011年1月27日 7:29
  • 离成功越来越近了,碰到了DataGridView不知道怎么设置字体
    2011年1月27日 9:07
  • dear
    是dataGridView要设定字型?可以直接用Font属性吗?

    this.dataGridView.Font = new System.Drawing.Font("Arial", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年1月28日 1:03
  • dear
    是dataGridView要设定字型?可以直接用Font属性吗?

    this.dataGridView.Font = new System.Drawing.Font("Arial", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    你好。因为是特殊的OpenType字体(一个otf文件),没有办法new一个Font对象,Font属性不支持。

     

    2011年1月28日 2:34
  • 年前顶一顶吧,这个问题解决不了过不好年啊...
    2011年2月1日 10:09
  • 你好 cs.liwei,

    据我所知,C#本身现在还没有现成的相关的类库用来支持OpenType字体。

    我想你可以使用下面的这个第三方类库进行开发:

    http://www.cete.com/Support/NET_Help_Library_08_05/Open_Type_Fonts.html

    // Create a OpenType font class.
    OpenTypeFont openTypeFont = new OpenTypeFont( "verdana.otf" ); 
    // Use the OpenType font in a text area Page Element. 
    page.Elements.Add( new TextArea("Text", 0, 0, 200, 12, openTypeFont, 12 ) );
    

    你可以从这里访问其官方网站:

     

    http://www.cete.com/Products/DynamicPDFForNET/Generator/

     

    Mike [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.

    This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information is found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.

    • 已标记为答案 cs.liwei 2011年2月20日 5:01
    2011年2月15日 15:07
    版主
  • 由于 DataGridView 并非标准 Windows 控件,它由多个子 Windows 标准控件构建而成,因此改变其字体的 SendMessage 方法应该要把其 hWnd 参数设置到它的每一个子控件上。ListView 是 Common Controls 的一部分,但也同样属于扩展 Windows 控件,可能需要其他的消息来设置字体。详细情况请参考 MSDN 的 ListView 的 Messages 节。
    Mark Zhou
    2011年2月16日 9:41
  • 谢谢提供的资料
    2011年2月20日 4:59
  • 谢谢,看来和我想的一样
    2011年2月20日 5:00