2011-02-24 3 views
1

레이블이 하위 인 단추 재정의가 있습니다. MouseEnter 및 Leave 이벤트가 단추 컨트롤에 첨부되어 있습니다.WPF의 IsHitTestVisible에 해당하는 WinForms

마우스가 레이블에 들어가면 단추의 이벤트가 무효화됩니다 (자연 스럽습니다). 내 질문은 어떻게 실제로 레이블을 사용하지 않고도 레이블의 적중 테스트를 비활성화 할 수 있습니다.

색상을 유지하고 색상을 변경할 수 있기를 원하지만 (예 : 버튼에서 MouseEnter), 마우스가 레이블 위에있을 때 버튼에서 히트 테스트를 고려해야합니다.

추신 : 나는 마우스에 마우스를두고 레이블에 남겨두고 해당 사례를 처리 할 수 ​​있음을 알고 있지만 매개 변수가 바뀌면 (마우스의 색상 입력 및 나가기) 컨트롤은 여전히 ​​올바르게 작동합니다.

답변

1

다른 정보를 찾는 동안이 질문에 가로 질러 가로 챈 다음 수락 된 대답이 실제로 정확하다고 생각하지 마십시오.

레이블을 확장하고 WndProc에서 히트 테스트 응답을 변경할 수 있습니다. 이 줄의 어떤 것 :

public class HTTransparentLabel : Label 
{ 
    private const int WM_NCHITTEST = 0x84; 
    private const int HTTRANSPARENT = -1; 

    protected override void WndProc(ref Message message) 
    { 
     if (message.Msg == (int)WM_NCHITTEST) 
      message.Result = (IntPtr)HTTRANSPARENT; 
     else 
      base.WndProc(ref message); 
    } 
} 
1

짧은 대답은 당신이 할 수 없다는 것입니다. 버튼과 레이블은 사실 창이므로 마우스를 다른쪽으로 가져 가면 mouseenter와 mouseleave 이벤트가 생성됩니다.

진짜 질문은 왜 버튼에 라벨이 필요한지입니다.

+0

접을 수있는 패널이라는 사용자 지정 패널에 대한 사용자 지정 헤더가 필요합니다. 단추를 클릭하면 패널이 확장/축소된다는 것을 알았을 것입니다. 이제 버튼에 두 가지 요소가 있어야합니다. 1. 버튼 (운좋게도 버튼이 있음)과 헤더 텍스트 (2. 텍스트). 버튼의 기본 Text 속성을 사용한다면 두 개 (이미지와 텍스트)가 겹칠 것입니다 (텍스트의 공백 문자는 옵션이 아닙니다). 그래서 레이블 접근 방식으로 왼쪽으로 설정했습니다. 이미지의 깨끗한 이미지와 HeaderText 레이아웃으로 끝납니다. – rotSin

+0

"버튼에 라벨이 필요한 이유는 무엇입니까?" 일반적인 WinForms 버튼은 모든 디자인 요구 사항을 캡슐화 할 수 없기 때문입니다. 또한 WPF는 이런 종류의 행동을 장려하기 때문에 OP에 의한 질문입니다. – teynon