2014-07-16 4 views
0

하나의 자식 폼에서 다른 자식 폼으로 전환 할 때 이상한 일이 발생합니다. 표시 할 폼이 최소화되고 복원 된 다음 최대화 된 것처럼 이상한 방식으로 나타납니다. 동시에 여러 드로잉 이벤트와 같은 효과를 일으 킵니다.C# MDI WinForms 자식 정품 인증

문제는 이러한 상황에서 (즉, 모든 작품) 나타나지 않습니다

:

  • 하나 CTRL + TAB 또는 CTRL + SHIFT + TAB를 사용하여 형태를 전환
  • 하위 양식이 최대화되지 않고 양식의 순서/위치가 변경되는 경우

아마도 관련이 있습니다.

  • child.Focus()
  • child.Show()
  • child.Activate()
  • child.Select()
  • child.BringToFront()

내 질문 : 하나 포함 형태를 보여주는라고 할 수 방법의 톤 (및 관련)이 있습니다 정확히 내가 뭐라 부를까요?

편집 : 그것은 아무튼 .Select()없이 :

private void tabForms_MouseClick(object sender, MouseEventArgs e) 
{ 
    // handle middle-mouse-button click (close) 
    if (e.Button == System.Windows.Forms.MouseButtons.Middle) 
    { 
     // See: http://stackoverflow.com/a/745361 
     TabPage tab = tabForms.TabPages.Cast<TabPage>().Where((t, i) => tabForms.GetTabRect(i).Contains(e.Location)).FirstOrDefault(); 
     if (tab != null && tab.Tag != null) (tab.Tag as Form).Close(); 
    } 
    // handle left-mouse-button click (show) 
    if ((tabForms.SelectedTab != null) && (tabForms.SelectedTab.Tag != null) && (ActiveMdiChild != tabForms.SelectedTab.Tag)) 
    { 
     (tabForms.SelectedTab.Tag as Form).Select(); 
     (tabForms.SelectedTab.Tag as Form).Show(); 
    } 
} 

PS : 내 경우

, 나는 여전히 작동하지만 다음 코드는 내가 위에서 설명한 이상한 효과가 발생했다 일하지 마라. 비록 내가 .Select().Show().Focus()으로 대체하면 여전히 작동하는 것으로 보입니다.

+0

이것은 MDI 문제이므로 활성화 된 하나의 최대화 된 하위 창만 지원할 수 있습니다. 그림 크기가 작 으면 크기 조정 아티팩트가 추악합니다. 자녀가 항상 극대화되기를 원할 때 MDI를 사용하지 마십시오. 아무런 의미가 없습니다.대신 UserControls 또는 TopLevel 속성이 * false *로 설정된 폼을 교체하십시오. –

+0

@HansPassant 나는 당신이 말하는 것을 이해하는지 모르겠다 ... 어린이 양식은 형식 ... 어떻게 mdi없이 그들을 포함시킬 수 있습니까? 또한, 당신이 UserControls 또는 TopLevel 도움이 될 의미가 무엇인지 이해하지 못했습니다. 감사. – Christian

+0

당신은 내가 당신을 도울 수있는 많은 리드를주지 않습니다. 적어도 "Form.TopLevel"을 검색 상자에 넣고 가장 많이 투표 한 게시물을 봅니다. –

답변

2

지금은 오래되었을 수도 있지만이 문제가있는 다른 모든 사용자를 위해 간단한 해결책이 있습니다. 양식에 창 핸들을 제공하고 폼을 만들고 최대화 한 다음 다시 LockWindowUpdate를 호출하고 IntPtr.Zero 값을 제공하는 Win32 메서드 LockWindowUpdate을 호출 할 수 있습니다 (아래 그림 참조).

try 
{ 
    LockWindowUpdate(this.Handle); 

    // Open your form, maximise it etc 
} 
catch (Exception ex) 
{ 
    // Handle any errors 
} 
finally 
{ 
    LockWindowUpdate(IntPtr.Zero); 
} 

LockWindowUpdate 창을 그리기 재개 제로를 IntPtr로 두 번째를 호출, 당신이 그것을 제공 중 창 핸들 그리기 사용할 수 없습니다. 한 번에 하나의 창만 잠글 수 있습니다.

다른 두 가지가 필요합니다. DLL 가져 오기 및 System.Runtime.InteropServices에 대한 참조 사용 DLL 가져 오기는 다음과 같습니다.

[DllImport("user32.dll", EntryPoint = "LockWindowUpdate", SetLastError = true, 
     ExactSpelling = true, CharSet = CharSet.Auto, 
     CallingConvention = CallingConvention.StdCall)] 
public static extern long LockWindowUpdate(IntPtr hWndLock); 
+1

작동하지만 몇 가지 사항을 수정해야했습니다. * 첫째, * 나는 다음과 같이 호출을 가져와야했다 :'[DllImport ("user32.dll")] public static extern bool LockWindowUpdate (IntPtr hWndLock); * 둘째로, 나는 방금 전에 제안한 것처럼 그 함수를 호출해야했다. 'subForm.Focus(); '를 호출 한 후. – Christian

+0

크리스찬. 외부 메소드 참조를 포함하도록 답변을 업데이트하겠습니다. –