2010-02-08 4 views
17

내가하여 WS_EX_LAYERED 확장 스타일을 추가하여 layered window을 만들었습니다Win32 : 그림자없는 그림자 사각형을 만들려면 어떻게해야합니까?

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED; 

Windows는 크로마 키 색상 값으로 검은 색을 사용합니다. 내가 분명 문제 만들기 위해 검은 색의 큰 경계를 떠날거야 : 윈도우가 구축 된 후

alt text http://i45.tinypic.com/2qs002q.jpg


을, 나는 use black as a chroma-key color에게 알려주기 :

SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY); 

지금 팝업 창은 부분적으로 투명하게 나타납니다.

alt text http://i48.tinypic.com/2cfta3o.jpg


문제는 마지막 단계입니다. 나는 드롭 그림자 생성, 윈도우 XP 이후 CS_DROPSHADOW 클래스 스타일을 사용할 수를 사용하려면 :

wndClass.Style = wndClass.Style | CS_DROPSHADOW; 

드롭 그림자가 나타납니다,하지만 그림자는 원래의 직사각형 창을 둘러싸고 창의 고려하지 않습니다 계층화 된 창에서 제공하는 투명성 :

http://i49.tinypic.com/23lnnu9.jpg

사람이 그림자를 만들 것입니다 내가 어딘가에 놓친 마법의 옵션은 사각형이 아닌 계층 창을 존중 알고 있나요?


6px 여백/여백을 포함하지 않을 경우이 문제가 나타나는 또 다른 예가 있습니다. Windows ® 테마로 그려지는 힌트 창은 직사각형이 아닙니다. 이 창은 투명 작은 눈에 보이는 차이 잎,하지만 그림자가 표시되지 않습니다 마이크로 소프트가 작동하도록 관리하고있다

alt text http://i47.tinypic.com/30arsxk.png

, 당신은 인터넷 익스플로러에서이 힌트에서 볼 수 :

가까이 윈도우 tooltips 클래스 힌트 창에서 찾고

alt text http://i46.tinypic.com/f104cj.jpg


. 사용 SpyXX - 나는 그것의 창 RECT를 얻을 수 클래스 스타일 :

http://i49.tinypic.com/f4pued.jpg

SpyXX는 말한다 :

Rectangle:  (440, 229)-(544, 249), 104x20 
Restored Rect: (440, 229)-(544, 249), 104x20 
Client Rect: (0, 0)-(104, 20), 104x20 
드롭 그림자와 함께 자체는 104x20 픽셀 인 창에 따라서 모든 점,

창 자체 외부. (CS_DROPSHADOW과 일치합니다.)

다음으로는 tooltips 창 클래스의 스타일을 볼 수 있습니다 :

Windows Styles:  94000001 

    WS_POPUP  80000000 
    WS_VISIBLE  10000000 
    WS_CLIPSIBLINGS 4000000 
    TTS_ALWAYSTIP   1 

Extended Styles: 00080088 

    WS_EX_LAYERED  80000 
    WS_EX_TOOLWIN   80 
    WS_EX_TOPMOST   8 

