为窗口的HBRUSH创建位图模式

时间:2009-06-12 23:03:01

标签: c user-interface winapi

嗯,我想在窗户上有一种微弱的条纹图案......只是,因为它看起来不错。无论如何,我知道我可以做一个阴影刷,如下:

window with red stripes on white background http://www.cityaftersix.ca/uploads/windowpattern.png

然而,我只能设置前景色,而我不知道如何使背景不是白色(只使用默认的窗口颜色)。我在MSDN周围试图弄清楚如何绘制一个位图,该位图使用默认的背景颜色和稍暗的前景色来穿过窗口的背景。我该怎么做?请注意,我在emacs中工作,在C中 - 我没有像资源编辑器那样的东西......我将在纯C中添加它。

任何人都知道如何做到这一点?

我希望我能用代码绘制一个简单的5x5位图 - 这样每次绘制时都会使用COLOR_BACKGROUND。有没有办法获得COLOR_BACKGROUND,使该颜色变暗,然后将其复制成新颜色?


好吧,好吧,我做到了

我会稍微重新发布我的解决方案作为答案,但这个问题很奇怪: 我对GetSysColor(COLOR_BTNFACE);的回复是以[{1}}格式返回COLORREF,而0x00BBGGRR则将其解释为CreateBitmap(); ...我的意思是,我刚刚换了红色和蓝色字节,但是有一些方法可以避免这种字节混淆或者它只是一个窗口的怪癖吗?

另外,如何将此画笔绘制到静态控件上?

3 个答案:

答案 0 :(得分:1)

您可以将CreateHatchBrush用于简单的内置模式。要创建自己的,请使用 CreatePatternBrush

引用MSDN:

  

使用单色(每像素1位)位图创建的画笔具有绘制它的设备上下文的文本和背景颜色。由0位表示的像素用当前文本颜色绘制;用当前背景颜色绘制由1位表示的像素。

我认为你要做的是什么?

答案 1 :(得分:1)

使用GetBkColor获取设备上下文的当前背景颜色。您可以使用GetDC获取与窗口兼容的设备上下文。把它放在一起,使用这样的东西:

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

// do something...

ReleaseDC(dc);

答案 2 :(得分:1)

好的,所以我把它搞清楚了,让它全部运转起来。 为了创建模式,我首先创建了一个如下位图:

   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消息(之前我试图向控件发送某种消息,更改背景,就像我用{更改文本一样) {1}})。所以我这样做了:

WM_SETTEXT

(条纹是全局HBRUSH,我指定了我之前制作的位图画笔)
这将控件中所有丑陋的空白空间都改变为我创建的画笔。然而,文本后面的空间变成了WHITE。在浏览互联网和MSDN之后,我做了以下补充:

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

  return stripes;

}