当我更改表单的tabControls
tabPages
和BackColor
时,我在每个BackColor
上都会出现这些视觉故障,如下图所示:
tabPage
的顶部,有一个内部单像素白色边框。tabPage
的左侧,有一个内部三像素白色边框。tabPage
的底部,有一个内部单像素白色边框和一个外部双像素白色边框。tabPage
的右侧,有一个内部单像素白色边框和一个外部双像素白色边框。
有没有办法可以摆脱那些白色边框?
答案 0 :(得分:16)
这是我的黑客攻击。我使用NativeWindow
绘制TabControl
来填充那些“白色”空格。我不会声称它是完美的:
public class TabPadding : NativeWindow {
private const int WM_PAINT = 0xF;
private TabControl tabControl;
public TabPadding(TabControl tc) {
tabControl = tc;
tabControl.Selected += new TabControlEventHandler(tabControl_Selected);
AssignHandle(tc.Handle);
}
void tabControl_Selected(object sender, TabControlEventArgs e) {
tabControl.Invalidate();
}
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == WM_PAINT) {
using (Graphics g = Graphics.FromHwnd(m.HWnd)) {
//Replace the outside white borders:
if (tabControl.Parent != null) {
g.SetClip(new Rectangle(0, 0, tabControl.Width - 2, tabControl.Height - 1), CombineMode.Exclude);
using (SolidBrush sb = new SolidBrush(tabControl.Parent.BackColor))
g.FillRectangle(sb, new Rectangle(0,
tabControl.ItemSize.Height + 2,
tabControl.Width,
tabControl.Height - (tabControl.ItemSize.Height + 2)));
}
//Replace the inside white borders:
if (tabControl.SelectedTab != null) {
g.ResetClip();
Rectangle r = tabControl.SelectedTab.Bounds;
g.SetClip(r, CombineMode.Exclude);
using (SolidBrush sb = new SolidBrush(tabControl.SelectedTab.BackColor))
g.FillRectangle(sb, new Rectangle(r.Left - 3,
r.Top - 1,
r.Width + 4,
r.Height + 3));
}
}
}
}
}
并将其连接起来:
public Form1() {
InitializeComponent();
var tab = new TabPadding(tabControl1);
}
我的最终结果:
答案 1 :(得分:5)
你可以从控件继承
public class TabControlEx : TabControl
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x1300 + 40)
{
RECT rc = (RECT)m.GetLParam(typeof(RECT));
rc.Left -= 0;
rc.Right += 3;
rc.Top -= 0;
rc.Bottom += 3;
Marshal.StructureToPtr(rc, m.LParam, true);
}
base.WndProc(ref m);
}
}
internal struct RECT { public int Left, Top, Right, Bottom; }
答案 2 :(得分:0)
我最近遇到了这个问题,但从来没有找到一个好的简单解决方案。就在那时我只想调整控件的裁剪区域。这似乎工作得很好,没有明显的副作用。右侧的2个额外白色像素和底部的一个额外白色像素不再可见。
class TabControlEx : TabControl
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0005) // WM_SIZE
{
int Width = unchecked((short)m.LParam);
int Height = unchecked((short)((uint)m.LParam >> 16));
// Remove the annoying white pixels on the outside of the tab control
// by adjusting the control's clipping region to exclude the 2 pixels
// on the right and one pixel on the bottom.
Region = new Region(new Rectangle(0, 0, Width - 2, Height - 1));
}
base.WndProc(ref m);
}
}
答案 3 :(得分:-2)
使用MaterialSkin 从NuGet包添加MaterialSkin [右键单击您的解决方案 - 单击管理NuGet包 - 搜索MaterialSkin.dll] 接下来在工具箱中拖动MaterialSkin.dll 并使用材质外观tabControl