Изменение цвета окна WHOLE на дочерних статических элементах управления в Win API [дубликат]

Если вы измените тип параметра item метода из String в коллекцию, такую ​​как List & lt; String & gt; , вы должны получить

  @GET @Path ("/ foo") @Produces ("text / plain") public String methodImCalling (@DefaultValue ("Все"), который содержит все значения, которые вы ищете.  ) @QueryParam (value = "item") final List & lt; String & gt; item) {return "values:" + item;  }  

Спецификация JAX-RS (раздел 3.2) говорит следующее относительно аннотации @QueryParam :

Поддерживаются следующие типы:
  1. Примитивные типы
  2. Типы, которые имеют конструктор, который принимает один аргумент String .
  3. Типы, которые имеют статический метод с именем ] valueOf с одним аргументом String .
  4. List & lt; T> , Set & lt; T> , или SortedSet & lt; T> , где T удовлетворяет требованиям 2 или 3.
3
задан Lorenz Lo Sauer 11 April 2013 в 21:05
поделиться

3 ответа

Для элементов управления статическим текстом нет постоянного способа установить цвет текста или его фон. Даже если вы хотите применить изменения к одному статическому элементу управления; вам все равно придется обрабатывать сообщение уведомления WM_CTLCOLORSTATIC в родительском dlgproc только тогда, когда элемент управления будет готов.

Это связано с тем, что DefWindowProc перезаписывает ваши изменения в контексте устройства каждый раз, когда он обрабатывает WM_CTLCOLORSTATIC, как указано в MSDN :

По умолчанию функция DefWindowProc выбирает цвета системы по умолчанию для статического контроля.

static HBRUSH hBrush = CreateSolidBrush(RGB(230,230,230));

case WM_CTLCOLORSTATIC:
{
    if (settingstext == (HWND)lParam)

              //OR if the handle is unavailable to you, get ctrl ID

    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID
    if (CtrlID == IDC_STATIC1) //If desired control
    {
       HDC hdcStatic = (HDC) wParam;
       SetTextColor(hdcStatic, RGB(0,0,0));
       SetBkColor(hdcStatic, RGB(230,230,230));
       return (INT_PTR)hBrush;
    }
}

Если вы хотите сделать прозрачный фон элемента управления над родительским диалогом, вы можете использовать SetBkMode(hdcStatic, TRANSPARENT).

11
ответ дан whY 17 August 2018 в 08:54
поделиться
  • 1
    Можете ли вы объяснить, почему вам нужно создать hBrush для фона, если вы уже вызвали SetBkColor? А в случае прозрачного фона вам нужна прозрачная кисть? – Ameen 5 December 2015 в 16:26

Вы рассматривали подклассирование статического окна и рисование владельца?

1
ответ дан Jonathan Wood 17 August 2018 в 08:54
поделиться
  • 1
    Я понятия не имею, что это такое, поэтому я немного поработаю над подклассом. – contrapsych 21 December 2010 в 02:28
  • 2
    В основном, это означает, что вы отправляете сообщения в статический элемент управления, а вместо этого переходите к своему коду (не забудьте передать те, которые вы не обрабатываете исходному обработчику). Если вы справляетесь со стиранием фона и рисуете сообщения, то вы можете отображать на экране все, что захотите. – Jonathan Wood 21 December 2010 в 02:30
  • 3
    Таким образом, чтобы это происходило только на одном элементе управления, существует также способ уменьшить количество функций в пользовательской процедуре, которые я бы сделал для этого элемента управления. В основном, что я получаю от всего "не очень много функций в процедуре" Дело в том, что похоже, что это замедлит приложение, чтобы выполнять эти функции каждый раз, когда он должен перерисовываться, или это не очень важно? – contrapsych 21 December 2010 в 02:43
  • 4
    Это не будет медленнее, потому что ваши подпрограммы будут заменять текущие (это все равно будет окрашено). Кроме того, у вас нет подпрограмм рисования для каждого элемента управления, который вы используете для подкласса. Вы можете подклассифицировать несколько окон с тем же WndProc. Я все время это делаю. Тем не менее, это может быть излишним для того, что вам нужно. Я не совсем уверен. – Jonathan Wood 21 December 2010 в 03:42

Я думаю, что существует постоянный способ сделать это.

Сразу после создания метки используйте функцию GetDC (), чтобы получить Контекст устройства. Затем используйте:

SetTextColor(hdcStatic, RGB(0,0,0));
SetBkColor(hdcStatic, RGB(230,230,230)); // Code Copied from the above answer by cpx.

И он должен это сделать.

1
ответ дан Rizier123 17 August 2018 в 08:54
поделиться
  • 1
    Это не работает, потому что DefWindowProc сбрасывает эти изменения в контексте устройства каждый раз, когда обрабатывает сообщение WM_CTLCOLORSTATIC для элемента управления. MSDN : «По умолчанию функция DefWindowProc выбирает цвета системы по умолчанию для статического управления. & quot; – whY 21 March 2018 в 08:31
Другие вопросы по тегам:

Похожие вопросы: