Problem mit "what´s this" - Zeiger Implementierung

RuFFnEcK

Erfahrenes Mitglied
Hallo zusammen,

um es kurz zu halten der Kern des Problems ist, das bei einigen Forms "OnToolHitTest" immer "-1" liefert und bei einigen ganz korrekt die Steuerelement ID.

Ich hab mir jetzt den ganzen Tag nen Wolf gesucht, aber ich komme nicht dahinter was das Problem ist...

"OnHelpHitTest" wird richtig aufgerufen bei Verwendung des What´s this Zeigers, aber wie gesagt bei bestimmten Forms klappts immer und bei manchen nie! Die relevanten Codestellen sind identisch...

Ich komme nicht weiter und freu mich über jede Art von Anregung!

Hier ein bisle Code:

Habe inzwischen verschiedene Varianten probiert, aber keine bringt irgendeine Veränderung, da "OnToolHitTest" immer -1 liefert bei den Problematischen Forms...

Code:
LRESULT CVelocityView::OnHelpHitTest(WPARAM, LPARAM lParam)
{
	ASSERT_VALID(this);
	
	// Find the child window ID under mouse cursor
	POINT point = { LOWORD(lParam), HIWORD(lParam) };
	int nID = OnToolHitTest(point, NULL);
	// Workaround, um Kontexthilfe v. Controls anzuzeigen,
	// die innerhalb von statischen Controls mit höherer Z-Order liegen
	if (nID == IDC_SPEED_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;
}

Code:
LRESULT CBasicSetupView::OnHelpHitTest(WPARAM wParam, LPARAM lParam)
{
   ASSERT_VALID(this);

   // Find the child window ID under mouse cursor
   int nID = OnToolHitTest((DWORD)lParam, NULL);
   if (nID != -1)
      return HID_BASE_CONTROL+nID;

   nID = GetDlgCtrlID();
   return nID != 0 ? HID_BASE_CONTROL+nID : 0;
}


Viele Grüße
RuFF
 
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/Visua...Feedback.aspx?FeedbackID=355022&wa=wsignin1.0

Viele Grüße
RuFF
 
Zurück