none
CButton in CDockablePane RRS feed

  • Frage

  • Hi MSVC++ Forum,

    hab mal wieder eine Frage ;) Habe ein CDockabePane gebastelt was mir ein paar Sachen darstellt und 4 Buttons enthält. Leider werden mir die Buttons ständig deaktiviert. Jetzt hab ich mal den Holzhammer versucht und in OnTimer() die Buttons mit EnableWindow(TRUE) enabled, aber sie werden immer noch direkt wieder deaktiviert.

    Die Buttons werden mit folgendem Code erzeugt.

    	// create buttons
    	if (!m_button_reset_good.Create(_T("xxx"),	WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER | WS_TABSTOP , rectDummy, this, IDC_BUTTON_RESET_GOOD)		||
    		!m_button_reset_bad.Create(_T("xxx"),		WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER | WS_TABSTOP , rectDummy, this, IDC_BUTTON_RESET_BAD)		||
    		!m_button_reset_parts.Create(_T("xxx"),	WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER | WS_TABSTOP , rectDummy, this, IDC_BUTTON_RESET_PARTS)	||
    		!m_button_start_bypass.Create(_T("xxx"),	WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER | WS_TABSTOP , rectDummy, this, IDC_BUTTON_START_BYPASS))
    
    	{
    		TRACE0("Fehler beim Erstellen der Buttons.\n");
    		return -1;      // Fehler beim Erstellen
    	}
    
    

    In OnSize() werden sie angeordnet was auch funktioniert. Läuft etwa hier was schief?

    	m_button_reset_good.SetWindowPos(NULL,		dx					, rectClient.top + 1 * delta, delta,		delta, SWP_NOACTIVATE | SWP_NOZORDER);
    
    


    Gruß

    schorsch


    • Bearbeitet schorsch_76 Donnerstag, 22. Dezember 2011 17:52
    Donnerstag, 22. Dezember 2011 17:51

Antworten

  • Weil Du keinen ON-UPDATE_COMMAND Handler hast, bzw, keinen ON_COMMAND Handler für Deinen Button!
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert schorsch_76 Sonntag, 25. Dezember 2011 15:39
    Samstag, 24. Dezember 2011 11:33
    Moderator

Alle Antworten

  • Hi,

    jetzt hab ich bischen weiter geforscht. Habe in CWnd::EnableWindow(BOOL bEnable) einen bedingten Breakpoint mit bEnable = FALSE gesetzt. Jetzt wird dieser Breakpoint getriggert mit dem folgendem Callstack:

      mfc100d.dll!CWnd::EnableWindow(int bEnable)  Zeile 352 C++
      mfc100d.dll!CCmdUI::Enable(int bOn)  Zeile 715 C++
      mfc100d.dll!CCmdUI::DoUpdate(CCmdTarget * pTarget, int bDisableIfNoHndler)  Zeile 813 C++
      mfc100d.dll!CWnd::UpdateDialogControls(CCmdTarget * pTarget, int bDisableIfNoHndler)  Zeile 4699 C++
      mfc100d.dll!CDockablePane::OnUpdateCmdUI(CFrameWnd * pTarget, int bDisableIfNoHndler)  Zeile 2784 C++
      mfc100d.dll!CBasePane::OnIdleUpdateCmdUI(unsigned int wParam, long __formal)  Zeile 758 C++
      mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult)  Zeile 2383 + 0x11 Bytes C++

    Die Frage ist: Warum wird deaktiviert mir CDockablePane::OnUpdateCmdUI() meine Buttons?

    Gruß

    schorsch

    Freitag, 23. Dezember 2011 15:40
  • Weil Du keinen ON-UPDATE_COMMAND Handler hast, bzw, keinen ON_COMMAND Handler für Deinen Button!
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert schorsch_76 Sonntag, 25. Dezember 2011 15:39
    Samstag, 24. Dezember 2011 11:33
    Moderator
  • Hallo Martin,

    nach Anlegen eines OnCommand/OnUpdateCommand Handlers werden mir die Buttons nicht mehr deaktiviert. Dennoch frage ich mich warum ein CButton in einem CDockablePane einen OnCommand Handler braucht. Für meine momentane Sicht der Dinge wirkt das wie ein Workaround da in meinem Fall diese Handler leere Funktionen sind. Oder ist das beabsichtigt?

    Gruß

    schorsch



    • Bearbeitet schorsch_76 Sonntag, 25. Dezember 2011 15:41
    Sonntag, 25. Dezember 2011 15:39
  • > nach Anlegen eines OnCommand/OnUpdateCommand Handlers werden mir die Buttons nicht mehr deaktiviert. Dennoch frage ich mich warum ein CButton in einem CDockablePane einen OnCommand Handler braucht. Für meine momentane Sicht der Dinge wirkt das wie ein Workaround da in meinem Fall diese Handler leere Funktionen sind. Oder ist das beabsichtigt?

    Und wie wird dann die Funktion zu diesem Button ausgeführt?
    Das Command-Routing ist ein elementarer Bestandteil des MFC Frameworks.

    WM_COMMAND Nachrichten werden durch die entsprechenden Module Deiner Anwendung weitergreicht und der passende Handler wird gesucht.
    Wird kein Update Handler gefunden wird ein Command Handler gesucht.
    Wird weder Command Handler noch Update Handler gefunden hat dieser Button keinen Nutzen (tut nix) also wird er disabled.

    Ein OnCommand Handler müsste also bei Dir genügen.

    PS: Wenn Du On-Command Handler nicht benutzt, dann hast Du deren Nützlichkeit noch nicht verstanden ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 1. Januar 2012 09:25
    Moderator