2014-08-29 1 views
1

System.Windows.Forms.Form 창이 있는데, 이벤트는 Control.Invoke()과 함께 전달되어야합니다. 그러나 양식에서 Show()을 호출하기 전에 메시지가 배달되지 않습니다. show()를 호출하지 않고 양식의 메시지 루프를 시작하십시오.

는이 문제를 해결하기 위해, 나는 폼의 생성자에서이 kludge 시도 :

this.Show(); 
this.Hide(); 

이 작동을하고, 메시지가 현재 전달 얻고있다. 그러나 양식을 구성 할 때 창을 깜박입니다. 내가 원하는 것을 얻기위한보다 우아한 방법이 있습니까?

.NET 2.0 (새로운 버전은 허용되지 않음)으로 작업하고 있습니다.

+1

헉, 2.0에서 id는 행복하게 답변을 찾았습니다. 레이아웃 일시 중지 또는 끌기 일시 중지로 놀아보십시오. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout(v=vs.110).aspx – DidIReallyWriteThat

+0

'this.CreateControl()'또는 'this.Handle' 나는 그렇게 추측한다. –

+0

가능한 해킹 : 표시/숨기기를 호출하기 전에 일시적으로 위/왼쪽 좌표를 음수로 설정하고 양식을 디스플레이 표면 밖으로 이동합니다. –

답변

2

Control.Invoke의 기준은 Handle이 작성되어야한다는 것입니다. ShowHide을 호출 할 필요없이 Handle을 강제로 생성 할 필요가 없습니다.

이 시점에서
Form yourForm = new Form(); 
var handle = pbForm.Handle;//Force create handle 

당신이 할 수 yourForm.Invoke

주를 호출 할 수 있습니다 양식의 양식을 표시하지 않는 한 Load 이벤트 및 Shown 이벤트가 발생되지 않습니다. 따라서 모든 코드는 해당 이벤트에 따라 다릅니다.

코드가 Load 또는 Shown 이벤트에 의존하는 경우 해킹이 필요합니다. 양식을 매우 작게 만들어 사용자가 알 수 없도록 한 다음 (아마도 1,1 크기) ShowHide으로 전화하십시오. 나중에 사용자에게 양식을 표시해야 할 때 어떤 점에서 괜찮은 것을 설정할 수 있습니다. Size.

+0

네, CreateControl()과'this.Handle' (원래 코멘트에서 읽음)을 시도했습니다. 후자 만 작동합니다. 나는 단순히 'var bogus = this.Handle;'을 사용했다. 옵티마이 저가 조금 걱정 되긴하지만. 나는'Handle' getter의 부작용이 이것을 최적화하지 못하게 할 것이라고 생각합니까? (Btw, 내 경우에는'Load'와'Shown' 이벤트가 중요하지 않습니다.) –

+0

@NikosC. 이 주제의 전문가는 아닙니다. 더 안전한면을 지키기 위해서는 'Handle'을 어떻게 든 사용하는 척하면서 jit 및 컴파일러 최적화 프로그램을 속일 수 있습니다.최적화 할 수없는 Console.WriteLine (this.Handle);을 예로 들어 보겠습니다. –

+0

흠,이 경우에는 'volatile'멤버에 할당 할 것입니다. 너무 나쁜 '휘발성'은 로컬 바에서 허용되지 않습니다. –

관련 문제