2012-01-25 2 views
4

내 응용 프로그램에 두 개의 양식이 있습니다 MainFormHexCompare입니다. 내 응용 프로그램을 다른 창에서 클릭하면 두 양식 중 하나를 다시 클릭하면 그 중 하나만 앞으로옵니다. 두 가지 양식 중 하나를 클릭하면 응용 프로그램의 모든 열린 양식의 맨 위에 모두 표시됩니다. 지금은 (창 내 스택의 상단을 얻기 위해 개별적으로 각 양식을 선택해야하고이 때문에 HexCompare 길 작업이의 ShowInTaskbar 세트하나의 양식을 선택하면 프로그램과 관련된 모든 양식이 앞으로 오게됩니다.

false에 대한 좋은 예를 가지고 있다는 사실에 매우 짜증나는 일 수있다 가장 원하는 찾기 대화 상자의 작동 방식을 원합니다. 찾기 대화 상자를 클릭하면 다른 응용 프로그램에 의해 숨겨진 경우 주 양식이 앞으로 나오고 기본 양식을 클릭하면 찾기 대화 상자가 앞으로옵니다. 다른 응용 프로그램에서 숨겨진. MainForm가 호출되는 방법

.

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new MainForm()); 
} 

HexCompare

private void lstCaputres_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var selectedItem = (Tuple<DateTime, byte[]>)lstCaputres.SelectedItem; 
    if (hexCompare == null || hexCompare.IsDisposed) 
    { 
     hexCompare = new HexCompare(selectedItem.Item2); 
     hexCompare.Show(); 
    } 
    else 
     hexCompare.ChangeValue(selectedItem.Item2); 
} 

편집 호출 방법 :

ParentHexCompare의 값이 Null 것 같다입니다. 어떻게 든 그것을 MainForm으로 설정할 수 있다면 내 문제를 해결할 수 있을까요? 그렇다면 어떻게 설정해야합니까?

EDIT2 :

내가 가진 반 해결 티그의 솔루션을 사용하여하지만 난 여전히 관심이 더 나은 솔루션이있는 경우 각 양식은 전면에 데려으로 점멸됩니다. 나에게

//In MainForm.cs 
private void MainForm_Activated(object sender, EventArgs e) 
{ 
    hexCompare.BringToFront(); 
    this.BringToFront(); 
} 

//in HexCompare.cs 
private void HexCompare_Activated(object sender, EventArgs e) 
{ 
    parent.BringToFront(); 
    this.BringToFront(); 
} 

답변

5

API wrapper을 사용하면 포커스를 놓치지 않고 양식을 Z 순서의 앞쪽으로 가져올 수 있습니다. 이 함수는 기본 폼의 Activated 이벤트에서 호출 할 수 있습니다. HexCompare 폼을 매개 변수로 전달하면됩니다. 이것은 이 아닙니다.은 다른 답변과 다르지만 의견에서 언급 한 것처럼 깜박임을 목격 한 적이 없습니다. 그것은 첫째로 급부상는 문제가없는 경우

private const int SW_SHOWNOACTIVATE = 4; 
    private const int HWND_TOPMOST = 0; 
    private const uint SWP_NOACTIVATE = 0x0010; 

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
    static extern bool SetWindowPos(
     int hWnd,   // window handle 
     int hWndInsertAfter, // placement-order handle 
     int X,   // horizontal position 
     int Y,   // vertical position 
     int cx,   // width 
     int cy,   // height 
     uint uFlags);  // window positioning flags 

    [DllImport("user32.dll")] 
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

    public void ShowInactiveTopmost(Form frm) 
    { 
    ShowWindow(frm.Handle, SW_SHOWNOACTIVATE); 
    SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST, 
    frm.Left, frm.Top, frm.Width, frm.Height, 
    SWP_NOACTIVATE); 
    } 
+0

'ShowWithoutActivation'이란 무엇입니까? 나는 어디에서든지 사용되는 것을 보지 못합니다. 그러나 당신의 솔루션은 플리커를 제거하는데, BringToFront보다 훨씬 낫습니다.때때로 ListBox에서 선택한 항목이 선택 취소 된 다음 매우 빠르게 선택되지만 다른 항목은 완벽하지 않습니다. –

+0

미안하지만, 내 복사/붙여 넣기에 열중 해있는 것 같습니다. 나는 그것을 편집 할 것이다. 도움이 되니 기쁜 데, 그것은 우리에게 1 톤을 도왔습니다! –

0

TopMost=true을 설정하고 두 형태에 BringToFront()를 호출하기에 충분해야한다 보인다.

hexCompare = new HexCompare(selectedItem.Item2); 
hexCompare.TopMost = true; 
hexCompare.Show(); 
hexCompare.BringToFront(); 

이와 비슷한 것입니다.

+0

, 난 두 형태의 Activated''내부의 코드를 삽입하는 경우 솔루션이 작동하지만,이 솔루션은 일반적인 경우에 대한 확장 성하지 않을 것 같다 볼 수 있었다. –

+0

@ScottChamberlain : 왜 안되나요? 필요없는 경우'TopMost = true'를 설정하는 것을 피할 수 있습니다. – Tigran

+0

작동하지만 각 양식에 초점을 맞추면 양식이 깜박입니다. 이것은 효과가 있지만 더 나은 해결책이 있는지 정말로보고 싶습니다. –

관련 문제