문제

배경:나는 유명한 Sasami2k에서 영감을 받은 UI를 갖춘 작은 비디오 재생 앱을 가지고 있는데, 방금 VMR9를 사용하도록 업데이트되었습니다(예:DirectShow가 포함된 Direct3D9) 덜 불안정합니다.현재는 필요에 따라 원시 Win32를 사용하는 C++ 앱입니다.다양한 툴킷 중 어느 것도 가치가 없습니다.특히 WPF는 공역 제한으로 인해 불가능했습니다.

자, 이제 D3DImage가 존재하므로 D3D/VMR9/DirectShow와 WPF를 혼합하고 일치시키는 것이 가능할 수 있습니다.Win32의 비확장성에 대한 과거의 불만을 고려하면 이는 좋은 일인 것 같습니다.

하지만 알다시피, 나는 여기서 첫 번째 장애물에 빠지고 있습니다.

Win32를 사용하여 크기 조정이 가능하고, 비율에 맞게 크기가 조정되고, 화면 가장자리에 맞춰지고, 최대화되면 전체 화면(작업 표시줄 영역 포함)을 차지하는 경계 없는 창을 (아주 쉽게) 만들었습니다.이것은 비디오 앱이므로 이것들은 모두 매우 바람직한 속성입니다.

좋습니다. 그러면 WPF로 동일한 작업을 수행하는 방법은 무엇입니까?

Win32에서는 다음을 사용합니다.wm_getminmaxinfo 최대화 동작을 제어하기 위해 wm_nchittest 크기 조정 테두리 제어 wm_moving snap-to-screen-edges wm_sizize resize 종횡비를 제어합니다.

그러나 WPF를 보면 문서를 오해하지 않는 한 다양한 이벤트가 너무 늦게 도착하는 것 같습니다.

예를 들어, LocationChanged는 창이 이동한 후에만 실행된다고 말하므로(너무 늦음) 이동 중에 언제인지 알 수 없습니다.마찬가지로 StateChanged는 창이 복원/최대화된 후에만 실행되는 것으로 보입니다(시스템에 올바른 최대화 크기를 알리기 위해 최대화하기 전에 정보가 필요한 경우).

그리고 시스템에서 크기 조정에 관해 알려주는 부분을 완전히 간과하고 있는 것 같습니다.히트 테스트도 마찬가지입니다.

그럼, 어, 제가 여기서 뭔가를 놓치고 있는 건가요, 아니면 어쨌든 이 것의 wndproc를 연결하는 것 외에는 선택의 여지가 없나요?WndProc을 연결하지 않고도 원하는 것을 할 수 있나요?

WndProc를 사용해야 한다면 기존 코드베이스를 고수하는 것이 좋습니다.저는 더 간단하고 깔끔한 UI 코드를 원하며 WndProc에서 벗어나는 것이 이에 대한 기본입니다.

WndProc을 연결해야 한다면 다음 사항이 궁금합니다.?Win32에는 크기 조정/크기 조정, 이동/이동, 위치 변경/변경된 창 메시지가 있으며 모두 유용합니다.WPF가 동일한 이벤트 세트를 복제하지 않는 이유는 무엇입니까?기능상 불필요한 공백이 있는 것 같습니다.

또한 이는 WPF가 특정 USER32 종속 구현에 연결되어 있음을 의미합니다.이는 MS가 WPF를 "네이티브"로 만들고 레거시 앱에 대해 HWND 및 WndProcs를 에뮬레이트하기 위해 디스플레이 계층을 반전할 수 없다는 것을 의미합니다. 비록 이것이 바로 MS가 수행해야 하는 작업이지만 말입니다.

도움이 되었습니까?

해결책

그리고 시스템에서 크기 조정에 관해 알려주는 부분을 완전히 간과하고 있는 것 같습니다.히트 테스트도 마찬가지입니다.

크기 조정을 위해 실제로 누락되었습니다. 크기가 변경됨 이벤트.AFAIK에는 슬프게도 OnSizeChanging, OnLocationChanging 및 OnStateChanging 이벤트가 없습니다. 창문 .NET에서


나는 그것을 보았지만 크기가 변경된 후에만 실행되는 반면 크기 조정 중에 실행되는 이벤트가 필요하다고 말할 수 있습니다.내가 문서를 잘못 읽지 않고 실제로 지속적으로 발사하지 않는 한?

지속적으로 발사되지는 않지만 아마도 다음을 사용할 수 있습니다. 크기 조정시작 그리고 크기 조정끝 이벤트를 수행할 수 있습니다.


WinForms 이벤트가 아닌가요?

흠, 당신 말이 맞아요.

다른 팁

좋아요, 제 질문에 답하기 위해 저는 Adorners를 놓쳤습니다 (내가 한 검색에서 다시는 돌아 오지 않았기 때문에 그들이 있어야 할만큼 널리 알려지지 않은 것 같습니다).

안타깝게도 WndProc 재정의보다 복잡해 보이지만 내가 원하는 작업을 수행하도록 수동으로 처리하는 것이 가능해야한다고 생각합니다.

코드에서 WindowStyle 속성을 "None"으로, WindowsState를 "Maximized"로 설정할 수 있습니다.

Xaml이 어떻게 생겼는지 잘 모르겠습니다.

아마도 ArrangeOverride 및 / 또는 MeasureOverride를 재정 의하여 누락 된 크기 조정 이벤트를 보완 할 수 있습니까?측정은 첫 번째 단계이며 레이아웃을 새 크기에 맞게 조정해야 할 때 발생하므로 크기 변경 이벤트와 비슷합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top