M
Du musst Dir nicht zwangsläufig eine eigene Fensterklasse für den Button erstellen, das würde ja beinhalten, dass Du diesen auch selbst zeichnen müsstest, etc. Wäre für das empfangen einer eigenen Klick-Msg viel zu aufwendig.
Es würde reichen, wenn Du den Button subclasst. Allerdings bekommst Du dann nicht mehr die Nachricht WM_COMMAND gesendet, sondern getrennt WM_LBUTTONDOWN und WM_LBUTTONUP. Ob nun ein richtiger Klick ausgeführt wurde, musst Du natürlich selbst überprüfen, was sich aber über eine map erledigen lässt, also etwa so:
...
std::map<HWND, bool> ButtonStates;
...
case WM_LBUTTONDOWN:
ButtonStates[hWnd] = true;
break;
case WM_LBUTTONUp:
if (ButtonStates[hWnd]) {
ButtonStates[hWnd] = false;
// Klick wurde ausgeführt, also onClick-Handler aufrufen
}
else {
// Es wurde mit gedrückter Maustaste über den Button gefahren und dann losgelassen
}
break;
Also irgendwie so. Bitte nicht als gültigen oder gar guten Code bewerten, nur so als Idee. Dann könntest Du den Button-Status noch bei MouseOut zurücksetzen, damit der Klick tatsächlich nur dann ausgeführt wird, wenn sich die Maus die ganze Zeit bei ButtonDown und ButtonUp über den Button befindet.