我在VB.NET应用程序中使用FontDialog
控件。
当我将ShowColor
属性设置为true
时,它会显示 Strikeout ,下划线和颜色选项在效果组下。我只需要这三个中的 Color 。
有没有办法隐藏 Strikeout 和下划线效果,以便只显示 Color 选项?
答案 0 :(得分:1)
ColorDialog
类HookProc
方法WM_INITDIALOG
消息(272)这类似于ColorDialog
类在设置ShowColor = false
和ShowEffects = true
时的作用(默认值是什么):
protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
{
switch (msg)
{
case 272:
if (!this.showColor)
{
SafeNativeMethods.ShowWindow(new HandleRef((object) null, UnsafeNativeMethods.GetDlgItem(new HandleRef((object) null, hWnd), 1139)), 0);
SafeNativeMethods.ShowWindow(new HandleRef((object) null, UnsafeNativeMethods.GetDlgItem(new HandleRef((object) null, hWnd), 1091)), 0);
break;
}
else
break;
...
}
以上隐藏了"颜色"标签和颜色组合(对话框ID 1139和1091)。
你想要相反,隐藏Strikeout和Underline。他们的对话框ID是1040和1041(在Wine代码中找到)。
全面实施"字体和颜色" @HansPassant对话:
在项目中添加一个新类并粘贴下面显示的代码。编译。将新组件从工具箱顶部拖放到表单上,替换现有的FontDialog
。
Imports System.Runtime.InteropServices
Public Class MyFontDialog
Inherits FontDialog
Protected Overrides Function HookProc(hWnd As IntPtr, msg As Integer, wparam As IntPtr, lparam As IntPtr) As IntPtr
If msg = 272 And Me.ShowColor Then '' WM_INITDIALOG
Dim strikeout = GetDlgItem(hWnd, &H410)
If strikeout <> IntPtr.Zero Then ShowWindow(strikeout, 0)
Dim underline = GetDlgItem(hWnd, &H411)
If underline <> IntPtr.Zero Then ShowWindow(underline, 0)
End If
Return MyBase.HookProc(hWnd, msg, wparam, lparam)
End Function
<DllImport("user32.dll")> _
Private Shared Function GetDlgItem(hDlg As IntPtr, item As Integer) As IntPtr
End Function
<DllImport("user32.dll")> _
Private Shared Function ShowWindow(hWnd As IntPtr, cmd As Integer) As Boolean
End Function
End Class
我实际上需要这个用于WinAPI(C ++ Builder),所以虽然稍微偏离主题,但我也是在共享C ++ WinAPI代码。它更加花哨,因为它甚至可以移动 Color 框:
RECT Rect;
POINT Point;
HWND StrikeoutHandle = GetDlgItem(Handle, 1040);
GetWindowRect(StrikeoutHandle, &Rect);
POINT StrikeoutPoint = { Rect.left, Rect.top };
ScreenToClient(Handle, &StrikeoutPoint);
ShowWindow(StrikeoutHandle, SW_HIDE);
ShowWindow(GetDlgItem(Handle, 1041), SW_HIDE);
HWND LabelHandle = GetDlgItem(Handle, 1091);
GetWindowRect(LabelHandle, &Rect);
Point.x = Rect.left;
Point.y = Rect.top;
ScreenToClient(Handle, &Point);
int Shift = StrikeoutPoint.y - Point.y;
SetWindowPos(LabelHandle, NULL, Point.x, Point.y + Shift, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
HWND ComboHandle = GetDlgItem(Handle, 1139);
GetWindowRect(ComboHandle, &Rect);
Point.x = Rect.left;
Point.y = Rect.top;
ScreenToClient(Handle, &Point);
SetWindowPos(ComboHandle, NULL, Point.x, Point.y + Shift, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
结果如下:
答案 1 :(得分:0)
我认为无法隐藏或更改默认的Windows字体对话框。
为此你必须创建自己的自定义控件。
答案 2 :(得分:0)
是的,不可能在fontdialog中隐藏下划线和删除线选项。 您可以通过在样式应用于目标文本之前处理文本来显示此类效果来解决您的问题。