2016-11-29 1 views
0

ON_COMMAND 메시지를 처리하는 Properties라는 CDialogEx 클래스가 있습니다. 이제 메인 메뉴에서 하위 메뉴로 ID_EDIT_PROPERTIES 메뉴 항목을 클릭하면 ON_COMMAND가 호출됩니다. 이벤트 처리기 마법사가 해당 코드를 작성했지만 응용 프로그램을 시작하면 메뉴 항목이 회색으로 표시됩니다. ON_UPDATE_COMMAND_UI가 발생했을 때 EnableMenuItem을 호출하여 수동으로 활성화하려고했지만 아무 소용이 없습니다.MFC 메뉴 항목이 회색으로 유지됩니다.

도움을 주시면 감사하겠습니다.

+1

내 프로젝트의 Document 클래스를 대상으로 처리하면 처리되는 것으로 나타났습니다. 이것은 쉬운 해결 방법입니다. 하지만 CDialogEx 클래스에서 왜 처리 할 수 ​​없는지 궁금합니다. – Michen

+0

'ON_UPDATE_COMMAND_UI' 핸들러가 호출 된 적이 있습니까? –

+0

AFAIK, 대화 상자에 명령 처리기가 호출되지 않습니다. (https://support.microsoft.com/en-us/kb/242577 참조) – Max

답변

0

m_bAutoMenuEnable이 데이터 멤버가 활성화되면 (기본값) ON_UPDATE_COMMAND_UI 또는 ON_COMMAND 처리기가없는 메뉴 항목은 사용자가 메뉴를 가져올 때 자동으로 비활성화됩니다.

0

나는 나는 그것이 CDialogEx 다릅니다 II를 모르는 것을 인정하지만 CDialog 내가 내가 WM_KICKIDLE 이벤트를 처리하지 않는 한 UPDATE_COMMAND_UI 이제까지 작동하지 않는 것을 발견했다. 그것은 here에 관한 짧은 튜토리얼이 있습니다

CWnd::UpdateDialogControls

: 당신의 OnKickIdle 이벤트 핸들러에서

는에 전화를 걸.

CDialogEx이이 정보를 대체하면 용서해 주므로 답변을 제거하겠습니다.

0

당신은 메뉴 항목/비활성화 처리하는 활성화시키는 방법을 이해해야합니다도 ON_COMMAND도 ON_UPDATE_COMMAND_UI 처리기가 있으면

  • 항목을 사용할 수 없습니다.
  • ON_UPDATE_COMMAND_UI 핸들러가 없지만 현재 활성화 된 문서 나 뷰 (또는 "메인 프레임")에 ON_COMMAND 핸들러가있는 경우 해당 항목이 활성화됩니다.
  • ON_UPDATE_COMMAND_UI 처리기가있는 경우 처리기 (pCmdUI->Enable(bEnableState))가 항목을 사용/사용하지 않도록 설정합니다.

    • 대신, 자신을 EnableMenuItem()을 부르는 ON_UPDATE_COMMAND_UI 처리기에 pCmdUI->Enable(bEnableState)를 호출 할 수 있습니다 :

    또한 있음을 유의하십시오. 이는 메뉴 항목뿐만 아니라 주 메뉴, 상황에 맞는 메뉴, 도구 모음 또는 철근 버튼과 같은 다른 "명령"유형 항목 (ID가 같은)에도 영향을줍니다.

  • 처리기를 배치 할 위치는 응용 프로그램 설계의 문제이며 처리 중이거나 나타내는 데이터에 따라 다릅니다. 메인 프레임 클래스 (일부 "전역"데이터 또는 설정에 따라 달라지는 경우), 문서 클래스 (문서의 일부 데이터 또는 설정에 종속되거나 변경되는 경우 - 모든보기에 영향을 줄 수있는 경우) 또는 뷰 클래스 (-es) (현재 뷰에만 영향을 주거나 현재 뷰에만 영향을 줌). 내가 제대로 이해한다면 핸들러가 CDialogEx 파생 클래스에 있기 때문에 귀하의 경우에는

이 항목이 비활성화되어 있지만,이 클래스의 인스턴스가 아직 생성되지 않은 즉, 당신의 ID_EDIT_PROPERTIES에 대한 ON_COMMAND 처리기가 존재하지 않는다 명령.

관련 문제