Use an extra bit in the button status byte to flag whether the
DefButtonWndProc should process the WM_LBUTTONUP message.
This commit is contained in:
parent
3d06d20bab
commit
61b15de4ba
|
@ -150,14 +150,18 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg,
|
|||
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;
|
||||
if (!(infoPtr->state & BUTTON_BTNPRESSED)) break;
|
||||
infoPtr->state &= BUTTON_NSTATES;
|
||||
if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) {
|
||||
ReleaseCapture();
|
||||
if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) break;
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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])
|
||||
|
||||
|
|
Loading…
Reference in New Issue