- Производные
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;
...
}
Приведенное выше скрывает метку «Цвет» и комбинацию цветов (идентификаторы диалогов 1139 и 1091).
Вы хотите противоположность, скрывайте зачеркнутый и подчеркивание. Их идентификаторы диалогов: 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 box вверх:
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);
Результат выглядит так:
![Font and color dialog](https://i.stack.imgur.com/4s0Mc.png)