自定义控件上的可选覆盖
Optional Override on a custom control
我有一个自定义 TabControl
,它的代码既可以防止用户使用 Tab 快捷方式进行导航,也可以删除选项卡 headers。有一种情况我仍然想阻止选项卡导航,但显示选项卡 headers,所以我想为自定义控件创建一个属性并且只应用隐藏 headers 的代码当此属性为 true
时,但我从此处获得了删除选项卡 headers 的解决方案,但我并不完全理解它。
我尝试将代码放入具有我的属性的 if
中,但这会使我的 visual studio 崩溃。我想这是因为这样做我将在 useHide == false
时用空过程覆盖必要的代码,所以,当 useHide == false
它运行常规继承代码而不是覆盖它时,我该如何做到这一点?
public class ExTabControl : TabControl
{
private bool useHide = true;
[Description("Hide tab headers."), Category("Appearance")]
public bool UseHideTabs
{
get => useHide;
set => useHide = value;
}
/// Intercept any key combinations that would change the active tab.
protected override void OnKeyDown(KeyEventArgs e)
{
bool changeTabKeyCombination =
(e.Control
&& (e.KeyCode == Keys.Tab
|| e.KeyCode == Keys.Next
|| e.KeyCode == Keys.Prior));
if (!changeTabKeyCombination)
{
base.OnKeyDown(e);
}
}
private const int TCM_ADJUSTRECT = 0x1328;
protected override void WndProc(ref Message m)
{
if (useHide == true)
{
// Hide the tab headers at run-time
if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
{
m.Result = (IntPtr)1;
return;
}
// call the base class implementation
base.WndProc(ref m);
}
}
}
.NET framework 4.7.2,Visual Studio 2019,Winforms 应用程序
当 useHide
为 false 时,您缺少对基本方法的调用,请尝试使用此方法。
protected override void WndProc(ref Message m)
{
// Hide the tab headers at run-time
if (useHide && m.Msg == TCM_ADJUSTRECT && !DesignMode)
{
m.Result = (IntPtr)1;
return;
}
// call the base class implementation
base.WndProc(ref m);
}
我有一个自定义 TabControl
,它的代码既可以防止用户使用 Tab 快捷方式进行导航,也可以删除选项卡 headers。有一种情况我仍然想阻止选项卡导航,但显示选项卡 headers,所以我想为自定义控件创建一个属性并且只应用隐藏 headers 的代码当此属性为 true
时,但我从此处获得了删除选项卡 headers 的解决方案,但我并不完全理解它。
我尝试将代码放入具有我的属性的 if
中,但这会使我的 visual studio 崩溃。我想这是因为这样做我将在 useHide == false
时用空过程覆盖必要的代码,所以,当 useHide == false
它运行常规继承代码而不是覆盖它时,我该如何做到这一点?
public class ExTabControl : TabControl
{
private bool useHide = true;
[Description("Hide tab headers."), Category("Appearance")]
public bool UseHideTabs
{
get => useHide;
set => useHide = value;
}
/// Intercept any key combinations that would change the active tab.
protected override void OnKeyDown(KeyEventArgs e)
{
bool changeTabKeyCombination =
(e.Control
&& (e.KeyCode == Keys.Tab
|| e.KeyCode == Keys.Next
|| e.KeyCode == Keys.Prior));
if (!changeTabKeyCombination)
{
base.OnKeyDown(e);
}
}
private const int TCM_ADJUSTRECT = 0x1328;
protected override void WndProc(ref Message m)
{
if (useHide == true)
{
// Hide the tab headers at run-time
if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
{
m.Result = (IntPtr)1;
return;
}
// call the base class implementation
base.WndProc(ref m);
}
}
}
.NET framework 4.7.2,Visual Studio 2019,Winforms 应用程序
当 useHide
为 false 时,您缺少对基本方法的调用,请尝试使用此方法。
protected override void WndProc(ref Message m)
{
// Hide the tab headers at run-time
if (useHide && m.Msg == TCM_ADJUSTRECT && !DesignMode)
{
m.Result = (IntPtr)1;
return;
}
// call the base class implementation
base.WndProc(ref m);
}