MessageMap: Button gedrückt

zonki

Mitglied
Hallo,

welche Nachricht muss in der MessageMap abgefangen werden um zu erkennen, dass ein Button zwar gedrückt aber noch nicht losgelassen wurde Vielen Dank im Voraus
 
Also soweit ich das rausbekommn hab, steht die ID 513
dafür das über deinem Button die Linke Maustaste runter
gedrückt wurde - 514 dafür, dass sie wieder losgelassen wurde.
Aber frag mich bitte nicht wie die Konstanten heissen.

Ich kann aber auch grandios daneben liegen ... °-_-
Vielleicht weis es noch einer mit Gewissheit.
 
Zuletzt bearbeitet:
Hi,


wie das mit der Maus funktioniert weiss ich ja. Problem ist, dass die Funktion "OnLButtonDown" bei gerade gedrücktem Button garnicht aufgerufen wird (trotz gedrückter Taste) da das Button-Event im Vordergrund zu stehen scheint.
Ich will folgendes machen: sobald ein Button gedrückt wird und dazu die Maus bewegt wird soll er verschoben werden. Hat jemand ne Idee
 
Da musst du vermutlich über PreTranslateMessage gehen, und bei WM_LBUTTONDOWN auf dem Button in den Capture-Modus gehen (zum rumschieben). Die Meldung darf dann einfach nicht an den Button weitergeleitet werden (return TRUE in PreTranslateMessage).
 
Hmm, also wenn es sich um einen wirklichen Button handelt, hat dieser eine eigene ID und kann mit einer Funktion belegt werden, die meines Wissens immer erst nach dem loslassen ausgelöst wird. (quasi OnButton() ) Dieses hat aber nichts mit OnLButtonDown zu tun.
OnLButtonDown() heißt ja eigentlich nur, dass irgendwo auf der Programmoberfläche die Linke Maustaste gedrückt wurde. Wenn du wirklich mit dieser Funktion arbeitest, wird es wohl kein Button im Sinne des standart MFC++ Button sein. Dann gibt es ja noch die Funktion OnLButtonUp() - die dann in diesem Fall genau das gewünschte verwirklichen würde. (Wird durch loslassen der Maustaste ausgelöst)
Schau doch einfach mal im Klassenassistenten von MFC++ (Strg+w), da stehen jede Menge nützliche Standard Message Handler
 
Ja, aber mein Problem ist, dass jeder Button ein eigenes Fenster darstellt, deswegen kann ich die Mausposition in meinem Hauptfenster nicht abgreifen wenn mein Cursor über dem Button steht. Sonst könnte ich es einfach so machen, dass ich die Mausposition mit der Position des Buttons vergleiche und bei Übereinstimmung mittels "SetWindowPlacement" den Button verschiebe.
 
Das Problem der Nachrichten hab ich so gelöst:

Es werden alle WM_LBUTTONUP und WM_MOUSEMOVE Nachrichten
in PreTranslateMessage(...) abgefangen, geschaut ob ein verschieben im Gange ist und dann an das Hauptfenster
weitergeleitet.
Dazu muss man vorher die Koordinaten umrechnen lassen.

Code:
if (pMsg->message == WM_LBUTTONUP || pMsg->message == WM_MOUSEMOVE )
{
	if (m_is_moving)
	{
		//--- Handle und Koordinaten bekommen ---
		CWnd *pwnd = CWnd::FromHandle(pMsg->hwnd);
		CPoint point = CPoint(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
		
		//--- Koordinaten umrechnen ---
		if (pwnd)
		{
			pwnd->ClientToScreen(&point);
			this->ScreenToClient(&point);
			pMsg->lParam = LOWORD(point.x) | HIWORD(point.y);
		}

		this->SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
		return TRUE;
	}
	//--- alle mal in die Hände klatschen weils so schön war ---
}

Falls jemand einen effektiveren Weg wüsste, würde ich ihn auch gern erfahren wollen. ^__^

M.f.G. Erik
 
Hi Erik,

erklärst du mir noch woher "m_is_moving" kommt? Ist es dasselbe wie "WM_MOUSEMOVE" Danke für deine Bemühungen! :eek:)
 
arg ich vergas °-_-

Das ist irgendeinen von dir definierte Variable von typ [bool] im Haupdialog, die ein "herumziehen" anzeigt.

Ich hab das mit den Nachrichten für was anderes gebrauch was aber ähnlich ist.
bei mir fange ich über dem Haupdialog an zu ziehen weshalb ich WM_LBUTTONDOWN
von vorneherein einfach mit OnLButtonDown(UINT nFlags, CPoint point) behandeln kann.
Das ist bei dir aber nicht der fall.

Versuch einfach mal auch die Nachricht WM_LBUTTONDOWN weiter zu leiten und dann in deinem Haupdialog mit OnLButtonDown() die Variable zu setzten.

Dann sieht die IF-Anweisung in PreTranslarte message quasi so aus :

Code:
if (pMsg->message == WM_LBUTTONUP || pMsg->message == WM_MOUSEMOVE || pMsg->message == WM_LBUTTONDOWN)
{
...

Und dann musst du bei OnLButtonDown(..) m_is_moving (der Name ist nur ein Beispiel ^_^) auf "true" setzten
und in OnLButtonUp(..) auf "false".

Willst du den Button eigentlich nur rumziehen oder soll der auch was bewirken ?
Denn letzteres währe so nur noch auf Umwegen möglich.

M.f.G. Erik
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück