Показать параметр цвета в FontDialog без подчеркивания и зачеркивания - PullRequest
2 голосов
/ 07 января 2010

Я использую FontDialog элемент управления в приложении VB.NET.

Когда я устанавливаю его свойство ShowColor на true, оно показывает мне Зачеркнутый , Подчеркивание и Цвет в разделе Эффекты группа. Мне нужно только Цвет из этих трех.

Есть ли способ скрыть Зачеркнутый и Подчеркнуть эффекты, так что будет видна только опция Цвет ?

Ответы [ 3 ]

1 голос
/ 30 апреля 2015
  • Производные 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

0 голосов
/ 09 марта 2010

Да, невозможно скрыть подчеркивание и вычеркнуть в fontdialog. Вы можете решить свою проблему, не отображая такие эффекты на своем тексте, обработав его непосредственно перед применением стиля к целевому тексту.

0 голосов
/ 07 января 2010

Не думаю, что можно скрыть или изменить диалоговое окно шрифта Windows по умолчанию.

Для этого вам нужно создать свой собственный элемент управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...