diff --git a/controls/button.c b/controls/button.c index 147d82b7000..5ca6457728d 100644 --- a/controls/button.c +++ b/controls/button.c @@ -137,27 +137,31 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg, break; case WM_LBUTTONDBLCLK: - if(wndPtr->dwStyle & BS_NOTIFY || - style==BS_RADIOBUTTON || - style==BS_USERBUTTON || - style==BS_OWNERDRAW){ - SendMessageA( GetParent(hWnd), WM_COMMAND, - MAKEWPARAM( wndPtr->wIDmenu, BN_DOUBLECLICKED ), hWnd); - break; - } - /* fall through */ + if(wndPtr->dwStyle & BS_NOTIFY || + style==BS_RADIOBUTTON || + style==BS_USERBUTTON || + style==BS_OWNERDRAW) { + SendMessageA( GetParent(hWnd), WM_COMMAND, + MAKEWPARAM( wndPtr->wIDmenu, BN_DOUBLECLICKED ), hWnd); + break; + } + /* fall through */ case WM_LBUTTONDOWN: SetCapture( hWnd ); SetFocus( hWnd ); SendMessageA( hWnd, BM_SETSTATE, TRUE, 0 ); + infoPtr->state |= BUTTON_BTNPRESSED; break; case WM_LBUTTONUP: - /* FIXME: real windows uses extra flags in the status for this */ - if (GetCapture() != hWnd) break; - ReleaseCapture(); - if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) break; + if (!(infoPtr->state & BUTTON_BTNPRESSED)) break; + infoPtr->state &= BUTTON_NSTATES; + if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) { + ReleaseCapture(); + break; + } SendMessageA( hWnd, BM_SETSTATE, FALSE, 0 ); + ReleaseCapture(); GetClientRect( hWnd, &rect ); if (PtInRect( &rect, pt )) { @@ -181,6 +185,14 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg, } break; + case WM_CAPTURECHANGED: + if (infoPtr->state & BUTTON_BTNPRESSED) { + infoPtr->state &= BUTTON_NSTATES; + if (infoPtr->state & BUTTON_HIGHLIGHTED) + SendMessageA( hWnd, BM_SETSTATE, FALSE, 0 ); + } + break; + case WM_MOUSEMOVE: if (GetCapture() == hWnd) { diff --git a/include/button.h b/include/button.h index 5ccabfe5dba..61e1555895c 100644 --- a/include/button.h +++ b/include/button.h @@ -26,6 +26,11 @@ typedef struct #define BUTTON_3STATE 0x02 #define BUTTON_HIGHLIGHTED 0x04 #define BUTTON_HASFOCUS 0x08 +#define BUTTON_NSTATES 0x0F + /* undocumented flags */ +#define BUTTON_BTNPRESSED 0x40 +#define BUTTON_UNKNOWN2 0x20 +#define BUTTON_UNKNOWN3 0x10 #define BUTTON_STATE(hwnd) ((WIN_FindWndPtr(hwnd))->wExtra[0])