如何在WinForms Treeview控件中更改用于内联编辑节点文本的字体?

时间:2011-04-19 22:49:05

标签: c# .net winforms treeview treenode

我正在填充WinForms TreeView控件,并在加载时以不同方式设置每个节点的字体属性。

节点还允许内联编辑(通过按F2更改文本,或在Windows资源管理器中单击一次选择的文件夹名称)。

当节点进入编辑模式时,编辑时使用的字体将恢复为TreeView控件的默认字体,而不是特定节点的字体。

是否可以设置编辑每个节点时使用的编辑控件的字体,以匹配用于显示该TreeView节点的字体? (如果是这样,怎么样?)

1 个答案:

答案 0 :(得分:4)

正如您所说,对TreeNode源的检查显示该节点在进入编辑模式时使用的是编辑控件(来自Windows UI控件,而不是.NET窗体)。我没有在类中看到任何会在编辑模式下设置字体的内容,因此我认为您需要将消息直接发布到编辑控件。使用TVM_GETEDITCONTROL获取句柄,WM_SETFONT设置字体。您可能也需要Font.ToHfont()

编辑:这是一个如何调用SendMessage来完成字体更改的示例。

[DllImport("user32.dll")]
internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

internal const int WM_SETFONT = 0x0030;
internal const int TVM_GETEDITCONTROL = 0x110F;

private void treeView1_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e)
{
    TreeNode nodeEditing = e.Node;
    IntPtr editControlHandle = SendMessage(treeView1.Handle, (uint)TVM_GETEDITCONTROL, IntPtr.Zero, IntPtr.Zero);
    if (editControlHandle != IntPtr.Zero)
    {
        SendMessage(editControlHandle, (uint)WM_SETFONT, nodeEditing.NodeFont.ToHfont(), New IntPtr(1));
    }
}