.Net对应的WinApi TabControl样式

本文关键字:TabControl 样式 WinApi Net | 更新日期: 2023-09-27 18:27:33

在每个选项卡中,控件将图标和标签居中,将图标放置在标签的左侧。在WinApi中,通过指定TCS_FORCEICONLEFT样式,可以强制将图标向左移动,使标签居中。可以使用TCS_FORCELABELLEFT样式左对齐图标和标签。

我如何在c#中制作相同的?也有类似的问题,但这些解决方案对我不起作用,除非我听从爱德华的建议。在从TabControl派生的类中(我需要可拖动的选项卡,但现在当选项卡被拖动时,其标签的对齐会中断,因为我将SizeMode设置为Fixed以使选项卡具有相同的宽度并正确拖动):

[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
protected static extern bool SetWindowLong32(IntPtr ptr, int index, int value);
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
protected static extern bool SetWindowLongPtr64(IntPtr ptr, int index, int value);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
protected static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
private const int GWL_STYLE = -16;
private const int TCS_FORCELABELLEFT = 0x20;
protected static bool SetWindowLong(IntPtr ptr, int index, int value)
{
     if (IntPtr.Size == 4)
     {
         return SetWindowLong32(ptr, index, value);
     }
     return SetWindowLongPtr64(ptr, index, value);
}

以及在TabControl构造函数中:

SetWindowLong(Handle, GWL_STYLE, TCS_FORCELABELLEFT);
var SWP_FRAMECHANGED = 0x20;
var SWP_NOMOVE = 0x2;
var SWP_NOSIZE = 0x1;
var SWP_NOZORDER = 0x4;
SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);

我知道可以使用所有者绘制模式,但我不知道如何使用只更改必要元素的系统样式。

.Net对应的WinApi TabControl样式

如果您只想调用SetWindowLong,请尝试

[DllImport("user32.dll")]
static extern bool SetWindowLong(IntPtr ptr, int index, int value);

如果您的目标是32-/64位平台,那么这个SO答案可能会为如何正确调用函数提供一些启示。