0

在每个选项卡中,控件将图标和标签居中,将图标放在标签的左侧。在 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);

我知道可以使用自绘模式,但我不知道如何使用系统样式仅更改必要的元素。

4

1 回答 1

0

如果你只想打电话SetWindowLong,试试

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

如果您的目标是 32 位/64 位平台,那么这个 SO 答案可能会对如何正确调用该函数有所帮助。

于 2013-08-13T17:06:24.777 回答