2010-06-22 3 views
2

기본 폼이없는 winforms 응용 프로그램이 있습니다.이 도구는 단순한 파일 처리 도구이므로 실제로는 필요하지 않습니다.기본 폼이없는 Winforms 응용 프로그램 - 대화 상자가 위에 표시되지 않습니다.

응용 프로그램이 시작되면 먼저 OpenFileDialog를 사용하여 파일을 선택합니다. 그런 다음 대화 상자는 Showdialog()를 사용하여 선택한 파일의 처리 방법에 대한 옵션을 표시합니다. 마지막으로 파일이 실행되는 동안 진행률 막대 양식이 표시되고 응용 프로그램이 종료됩니다.

문제는 Visual Studio에서 디버깅 할 때 중간 양식이 Visual Studio와 같은 다른 열린 창 위에 표시되지 않는다는 것입니다. 컴파일 된 실행 파일을 실행할 때 제대로 작동하는 것 같습니다.

일반적으로 ShowDialog가 나타나는 대화 상자가 나오면 해결 방법은 내가 소유자가 없다는 것을 말할 수있는 기본 양식이 없으면 Showdialog (소유자) 호출을 사용하는 것입니다. 세트.

그렇다면 어떻게하면 OpenFileDialog가 자동으로 수행하는 것과 같은 방식으로 대화 상자를 다른 창의 위에 표시 할 수 있습니까?

+0

"다른 창의 위에 표시되지 않습니다" 응용 프로그램이나 바탕 화면의 다른 창은 무엇입니까? –

+0

내 응용 프로그램에 다른 창이 없습니다. ShowDialog 호출로 인해 Visual Studio 뒤에 나타나는 대화 상자가 나타납니다. –

답변

3

나는 당신이 말한 것을 정확히 알고 있으며 문제는 실제로 Windows가 포커스를 처리하는 방식에 동의하지 않는 앱 디자인과 관련이 있습니다. Windows는 win31 이후 이러한 유형의 작업을 수행했습니다. 그것은 토지 잡아 먹는 것과 같습니다. 앱에서 창을 표시 한 다음 숨기기/사용 중지하면 잠에서 쉴 때 Bill에 따르면을 잃게됩니다. 수정 : 메인 윈도우가 필요합니다! 또는 OS를 전환하십시오. EXE에서 작동하기 때문에 사용자 중 한 명이 배치 파일이나 다른 탐색기에서 벗어날 때 작동한다는 것을 의미하지는 않습니다.

당신은이 3 개의 별개의 exes에서 당신의 탈출구를 찾을 수 있습니다; Sub Main의 3 Application.Run 스레드에서 실행 해보십시오. SetTopMost를 사용하여 AppActivate하십시오.

또는 SDK 호출을 사용하여 앱에 입력 포커스를 부여하는 방법을 찾으십시오. 연속 된 Windows 버전은이를 사용하는 불쾌한 앱을 완화하기가 어려웠습니다 (따라서 w98에서이를 수행 할 수있는 앱은 taskbar orange in xp) - 프로그래머는 당연히 그 일을 처리했습니다. 너 그렇게 할 수있어.

하지만 잘못했을 수 있습니다. 리팩토링 (refactor)은 순서대로 이루어지며 미래의 앱을 위해 stragegy가 변경됩니다. 이것은 내가 한 결정이 아닙니다. 창문이 작동하는 방식은 돌로 설정되고, 사용자가 작동하도록 기대하는 방식은 돌보다 더 두려운 수백만의 뇌에 설정되어 있습니다 - 흐름으로 수영하십시오! 진짜 영향을

쉬운 리팩토링 :

  • 돌아 가기 프로젝트까지 (또는 TFS에 사본을 보류) 옵션 대화 상자에서
  • 은, 모든 컨트롤을 잘라. pnlOpts라는 이름의 양식 크기 패널을 넣으십시오. 그들을 붙여 넣으십시오.
  • 해당 양식을 기본 양식으로 지정하십시오.
  • form_shown에서 pnlOpts.Visible = false를 설정하거나 그 방법으로 기본값을 설정합니다. (약간의 쓰레기를 남기려면 다른 패널을 앱 이름 또는 배경 이미지로 표시 할 수 있습니다.)
  • 전화 이 영역의 파일 dlg도 표시하는 설정 코드
  • 파일 dlg가 해당 양식을 부모로, 시작 위치가 center-parent (소유자가 아님)로 설정하십시오. Cancel from this = 설정 양식을 닫습니다.
  • 이 작업이 완료되면 pnlOpts를 표시하십시오.
  • 확인 단추에서 진행률 표시 줄을 수행하는 코드를 호출하십시오. 여기서 다시 pnlOpts를 숨기거나 비활성화 할 수 있습니다.
  • 전체 창에서 Visible = false 또는 enabled = false를 숨기거나 숨길 수 없으면 창 초점 맞추기 (여기서 불행의 원인 임)가 발생합니다.

여기에 실제 키는 한 줄의 대답은 : 당신이 그 기능을 사용하지 않으려면 그냥 회색, 항상 볼 수 및 활성화 메인 창을 떠나거나 모든 컨트롤을 숨 깁니다. 이것은 패널과 함께하는 것이 가장 쉽습니다. 원하는 경우 다른 패널이나 이미지를 즐겁게 보이도록 표시 할 수 있습니다 (특히 회색으로 표시되면 [.enabled = false] 내용이 이해가 안되는 경우).

당신은 그런 모습을 좋아하지 않거나 처음부터 그렇게 만들었지 만 수백만 줄의 Windows 코드와 수백만 명의 Windows 사용자가 수동적으로 적극적으로 당신과 의견을 달리하고 있습니다. !

+0

또 다른 방법은이 콘솔 응용 프로그램을 만들고 다른 개체의 부모를 위해 콘솔을 사용하는 것입니다. 이것은 더 쉬울 것이지만 훨씬 더 좋지 않을 것입니다. 당신은 아마도 작은 메인 윈도우가 항상 백그라운드에서 놀고있을 가능성에 대한 개념을 생각했을 것입니다. 목록에 추가 할 또 다른 해킹은 그것을 할 것이고 꺼져 버리면됩니다 : >-) 그러나 windows 8은 그것을 확인하고 당신을 처벌 할 것입니다. – FastAl

+0

Sigh. 리팩토링. –

+0

나는 알고있다, 나는 알고있다 ... 나는 펄프에 여러 번 창문으로 맞았다. 이제 나는 좋은 작은 프로처럼 행동하고 그냥 따라 놀아. 한숨. – FastAl

관련 문제