문제

우리는 대부분의 창문에 다양한 둥근 가장자리가있는 피부 앱을 개발하고 있습니다. 픽셀이 완전히 불투명하거나 완전히 투명 할 수 있기 때문에 거의 모든 비 교방형 모양을 정의하기 위해 창 영역을 사용하고 있지만 거의 모든 사람들 이이 원인을 사용하는 소리에 반대합니다.

계층화 된 Windows를 사용하여 이것에 대한 솔루션을 생각해 냈지만 다양한 시스템에서 이것이 실행 (그리고 희망적으로 잘 실행되는)을 확인하고 싶습니다. 누군가 더 나은 아이디어가 있는지 또는 방법이 있는지 확인하고 싶습니다. 내가하고있는 일을 최적화하십시오. 나는 층상 Windows가 Win2000 이상이 필요하다는 것을 알고 있습니다. 이는 이미 다른 이유에 대한 요구 사항이기 때문에 괜찮습니다. 일부 기본 테스트에서 Vista에서는 괜찮아 보이지만 아직 보장은 아닙니다.

내가하는 일은 다음과 같습니다. 창이 있습니다. 컨트롤과 텍스트가있는 창문이 있습니다. WS_CHILD 대신 WS_POPUP 스타일을 제외하고는 Window A의 아이로 창 B를 가지고 있으므로 A 지역 외부에 위치 할 수 있으며 A의 컨트롤 위에 그려집니다. Window B는 또한 WS_EX_LAYERED 스타일을 가지고 있으며 초기화시 updatelayeredwindow ULW_ALPHA 플래그와 알파 채널이 장착 된 32 비트 비트 맵이 장착 된 소스 DC와 함께 픽셀 당 알파로 그릴 수 있습니다.

창 B의 소스 DC에 사용 된 비트 맵은 창의 배경에서 전체 투명도로 부드럽게 혼합하려는 창의 테두리 주변의 픽셀입니다. 나는 두 개의 두 개의 창 접근 방식을 건너 뛰고 단일 레이어드 창을 사용합니다. updatelayeredwindow를 사용할 때 일반적인 WM_Paint 메시지와 그 모든 대신에 메모리에 보관 된 버퍼에서 그려져서 얻으려고한다는 점을 제외하고는 단일 레이어가있는 창을 사용합니다. 대화식 아동 제어 (및 어린이 창)은 놀라운 번거로 들리는 소리처럼 들립니다 (아마도 모든 것에 효과가 없을 것입니다).

따라서 기본적으로 모든 어린이 컨트롤이있는 창 A이며 Window B가 직접 위에 떠 다니면서 멋진 부드러운 테두리를 그립니다. WM_MOVE 메시지와 함께 WINDER B를 사용하여 WM_MOVE 메시지에 응답하고 Window B가 비활성화되어 초점이나 입력을 얻지 못할 수 없습니다 (클릭은 이미 통과 할 수 없습니다. 내부 부분 중에서 이미 피킹에서 제외되었습니다).

차기의 경우, 조각의 모습이 여기에 있습니다.

  • 창 A의 배경, 시안으로 완전히 투명한 픽셀을 마스킹하는 데 사용됩니다.
  • 창 B의 비트 맵, 알파 채널 (물론 사진이 아닌 JPG)을 사용하면 비 블랙 픽셀을 투명성으로 혼합 할 수 있습니다.
  • 결합 된 결과

그래서 그것은 효과가 있지만, 그것이 실제로 이것을하는 가장 좋은 방법이라고 확신 할 수는 없습니다. 두 가지 질문이 있습니다.

  • 이 소리가 받아 들여질 수 있습니까, 아니면 눈에 띄게 끔찍한 것이 있습니까?
  • 현재 작동하는 것처럼, 0이 아닌 불투명도 데이터가 거의 없더라도 창 크기 (최대 1024x768 일 수 있음)를 오프 스크린 버퍼를 사용하는 것처럼 보입니다. 오버 헤드의 가치가있을 것입니다. 그리고 그것을 별도의 테두리 조각으로 자르고 함께 합성하는 추가적인 복잡성?
도움이 되었습니까?

해결책

내 제품은 계층화 된 Windows를 사용하여 각 창에 첨부 한 작은 탭을 그립니다. 층상 창문을 사용하여 별명없이 부드러운 반올림을 얻었습니다. 내가 지금까지 발생한 유일한 불쾌한 문제는 일부 Opengl Windows가 Windows XP의 층상 Wind 낮은 수준의 문제와 Microsoft는 굉장히 도움이되지 않았습니다. Google 어스를 열고 메인 렌더링 창으로 응용 프로그램을 드래그하여 재현 할 수 있습니다. 레이어링 된 창이 사라집니다.

다른 팁

한 가지를 알았습니다. 별도의 프레임 조각을 갖는 것은 하나의 하나의 거대한 프레임 창을 사용하는 것보다 훨씬 빠르게 렌더링 될 수 있습니다. 실제 숫자는 없지만 두 가지를 모두 시도하는 빠른 테스트만으로도 풀 프레임 창이 서로 겹치는 여러 창이 눈에 띄는 대기 시간이 있었지만 프레임이 더 작은 구성 요소로 자르면 훨씬 더 딱딱했습니다. . 자체 장치 컨텍스트가있는 여러 계층의 창을 사용하는 오버 헤드는 그다지 크게 기여하지 않으며 픽셀이 크게 늘어나지 않습니다 (공백 또는 그렇지 않음!).

  1. RDP 및 VM (Hyper-V & VMware)에서 테스트하는 것을 잊지 마십시오.
  2. 여러 GFX 카드와 넷북 및 랩톱에서 사용해보십시오 (해당되는 경우).
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top