Вообще-то BUTTON со стилем BS_OWNERDRAW должна сама вызывать WM_DRAWITEM когда необходимо. Причём обработчик WM_DRAWITEM перерисовывает кнопку полностью (сама кнопка ничего не рисует).
______________________________________________
если будешь ваять кнопку руками:
На событие нажатия ставим обработчик:
Код:
case WM_LBUTONDOWN:
case WM_LBUTONUP:
myButtonPushed = (message==WM_LBUTONDOWN); // запомнили, что надо рисовать нажатую
HDC dc = GetDC(buttonHWND); // взяли DC всего окна
myButtonPaint(dc); // перерисовали
ReleaseDC(buttonHWND, dc); // разрушили dc
if (message==WM_LBUTONUP) myButtonOnClick(); // реагируем на событие
или
Код:
case WM_LBUTONDOWN:
case WM_LBUTONUP:
myButtonPushed = (message==WM_LBUTONDOWN);
InvalidateRect(buttonHWND, 0, 0); // отрисуем потом
if (message==WM_LBUTONUP) myButtonOnClick(); // реагируем на событие
// если myButtonOnClick() выполняется долго, кнопка долго не будет перерисовываться (выглядеть нажатой)
этому коду характерен баг: если нажать кнопку и стащить указатель с кнопки, то она не отожмётся. Чтобы решить эту проблему, нужно захватить мышь:
Код:
case WM_CAPTURECHANGED: // кто-то вызвал SetCapture или ReleaseCapture
myButtonPushed = false;
InvalidateRect(buttonHWND, 0, 0); // отрисуем потом
break;
case WM_LBUTONDOWN:
myButtonPushed = true;
SetCapture(buttonHWND);
InvalidateRect(buttonHWND, 0, 0); // отрисуем потом
break;
case WM_LBUTONUP:
ReleaseCapture(buttonHWND); // вызовет WM_CAPTURECHANGED
myButtonOnClick(); // реагируем на событие
break;
case WM_PAINT:
// myButtonPushed = (GetCapture()==buttonHWND);
...