Problem mit Schaltflächen im nichtmodalen Dlg



  • Hallo,

    Bist du dir sicher, dass der Button deaktiviert ist?

    Ja da ich es sehe daß er ausgedimmt ist, also muß ich davon ausgehen daß die OnClicked-Funktion nicht aufgerufen wird.

    1. Welches Fenster bekommt die Nachricht?

    Das Maindialogfenster (dialogbasierte Applikation).

    void OnButtonClicked
    {
    ::SendMessage (m_hWnd, WMU_DLG_BUTTON_MACHWAS, 0, 0)
    }

    2. Wie ist die WMU definiert?

    #define WMU_DLG_BUTTON_MACHWAS WM_USER+10

    Mit dem Spy habe ich gesehen, daß die WMU abgeschickt wird auch wenn der Button ausgedimmt ist. Irgendwas ist da nicht OK.


  • Mod

    Breakpoint setzen. Callstack ansehen...



  • Martin Richter schrieb:

    Breakpoint setzen. Callstack ansehen...

    Also Breakpoint bei

    CMaindialog::Machwas (WPARAM, LPARAM lParam)
    {
    1.Befehl
    }

    und dann Rechtsklick bei Machwas->Aufrufbrowser->Aufruferdiagramm im neuen Fenster anzeigen ?

    Da steht "Es wurden keine Aufrufe(r) gefunden." Hmmm...



  • Update:

    Ich habs jetzt als modales Dialogfeld umgeschrieben (WMU Messages entfallen nun somit), und den Button sogar mit ShowWindow(false) komplett verschwinden lassen.
    Das hilft alles nichts.
    Wie zum Teufel kann eine unsichtbare Schaltfläche auf das Ereignis BN_CLICKED reagieren? 😞

    Wie kann ich das Problem nur lösen?


  • Mod

    Debuggen! Kann doch nicht so schwer sein...



  • Suche mal, ob Du die Methode "OnClicked..." noch an anderer Stelle aufrufst und nicht nur über die MessageMap



  • Tester2 schrieb:

    Suche mal, ob Du die Methode "OnClicked..." noch an anderer Stelle aufrufst und nicht nur über die MessageMap

    Ist nicht mehr relevant, da ich es wie erwähnt in ein modales Fenster umgeschrieben habe. Damit entfällt natürlich das Message System dafür.

    Mit dem Debugger komme ich dem auch nicht auf die Spur (hab ich natürlich als erstes probiert).



  • Mir scheint daß irgendwo ein Merker sein muß, der die Eigenschaften der Schaltflächen ignoriert. Der Spy hats mir angezeigt. Die Mausaktionen wurden automatisch gesendet, nachdem die Schaltfläche wieder freigegeben wurde.

    Ist das normal?



  • Wie sieht der Callstack im Debugger beim unerwünschten Aufruf aus?



  • MFK schrieb:

    Wie sieht der Callstack im Debugger beim unerwünschten Aufruf aus?

    Er findet nichts, vorausgesetzt ich mache es so richtig (Debugmodus):

    * Breakpoint beim 1. Befehl in der Funktion "OnBnClicked..."
    * Ansicht Aufrufdiagramm "CClass::OnBnClicked..."

    Ergebnis:
    Es wurden keine Aufrufe gefunden.
    Es wurden keine Aufrufer gefunden.



  • MFC-Coder schrieb:

    Er findet nichts, vorausgesetzt ich mache es so richtig

    Machst du nicht. Deutsche Lokalisierungen von Visual Studio sind furchtbar. IMHO.

    Such mal unter Debug -> Fenster -> Aufrufliste oder so ähnlich.



  • MFK schrieb:

    MFC-Coder schrieb:

    Er findet nichts, vorausgesetzt ich mache es so richtig

    Machst du nicht. Deutsche Lokalisierungen von Visual Studio sind furchtbar. IMHO.

    Such mal unter Debug -> Fenster -> Aufrufliste oder so ähnlich.

    Ok danke, jetzt siehts anders aus.

    Aber irgendwie hilft mir das auch nicht weiter.
    Wenn ich den BP in der OnBnClicked Funktion setze, habe ich ja keine Möglichkeit den ausgedimmten Button mehrfach zu drücken.

    Ich stehe da zugegebenermaßen auf dem Schlauch. Wo müßte ich den BP setzen damit das Gewünschte finde?



  • MFC-Coder schrieb:

    Wenn ich den BP in der OnBnClicked Funktion setze, habe ich ja keine Möglichkeit den ausgedimmten Button mehrfach zu drücken.

    Wieso nicht?

    Du kannst übrigens bei einem Breakpoint auch einstellen, dass der Debugger erst beim 2. Mal anhält.



  • MFK schrieb:

    Du kannst übrigens bei einem Breakpoint auch einstellen, dass der Debugger erst beim 2. Mal anhält.

    Wieder was gelernt... 🙂

    Aber ich sehe da keinen Unterschied. Das Ergebnis ist dasselbe wie wenn ich nur 1x drücke.


  • Mod

    Ich verstehe es nicht, was Du für ein Problem hast?
    Wenn Du einen Breakpoint setzt aufdie Stelle an der die WM_USER Nachricht ankommt, dann lässt Du das Programm weiter laufen (Go F5).
    Wenn dann nochmal die Nachricht reinkommt, ist was faul, aber dann kommt ja wieder der Breakpaoint. Also Breakpoint abpassen.
    Dann den Callstack ansehen. In dem wird irgendwo SendMessage aufgerufen. Schau eine Position weite drunter und Du hast den Verursacher (den Sender der Nachricht)...



  • Martin Richter schrieb:

    Ich verstehe es nicht, was Du für ein Problem hast?
    Wenn Du einen Breakpoint setzt aufdie Stelle an der die WM_USER Nachricht ankommt, dann lässt Du das Programm weiter laufen (Go F5).
    Wenn dann nochmal die Nachricht reinkommt, ist was faul, aber dann kommt ja wieder der Breakpaoint. Also Breakpoint abpassen.
    Dann den Callstack ansehen. In dem wird irgendwo SendMessage aufgerufen. Schau eine Position weite drunter und Du hast den Verursacher (den Sender der Nachricht)...

    Ich schrieb doch daß ich den nichtmodalen in ein modalen Dialog umgewandelt habe und damit das WMU System entfällt, bzw. auch nicht mehr da ist.
    Der Effekt ist derselbe, nur daß es eben keine Messages diesbezüglich mehr gibt und ich diese auch nicht mehr verfolgen kann.



  • MFC-Coder schrieb:

    Der Effekt ist derselbe, nur daß es eben keine Messages diesbezüglich mehr gibt und ich diese auch nicht mehr verfolgen kann.

    Besteht das Problem jetzt noch oder nicht?

    Fall ja, gibt es also immer noch Code, der mehrfach ausgeführt wird, obwohl er das nicht sollte?

    Dann mach da einen Breakpoint rein, der beim 2. Mal anhält, und zeig uns den Callstack.

    Falls nein, bist du überhaupt daran interessiert, herauszufinden, woran es lag?

    P.S.: 5000! 😃



  • MFK schrieb:

    Besteht das Problem jetzt noch oder nicht?

    Fall ja, gibt es also immer noch Code, der mehrfach ausgeführt wird, obwohl er das nicht sollte?

    Dann mach da einen Breakpoint rein, der beim 2. Mal anhält, und zeig uns den Callstack.

    Morgen,

    hier die obersten Zeilen. Egal ob ich 1, 2 oder 4 den Button drücke sehe ich immer dasselbe.

    > Appl.exe!CClass::OnBnClickedButton() Zeile 156 C++
    Appl.exe!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0012eac0, unsigned int nID=1027, int nCode=0, void (void)* pfn=0x004ef4d3, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 82 C++
    Appl.exe!CCmdTarget::OnCmdMsg(unsigned int nID=1027, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 381 + 0x27 Bytes C++
    Appl.exe!CDialog::OnCmdMsg(unsigned int nID=1027, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 85 + 0x18 Bytes C++
    Appl.exe!CWnd::OnCommand(unsigned int wParam=1027, long lParam=526076) Zeile 2364 C++
    Appl.exe!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=1027, long lParam=526076, long * pResult=0x0012e278) Zeile 1769 + 0x1e Bytes C++
    Appl.exe!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=1027, long lParam=526076) Zeile 1755 + 0x20 Bytes C++
    Appl.exe!AfxCallWndProc(CWnd * pWnd=0x0012eac0, HWND__ * hWnd=0x00080704, unsigned int nMsg=273, unsigned int wParam=1027, long lParam=526076) Zeile 240 + 0x1c Bytes C++
    Appl.exe!AfxWndProc(HWND__ * hWnd=0x00080704, unsigned int nMsg=273, unsigned int wParam=1027, long lParam=526076) Zeile 403 C++


  • Mod

    Weiter runter rollen. Das ist doch nur die Behandlung der Nachricht.
    Igrnedwo muss doch SendMessage sehen. (Hatte ich das nicht genau beschrieben?)



  • Martin Richter schrieb:

    Weiter runter rollen. Das ist doch nur die Behandlung der Nachricht.
    Igrnedwo muss doch SendMessage sehen. (Hatte ich das nicht genau beschrieben?)

    Hier das gesamte (BP bei 3x und mehr); ich sehe da kein SendMessage. 😞

    > Appl.exe!CReferenzieren::OnBnClicked() Zeile 155 C++
    Appl.exe!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0012eac0, unsigned int nID=1027, int nCode=0, void (void)
    pfn=0x004ef4c9, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 82 C++
    Appl.exe!CCmdTarget::OnCmdMsg(unsigned int nID=1027, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 381 + 0x27 Bytes C++
    Appl.exe!CDialog::OnCmdMsg(unsigned int nID=1027, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 85 + 0x18 Bytes C++
    Appl.exe!CWnd::OnCommand(unsigned int wParam=1027, long lParam=395384) Zeile 2364 C++
    Appl.exe!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=1027, long lParam=395384, long * pResult=0x0012e278) Zeile 1769 + 0x1e Bytes C++
    Appl.exe!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=1027, long lParam=395384) Zeile 1755 + 0x20 Bytes C++
    Appl.exe!AfxCallWndProc(CWnd * pWnd=0x0012eac0, HWND__ * hWnd=0x0006087e, unsigned int nMsg=273, unsigned int wParam=1027, long lParam=395384) Zeile 240 + 0x1c Bytes C++
    Appl.exe!AfxWndProc(HWND__ * hWnd=0x0006087e, unsigned int nMsg=273, unsigned int wParam=1027, long lParam=395384) Zeile 403 C++
    user32.dll!7e368734()
    [Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für user32.dll]
    user32.dll!7e368816()
    user32.dll!7e378ea0()
    user32.dll!7e378eec()
    ntdll.dll!7c91e473()
    user32.dll!7e3694be()
    user32.dll!7e37c174()
    user32.dll!7e37a998()
    user32.dll!7e38b036()
    Appl.exe!CWnd::DefWindowProcA(unsigned int nMsg=514, unsigned int wParam=0, long lParam=524406) Zeile 1043 + 0x20 Bytes C++
    Appl.exe!CWnd::WindowProc(unsigned int message=514, unsigned int wParam=0, long lParam=524406) Zeile 1756 + 0x1c Bytes C++
    Appl.exe!AfxCallWndProc(CWnd * pWnd=0x0012eb40, HWND__ * hWnd=0x00060878, unsigned int nMsg=514, unsigned int wParam=0, long lParam=524406) Zeile 240 + 0x1c Bytes C++
    Appl.exe!AfxWndProc(HWND__ * hWnd=0x00060878, unsigned int nMsg=514, unsigned int wParam=0, long lParam=524406) Zeile 403 C++
    user32.dll!7e368734()
    user32.dll!7e368816()
    user32.dll!7e3689cd()
    user32.dll!7e381b7c()
    user32.dll!7e38c6d3()
    Appl.exe!CWnd::IsDialogMessageA(tagMSG * lpMsg=0x001780b0) Zeile 198 C++
    Appl.exe!CWnd::PreTranslateInput(tagMSG * lpMsg=0x001780b0) Zeile 4332 C++
    Appl.exe!CDialog::PreTranslateMessage(tagMSG * pMsg=0x001780b0) Zeile 80 C++
    Appl.exe!CWnd::WalkPreTranslateTree(HWND__ * hWndStop=0x00070862, tagMSG * pMsg=0x001780b0) Zeile 2946 + 0x14 Bytes C++
    Appl.exe!AfxInternalPreTranslateMessage(tagMSG * pMsg=0x001780b0) Zeile 233 + 0x12 Bytes C++
    Appl.exe!CWinThread::PreTranslateMessage(tagMSG * pMsg=0x001780b0) Zeile 777 + 0x9 Bytes C++
    Appl.exe!AfxPreTranslateMessage(tagMSG * pMsg=0x001780b0) Zeile 252 + 0x11 Bytes C++
    Appl.exe!AfxInternalPumpMessage() Zeile 178 + 0x18 Bytes C++
    Appl.exe!CWinThread::PumpMessage() Zeile 900 C++
    Appl.exe!AfxPumpMessage() Zeile 190 + 0xd Bytes C++
    Appl.exe!CWnd::RunModalLoop(unsigned long dwFlags=4) Zeile 4386 + 0x5 Bytes C++
    Appl.exe!CDialog::DoModal() Zeile 584 + 0xc Bytes C++
    Appl.exe!CApplDlg::OnMenuitemOptionenReferenzieren() Zeile 1517 C++
    Appl.exe!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0012f328, unsigned int nID=32780, int nCode=0, void (void)* pfn=0x004ed11f, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 82 C++
    Appl.exe!CCmdTarget::OnCmdMsg(unsigned int nID=32780, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 381 + 0x27 Bytes C++
    Appl.exe!CDialog::OnCmdMsg(unsigned int nID=32780, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 85 + 0x18 Bytes C++
    Appl.exe!CWnd::OnCommand(unsigned int wParam=32780, long lParam=0) Zeile 2364 C++
    Appl.exe!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=32780, long lParam=0, long * pResult=0x0012efc4) Zeile 1769 + 0x1e Bytes C++
    Appl.exe!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=32780, long lParam=0) Zeile 1755 + 0x20 Bytes C++
    Appl.exe!AfxCallWndProc(CWnd * pWnd=0x0012f328, HWND__ * hWnd=0x00070862, unsigned int nMsg=273, unsigned int wParam=32780, long lParam=0) Zeile 240 + 0x1c Bytes C++
    Appl.exe!AfxWndProc(HWND__ * hWnd=0x00070862, unsigned int nMsg=273, unsigned int wParam=32780, long lParam=0) Zeile 403 C++
    user32.dll!7e368734()
    user32.dll!7e368816()
    user32.dll!7e3689cd()
    user32.dll!7e3696c7()
    Appl.exe!AfxInternalPumpMessage() Zeile 183 C++
    Appl.exe!CWinThread::PumpMessage() Zeile 900 C++
    Appl.exe!AfxPumpMessage() Zeile 190 + 0xd Bytes C++
    Appl.exe!CWnd::RunModalLoop(unsigned long dwFlags=4) Zeile 4386 + 0x5 Bytes C++
    Appl.exe!CDialog::DoModal() Zeile 584 + 0xc Bytes C++
    Appl.exe!CApplApp::InitInstance() Zeile 63 + 0xb Bytes C++
    Appl.exe!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f4e, int nCmdShow=1) Zeile 37 + 0xd Bytes C++
    Appl.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f4e, int nCmdShow=1) Zeile 30 C++
    Appl.exe!__tmainCRTStartup() Zeile 263 + 0x2c Bytes C
    Appl.exe!WinMainCRTStartup() Zeile 182 C
    kernel32.dll!7c817077()
    Appl.exe!CAtlAllocator::Init(const char * pszFileName=0x006f0064, unsigned long dwMaxSize=7536759) Zeile 114 + 0x1b Bytes C++
    ftd2xx.dll!00390035()*


Anmelden zum Antworten