OnToolHitTest liefert bei bestimmten Forms immer -1



  • Hallo liebes Forum,

    ich habe da ein Problem. Ich überarbeitet im Moment das Hilfesystem eines größeren SDI Projekts.

    Es geht jetzt speziell um die "What´s this" implementierung. In jeder FormKlasse ist die Methode "OnHelpHitTest()" implementiert und wird auch korregt bei Verwendung des Zeiger aufgerufen. Nur leider liefert OnToolHitTest() bei bestimmten Forms immer -1. Ich konnte keine Unterschiede der jeweiligen Klassen sehen und steh grad ganz schön auf dem Schlauch.

    Bin für jede Art von hilfe dankbar!

    Viele grüße
    RuFF

    EDIT: Ein bisle Code kann ja nicht schaden 😉
    Habe inzwischen mehrere Implementierungen ausprobiert...

    Hier eine Kurzversion:

    LRESULT CBasicSetupView::OnHelpHitTest(WPARAM wParam, LPARAM lParam)
    {
    	ASSERT_VALID(this);
    
    	int nID = OnToolHitTest((DWORD)lParam, NULL);
    	if (nID != -1)
    		return HID_BASE_CONTROL+nID;
    
    	nID = GetDlgCtrlID();
    	return nID != 0 ? HID_BASE_CONTROL+nID : 0;
    }
    

    Hier eine andere:

    LRESULT CCurrentView::OnHelpHitTest(WPARAM, LPARAM lParam)
    {
    	ASSERT_VALID(this);
    
    	POINT point = { LOWORD(lParam), HIWORD(lParam) };
    	int nID = OnToolHitTest(point, NULL);
    
    	if (nID == IDC_CURRENT_STATIC) {
    		CRect rcClient;
    		CWnd* pWnd = GetDlgItem(nID);
    		while (1) {
    			pWnd = pWnd->GetNextWindow();
    			if (pWnd == NULL) {
    				break;
    			}
    			pWnd->GetWindowRect(rcClient);
    			ScreenToClient(rcClient);
    			if (rcClient.PtInRect(point)) {
    				nID = pWnd->GetDlgCtrlID();
    				break;
    			}
    		}
    	}
    	if (nID != -1)
    		return HID_BASE_CONTROL+nID;
    
    	nID = GetDlgCtrlID();
    	return nID != 0 ? HID_BASE_CONTROL+nID : 0;
    }
    

  • Mod

    Welche MFC/VS Version?

    Ich entsinne mich, dass es hier in "älteren" Versionen einen Bug/Probleme gab...



  • Das ganze wurde nicht von mir mit VS 6 implementiert und dann vor 3 Monaten von mir in VS 2008 also 9 migriert.
    Das führte zu Anfang zu erheblichen Problemen, die weitestgehend behoben wurden...
    Die Hilfe funktionierte zu Anfang überhaupt nicht mehr, bis ich entdeckt habe dass einige Hilfe-Aufrufe in den falschen Klassen passierten.
    Habe dann mit Hilfe diese Dokuments http://www.smountain.com/resource/CPPHTMLHelp.pdf das ganze korrigiert, aber habe eben das Problem mit dem "What´s this Zeiger".

    Grüße
    RuFF



  • So jetzt nochmal ganz klar das problem was ich hab ohne das ganze Drum herum...

    In einer View Klasse sollte doch OnToolHitTest() mir die Steuerelement ID liefern, oder?

    Wenn ich im Dialog einfach ins Fenster klicke, ohne ein Steuerelement zu treffen, wird die ID des Fensters geliefert...! Nur wenn ich ein Steuerelement anklicke kommt -1.

    Ich verstehs einfach nicht und weiß echt nicht weiter... 😕

    Ich habe bereits alle Unterschiede gecheckt und es gibt einfach keinen, oder ich hab nicht an allen Stellen gesucht...! Weil bei einigen Fenstern klappt das ganze Wunderbar!!!
    Ich hab sogar die Ressource.h nach möglichen differenzen gesucht, nix!

    Ich hoffe mir kann jemand helfen!

    Viele Grüße
    RuFF

    ------------------------
    EDIT:
    ------------------------

    Frage:
    Gibt es eine Alternative zu "OnToolHitTest()" die Steuerelement ID zu ermitteln anhand von Koordinaten??



  • Nach sehr langer und intensiver Suche habe ich das Problem gefunden!

    Es klappt einfach nicht wenn ein Control sich innerhalb einer GroupBox befinden dessen ID: IDC_STATIC ist.
    Also einfach die GroupBox umbennen und es klappt... *kotz*

    Ich zitiere einfach:

    We found one bug in the latest version of MFC (version 9.0 from Visual Studio 2008). As compared with MFC from Visual Studio 6.0 the macros _AfxGetDlgCtrlID was changed.

    // MFC 4.2 - see line 418 of the file \VC\atlmfc\src\mfc\afximpl.h
    #define _AfxGetDlgCtrlID(hWnd) ((UINT)(WORD)::GetDlgCtrlID(hWnd))

    // MFC 9.0 - see line 528 of the file "\VC98\MFC\SRC\afximpl.h"
    #define _AfxGetDlgCtrlID(hWnd) ((UINT)::GetDlgCtrlID(hWnd))

    This change leads to the following bug. If we have a control (for example, Button) situated inside Group-box control with ID=IDC_STATIC, message TTN_NEEDTEXT for this Button will not be received and tooltips for this Button will disappear, because function OnToolHitTest from \VC\atlmfc\src\mfc\wincore.cpp, (line 1087) operates erroneously.

    Zu finden hier: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355022&wa=wsignin1.0

    Viele Grüße
    RuFF


Anmelden zum Antworten