흥미롭게도, 그것은) CS_SAVEBITS (0x800를 사용하지 않습니다; 작고 수명이 짧은 창문에 유용합니다.

CS_DROPSHADOW (0x20000)도 사용하지 않습니다. 그래서 지금 나는 그것이 어떻게 그것의 자신의 창 밖에 나가는 지 궁금합니까?

참고 : 투명 레이어 처리 된 창은 영역에 대해 선호되는 기술로 설명되어 있습니다.

편집 : 계층화 된 Windows는 Windows 2000과 함께 사용되었습니다. CS_DropShadow는 XP와 함께 추가되었습니다.

+0

작업 환경에 적합한 이미지를 만드십시오. –

+0

저는 때때로 라이브 TV 인터뷰를하는 은행에서 일하므로 이미지 편집은 대단히 감사합니다. 그렇지 않으면 나는 직업을 잃을 수 있었다. –

+0

@ 로저 : 그 비디오를 봤어. –

답변

6

투명 레이어 처리 된 창은 영역에 대해 선호되는 기술로 설명됩니다. 그러나

, CS_DROPSHADOW 는 지역에에주의를한다. 영역을 사용하여 창을 자르거나 모양을 만들면 그림자가 새 윤곽선을 따릅니다.

다행히도 과 같이 계층화 된 창을 사용하여 두 영역을 결합하여 원하는 효과를 얻을 수 있습니다.

BTW : tooltips_class32 CS_DROPSHADOW 사용 - 창 스타일이 아닌 클래스 스타일이기 때문에 창 스타일에서 볼 수 없습니다.

+0

i * can * 창을 계층화 된 영역을 사용할 수 있습니까? 두 가지 모두 투명도를 발생시키기 때문에 (영역을 말하면) 영역 만 창이 실제 모양에 영향을줍니다. 계층화 된 창을 사용할 이유가 있습니까? (만약 그렇다면, 무엇을하고, 그렇지 않다면, 툴팁에서 사용하는 이유는 무엇입니까?) –

+0

툴팁 윈도우의 윈도우 핸들을 사용하여'GetWindowRgn'과 동등한 함수를 호출 할 수 있는지 살펴 봅니다. . 그것은 그 부분에 대답해야합니다, 왜 그것이 첫 번째 장소에 쌓여 있지는 않습니다. –

+1

둘 다 창에 가시적 인 "모양"을 부여하는 데 사용할 수 있지만 아주 다른 일을합니다. 영역은 효과적으로 영역을 제외하고 창을 효과적으로 잘라내어 정상적으로 그려지는 부분을 남겨 둡니다. 레이어가있는 윈도우는 여전히 직사각형이지만 오프 스크린 비트 맵으로 그려지고 합성됩니다 (일반 WM_PAINT 드로잉 메서드를 계속 사용할 수 있도록 해킹이 있지만 출력이 리디렉션됩니다). 간단한 색상 키 투명성 외에도 레이어가있는 창을 사용하여 반투명 및 심지어 픽셀 단위의 알파 값을 사용할 수 있습니다 (직접 그리기를 처리하는 경우). – Shog9

1

왜 LWA_ALPHA를 사용하지 않고 이미지에 그림자를 만드시겠습니까? 귀하의 코멘트에 reponse에

편집 :

A)는 단지 그림자에 대한 PNG 표출 알파를 사용을 중지하지 않습니다. Blt 두 이미지를 함께 하나의 단일 이미지로 사용하십시오.
B) 그림자를 생성하기 어렵지 않습니다. 이미지에서 당신은 3 개의 다른 알파 값으로 검은 색을 게시했습니다.
C)하지만 작동하지 않습니까? 즉 창조적 인 시간.
D) 그렇다면 창문이 당신을 위해하지 않을 일을하려고하지 마십시오.
E) 전적으로 부적절합니다. 계층화 된 윈도우가이를 처리합니다.

계층화 된 창에 대해 자세히 알아 보려면 목표를 달성하는 데 도움이 될 수 있으므로 적극 권장합니다.

편집 2 : 비트 맵이 있습니다. 그 이미지를 스캔하고 (블랙 자신을 식별함으로써) 어떤 비트가 컬러 키잉되고 암탉이 0의 알파를 갖도록 수정하면 다른 모든 알파는 255가됩니다 (Not : 당신은 이미지를 낮은 색 형식의 32 비트 이미지로 변환하려면 새 DC를 만들고 이미지를 복사하면됩니다. 이렇게하면 LWA_COLORKEY와 마찬가지로 LWA_ALPHA와 동일한 효과를 얻을 수 있습니다. 거기에서 색상이 (R = 0, G = 0, B = 0, A = 0)으로 바뀌는 가장자리의 픽셀을 쉽게 식별 할 수 있습니다. 그런 다음 첫 번째 픽셀을 n 알파 192, 한 픽셀을 128 픽셀, 아래 픽셀을 64 픽셀로 변경합니다. 이제 이미지 아래에 그림자처럼 보이는 알파 그라데이션이 생깁니다. 알파를 조정하여 원하는 효과를 얻을 수 있습니다.

+0

a) 이미지를 제어하지 않습니다. 그것은 현재 사용 가능한 시각적 테마에서 비롯됩니다. b) 편리한 그림자를 생성하는 알고리즘이 없습니다. c) Windows는 이미 드롭 그림자를 추가하는 메커니즘을 제공합니다. d) 시각적 복제본을 만들려고합니다. Windows가하는 일. e) 알파 블렌드를 수행하기 위해 내 창 뒤의 픽셀을 샘플링하면 (픽셀이 변경 될 수 있기 때문에) 잠재적으로 나빠질뿐만 아니라 데스크톱 구성의 출현으로 인해 잘못되어 compositor는 나를 바탕 화면의 그림으로 만듭니다. –

+0

왜 이미 Windows 기능을 사용하지 않고 Windows 기능을 복제해야합니까? – Koro

+0

원하는대로 할 수 없기 때문입니다. – Goz

1

CS_DROPSHADOW은 표준 직사각형 창에서만 작동합니다. WS_EX_LAYERED 창은 모든 것을 지원하지 않습니다. 그들은 당신이 원하는 것을 정확히 그릴 수있는 낮은 수준의 셀프 서비스 방법입니다.

드롭 섀도우를 얻으려면 이미지의 알파 채널에서 직접 드롭 섀도우를 생성해야합니다.

+0

Microsoft가 윈도우 외부에 드롭 섀도우를 그리는 방법을 알고 싶습니다. –

+0

+1 및 수락 된 답변 Microsoft는 계층화 된 창이 아니라 적절한 영역을 사용하여 적절한 크기의 그림자를 만듭니다. 도구 설명 hWnd에서'GetWindowRgn'을 호출하면 둥근 사각형 영역이 반환됩니다. 따라서 CS_DropShadow는 계층화 된 윈도우를 지원하지 않습니다. –

관련 문제