2010-08-06 3 views
11

내 응용 프로그램은 C# Windows Forms 응용 프로그램이며 닷넷은 어떻게하면 내 응용 프로그램의 창 (어디서나)을 클릭해야만 내 메인 메뉴 모음과 도구 모음 단추의 기본 동작을 만들어 응용 프로그램 창을 클릭 할 수 있습니다. 메뉴 또는 툴 스트립 버튼. 이걸 어떻게 바꿀 수 있니?두 번째 클릭이 버튼을 선택하기 전에 창을 활성화하려면 클릭이 필요합니다. 이걸 어떻게 바꿀 수 있니?

메모장 및 워드 패드와 같은 오래된 앱은 이런 식으로 행동하지 않습니다. 그러나 모든 Microsoft Office 응용 프로그램은 그렇게합니다. 그러나 이것은 매우 성가신 일입니다!

내 응용 프로그램이 보조 창을 팝업하고 창을 변경할 때마다 문제가 발생합니다. 먼저 불필요한 창을 활성화해야 아무 것도 할 수 없습니다. 아!

이 동작을 변경하는 데 전 세계적으로 도움이되기를 기대하며 개별적으로 많은 컨트롤을 재정의 할 필요가 없습니다. 아무도 몰라?

내 응용 프로그램의 대화 상자에있는 컨트롤은이 어리석은 동작을 나타내지 않습니다. 왜 다른가?

+0

이것은 Mac OS X에서 어떤 프로그램을 사용하는 것과 같습니다. – Guttsy

답변

13

글쎄, 내 간단한 해결책을 찾았다. 그냥 맥 OS X처럼, 윈도우가 먼저이 전에 창을 활성화하는 일을 필요로하는 GUI 스타일의 결정을 한 것으로 나타납니다

// This version of ToolStrip enables mouse click's even when the main form is NOT active. 
private class MyToolStrip : ToolStrip 
{ 
    const uint WM_LBUTTONDOWN = 0x201; 
    const uint WM_LBUTTONUP = 0x202; 

    static private bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg==WM_LBUTTONUP && !down) { 
      m.Msg=(int)WM_LBUTTONDOWN; base.WndProc(ref m); 
      m.Msg=(int)WM_LBUTTONUP; 
      } 

     if (m.Msg==WM_LBUTTONDOWN) down=true; 
     if (m.Msg==WM_LBUTTONUP) down=false; 

     base.WndProc(ref m); 
    } 
} 

다음과 같이 난 내 자신의 ToolStrip 클래스 (및 MenuStrip 클래스)를 도출 모든 컨트롤을 선택할 수 있습니다. 그러나 Windows에서는 ToolStrip 및 MenuStrip과 같은 특정 컨트롤에 대해서만이 작업을 수행합니다. 윈도우가 활성화되어 있지 않으면 이러한 컨트롤은 마우스 DOWN 이벤트로 보내지지 않습니다. WinForms가이 GUI 가이드 라인을 어떻게 적용하는지 잘 모르겠지만 아마도 Application.AddMessageFilter()를 사용하여 메시지 필터를 사용합니다.

상관없이 MenuStrip은 마우스 UP 이벤트를 제어합니다. 그리고 그것은 내 솔루션에 영감을주었습니다. 단순히 마우스 UP 이벤트가 해당 DOWN 이벤트가 누락되어 있는지 찾습니다. 이 특별한 경우를 보았을 때 저는 직접 마우스 다운 이벤트를 생성하고 ToolStrip 컨트롤의 경우 세상이 모두 행복합니다. (다음 "MAINMENU"를 찾을 수 Visual Studio에서 사용 메뉴 "도구"를 선택한 후 옵션 "도구 상자 항목 선택")

도구 상자 표시 줄 위에

등록 MAINMENU 구성 요소 : :-)

+0

나는 이것을 시도했지만 훌륭하게 작동합니다. 이것은 잠시 나를 괴롭 히고있다. –

+0

나는이 동작이 실제로 짜증나고 모순되는 것을 발견했다. 기본 제공 Office 컨트롤에 대한 해결책이 있습니까? –

+1

감사합니다 AZDean. 너는 나의 날을 구했다. –

-1

MouseClick 이벤트에 가입하면 응용 프로그램에 포커스가없는 경우에도 양식의 클릭을 감지 할 수 있습니다.

양식을 클릭하면 이전에 양식에 포커스가 있는지 여부와 상관없이 콜백이 표시됩니다.

그런 다음 원하는 컨트롤을 클릭하여 시뮬레이션 할 수 있습니다.

이것은 대단히 훌륭한 해결책은 아니지만 작동해야합니다. 클릭이 툴바 버튼에 두 번 전송되지 않도록해야합니다.

0

이 간단한 해결책이 될 것 같다 , 그리고 MenuStrip 대신 폼에 사용하십시오.

관련 문제