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

发布于 2024-11-02 06:19:45 字数 257 浏览 0 评论 0原文

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

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

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

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

I am populating a WinForms TreeView control and setting the font attributes of each node differently as they are loaded.

The nodes also allow inline editing (changing the text by pressing F2, or clicking once selected like folder names in Windows Explorer).

When the node goes into edit mode though, the font used when editing reverts to the default font of the TreeView control, not that specific node's font.

Is it possible to set the font of the edit control used when editing each node, to match the font used for displaying that TreeView node? (If so, how?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一袭水袖舞倾城 2024-11-09 06:19:45

正如您所说,对 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));
    }
}

As you said, an examination of the TreeNode source reveals that the node is using an Edit Control (from Windows UI Controls, not .NET Forms) when it goes into edit mode. I don't see anything in the class that will set the font in edit mode, so I think you will need to post messages directly to the Edit Control. Use TVM_GETEDITCONTROL to get a handle to it, and WM_SETFONT to set the font. You will probably want Font.ToHfont(), as well.

Edit: here's an example of how you can invoke SendMessage to accomplish the font change.

[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));
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文