создание растрового шаблона для окна HBRUSH - PullRequest
1 голос
/ 13 июня 2009

Ну, я как бы хочу иметь какой-то слабый полосатый рисунок через окно ... Просто, потому что это выглядело бы хорошо. В любом случае, я знаю, что могу просто сделать заштрихованную кисть, вот так:

окно с красными полосами на белом фоне http://www.cityaftersix.ca/uploads/windowpattern.png

однако, я могу только установить цвет переднего плана, и я не знаю, как сделать фон не белым (просто используйте цвет окна по умолчанию). Я копался в MSDN, пытаясь понять, как нарисовать растровое изображение, в котором использовался цвет фона по умолчанию и немного более темный цвет переднего плана, чтобы проходить через фон окна. Как бы я это сделал? Обратите внимание, что я работаю в emacs, в C - у меня нет такого редактора ресурсов или чего-то в этом роде ... Я добавлю это в чистом C.

Кто-нибудь знает, как это делается?

Я надеюсь, что я смогу нарисовать простое растровое изображение 5x5 с кодом - так, чтобы COLOR_BACKGROUND использовался каждый раз, когда он рисуется. Есть ли способ получить COLOR_BACKGROUND, затемнить этот цвет, а затем скопировать его в новый цвет?


Хорошо, хорошо, я сделал это

Я скоро опубликую свое решение как ответ, но проблема была чем-то странным: Мой звонок GetSysColor(COLOR_BTNFACE); возвращал COLORREF в формате 0x00BBGGRR, тогда как CreateBitmap(); интерпретировал его как 0x00RRGGBB ... Я имею в виду, я просто поменял местами красный и синий байты, но есть ли какой-то способ чтобы избежать этой путаницы или это просто причудливость окон? *

Кроме того, как мне нарисовать эту кисть на статических элементах управления?

Ответы [ 3 ]

1 голос
/ 13 июня 2009

Вы получаете текущий задний цвет контекста устройства, используя GetBkColor Вы можете получить контекст устройства, совместимый с окном, используя GetDC . Чтобы собрать это вместе, используйте что-то вроде этого:

HDC dc=GetDC(hWnd);
COLORREF backColour=GetBkColor(dc);

// do something...

ReleaseDC(dc);
1 голос
/ 13 июня 2009

Хорошо, так что я понял это и заставил все это работать. Чтобы создать шаблон, я сначала создал растровое изображение примерно так:

   COLORREF bg = GetSysColor(COLOR_BTNFACE);
    bg = RGB(GetBValue(bg), GetGValue(bg), GetRValue(bg));
    COLORREF fg = bg - 0x00151515; //slightly darker than the background color
    COLORREF bits[30] = {          //would be problematic I guess if the color
      bg, bg, bg, bg, fg,          //was originally less than 0x00151515
      bg, bg, bg, fg, bg,
      bg, bg, fg, bg, bg,
      bg, fg, bg, bg, bg,
      fg, bg, bg, bg, bg
    };
    HBITMAP hbm = CreateBitmap(5, 5, 1, sizeof(COLORREF) * 8, bits);

GetSysColor() возвращал цвет в формате 0x00BBGGRR (синий, зеленый, красный), но CreateBitmap() требовал цвет в формате 0x00RRGGBB. Поэтому я просто поменял синее и красное значения на bg. Я превратил это в HBRUSH так:

hbr = CreatePatternBrush(hbm);

В любом случае, это работало хорошо, за исключением того, что элементы управления STATIC были над ним, и делали его действительно уродливым (все пустое пространство за текстом и в частях элемента управления, где вообще не было текста) .

Чтобы сделать прозрачными элементы управления STATIC, я обработал сообщение WM_CTLCOLORSTATIC (ранее я пытался отправить какое-то сообщение в элемент управления, чтобы изменить фон, как если бы я изменил текст с помощью WM_SETTEXT). Итак, я сделал это:

HBRUSH main_st_color_ev(HWND hwnd, HDC hdc, HWND hwndChild, int type){

  return stripes;

}

(полосы - это глобальная HBRUSH, которой я назначил растровую кисть, которую я сделал ранее)
Это изменило всю эту уродливую пустую область в элементе управления на кисть, которую я создал. Однако пространство непосредственно за текстом стало БЕЛЫМ. Поискав в интернете и MSDN, я сделал следующее дополнение:

SetBkMode(hdc, TRANSPARENT);
1 голос
/ 13 июня 2009

Вы можете использовать CreateHatchBrush для простых встроенных шаблонов. Чтобы создать свой, вы используете CreatePatternBrush .

Цитировать из MSDN:

Кисть, созданная с использованием монохромного (1 бит на пиксель) растрового изображения, имеет цвет текста и фона контекста устройства, к которому она обращается. Пиксели, представленные 0 битами, отображаются с текущим цветом текста; пиксели, представленные 1 битом, отрисовываются с текущим цветом фона.

Что я верю тому, что вы пытаетесь сделать?

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