Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Вообще-то 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);
  ...
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:14, 30-01-2010 | #2