2009-06-12 6 views
1

글쎄, 창문 너머로 희미한 줄무늬 패턴을 갖고 싶다. 멋지게 느껴지니까. 단지 사용 (창 HBRUSH의 비트 맵 패턴 만들기

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

하지만, 난 단지 전경 색상을 설정할 수 있습니다, 나는 배경이없는 흰색 만드는 방법을 알고하지 않습니다 어쨌든, 내가 좋아하는, 그래서 난 그냥 해치 브러시를 만들 수있어 기본 창 색상). 나는 기본 배경색과 약간 어두운 전경색을 사용하는 비트 맵을 그리는 방법을 알아 내려고하는 MSDN을 파고 들며 창 배경을 가로 질렀다. 어떻게하면 좋을까요? C에서 emacs로 작업 중입니다. 리소스 편집기 나 이와 비슷한 것이 없습니다 ... 저는 이것을 순수한 C 언어로 추가 할 것입니다.

누구나 알 수 있습니다.

제 생각에는 코드로 간단한 5x5 비트 맵을 그릴 수 있기를 바랍니다. 따라서 그릴 때마다 COLOR_BACKGROUND이 사용됩니다. 을 얻고 그 색상을 어둡게 한 다음 새 색상으로 복사하는 방법이 있습니까?


좋아는, 괜찮아, 나는 그것을

내가 조금의 답변으로 내 솔루션을 다시 게시합니다을했지만 문제는 뭔가 이상한했다 : GetSysColor(COLOR_BTNFACE); 내 호출이 COLORREF에서 반환 된 0x00BBGGRR인데 반해 CreateBitmap();은 이것을 0x00RRGGBB으로 해석하고 있습니다 ... 나는 방금 빨강 및 파랑 바이트를 바꿨다. 그러나이 엔디안 혼동을 피할 수있는 방법이 있을까? 아니면 창문의 변덕인가?

또한이 브러시를 정적 컨트롤에 어떻게 페인트합니까?

+0

인텔은 빅 엔디안 환경입니까? 아마도 그것이 혼란을 설명 할 것입니까? –

+0

아니, 이것은 다른 기능을 읽는 것보다 하나 개의 기능이 다른 순서로 RGB 값을 넣어처럼 모든 단지 Windows XP에서 내 노트북에 ... 그냥 것입니다. 시스템 엔디안 문제인 경우 0x00RRGGBB 또는 0xBBGGRR00이 아닐까요? 비트가 메모리에 배치하는 방법의 형식은 장치 드라이버까지 있습니다 - 또는 0x00BBGGRR/0xRRGGBB00 –

+0

나는 CreateBitmap이 장치 의존 비트 맵을 만들고 있다고 생각합니다. 나는 그로 살펴 보겠습니다 안전하게 구현 세부 팁을위한 –

답변

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으로 바꿨습니다.이것은 STATIC 컨트롤이 솟다 그것을했다 것을 제외하고 잘 작동, 어쨌든

hbr = CreatePatternBrush(hbm); 

, 텍스트 뒤에 정말 추한 (모든 빈 공간을 만들고,의 부분 :이 같은 HBRUSH로 설정되어 텍스트가 전혀없는 곳에 컨트롤).

나는 (이전에 내가 WM_SETTEXT와 텍스트를 변경하는 것처럼 배경을 변경하려면 컨트롤에 메시지의 일종을 보내려고했다)를 WM_CTLCOLORSTATIC 메시지 처리의 STATIC 컨트롤을 투명하게합니다. 그래서 이런 짓을 :

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

    return stripes; 

} 

이 내가 만든 브러시 컨트롤에 모든 추한 빈 공간을 변경
(줄무늬가있는 내가 이전에 만든 비트 맵 브러시를 할당하는 글로벌 HBRUSH입니다). 그러나 텍스트 뒤의 공간은 WHITE로 바뀌었다. 인터넷 및 MSDN을 수색 한 후 다음과 같이 추가했습니다.

SetBkMode(hdc, TRANSPARENT); 
+0

이 코드는 아마도 깨지기 쉬운이라고 생각 - 연구의 비트가 CreateBitmap는 DDB (장치 의존 비트 맵)을 생성 보인다 후 - 당신이 편집을 위해 사용해서는 안됩니다. DDB의 비트 레이아웃은 장치 드라이버에 달려 있습니다. 대신 DIB를 만들어야합니다. 너무 혼란스러워서는 안된다. –

1

단순한 내장 패턴에는 CreateHatchBrush을 사용할 수 있습니다. 원하는대로 만들려면 CreatePatternBrush을 사용하십시오.

는 MSDN에서 인용 :

(픽셀 당 비트)의 비트 맵은 디바이스 컨텍스트의 텍스트 및 배경 색상이있는이 그려진하는 단색을 사용하여 만든 브러시. 0 비트로 표시되는 픽셀은 현재 텍스트 색상으로 그려집니다. 1 비트로 표시되는 픽셀은 현재 배경색으로 그려집니다.

나는 당신이하려고하는 것을 어떻게 생각합니까?

+0

글쎄, 기본적으로. 하지만 난 정말 디바이스 컨텍스트가 무엇인지 모른다, 나는 윈도우의 배경 색상을 얻을 것 어떻게 아직도 모르는 한 다음 장치 컨텍스트는 사용자가 그린 것입니다 전경 색상 –

+0

을 만들기 위해 그 값을 변경 GDI와 함께. 그것은 메모리를 나타냅니다. 프린터는 그 종류의 것을 나타냅니다. –

+0

아, 좋아, 내가 (아직 등록 또는 생성되지 않은) 윈도우의 클래스에 사용되는 기능의 브러쉬를 만드는거야 , 을 훨씬 더 쉽게 보이는 –

1

GetBkColor을 사용하여 장치 컨텍스트의 현재 색을 얻을 수 있습니다. GetDC을 사용하여 창과 호환되는 장치 컨텍스트를 가져올 수 있습니다. 함께 쓰려면 다음과 같이 사용하십시오 :

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

// do something... 

ReleaseDC(dc); 
+0

를 볼 수 있지만. –