WH_MOUSE. проблема.

Тема в разделе "WASM.WIN32", создана пользователем Rascal_spb, 24 июл 2007.

  1. Rascal_spb

    Rascal_spb New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2006
    Сообщения:
    8
    вопрос такой: делаю добавление новой кнопки в заголовок всех окон с тайтлбаром. Через хуки глобальные. Добавление сделано. сделан хайлайт при наведении мышки. и нажатие при нажатии кнопки. но хотелось бы как в винде - там при нажатой кнопке если отвести курсор с кнопки, она делается обычного вида. при наведении на кнопку - нажатой. перетаскивание окна при нажатой кнопке поборол предотвращением вызова CallNextHook. Но есть одна проблема: при клике на границе окна(менять размер окна) UP(WM_NCLBUTTONUP) не приходит окну. Экспериментировал, методом тыка - ап вызывает след хук, даун нет, оба вызывают, оба нет... Получалось что кнопка или залипает нажатой и размер окна меняется при движении мыша до следующего клика. Либо не срабатывает нажатие. В итоге меню и прочее игнорируется. Причина явно в возвращаемых значениях и вызовах. Но я запутался. Может у кого есть код такого плана?
    Здесь компа нету со студией, приеду через недельку. Видел в некоторых примерах вызов SendMessage, попробую там.
    Надеюсь на вашу помощь.
     
  2. CodeTao

    CodeTao Евгений

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    177
    Адрес:
    штаты
    Не совсем понял что имел ввиду, я с туллбарами дело еще не имел... На счет изменения прорисовки кнопки при наведении мыши и снятии при отсутствия таковой я пользуюсь комбинацие WM_NCHITTEST и TrackMouseEvent+WM_MOUSELEAVE.
    В случае первого кнопку подсвечиваю и вызываю заказ сообщения WM_MOUSELEAVE через TrackMouseEvent, иначе не генерируется.
    Код (Text):
    1. TRACKMOUSEEVENT tm;
    2. tm.cbSize=sizeof(tm);
    3. tm.dwFlags=TME_LEAVE;
    4. tm.dwHoverTime=HOVER_DEFAULT;
    5. tm.hwndTrack=hWnd;
    6. TrackMouseEvent(&tm);
    а когда вызывается WM_MOUSELEAVE тушу кнопку. Естественно все делается через сабклассинк кнопки.
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    На форуме очень хорошая ссылка пробегала по добавлению кнопки, попробуй поискать.
    Не понял что с границей происходит и когда.
    Про 'отжатие' кнопки: можно через можно через PtInRect. Создание кнопки происходило через DrawFrameControl? Если да, то TrackMouseEvent не подойдет.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Пришло WM_NCLBUTTONDOWN - проверь где курсор. Если на изображении кнопки, то создавай цикл с PeekMessage пока не поймаешь WM_NCLBUTTONUP. Когда ловится WM_MOUSEMOVE, опять проверяй где курсор и соответственно этому DrawFrameControl.
     
  5. Rascal_spb

    Rascal_spb New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2006
    Сообщения:
    8
    CodeTao
    Не с тулбарами, а с тайтлбарами =) Заголовок

    Я вот думаю что проще всё таки сабклассить, чем такую задачу решать через хуки. У меня все окна просабкласены. Я на сообщения некоторые вызываю перерисовку кнопки. Пожалуй там и поюзаю определение нажатия. Нашёл хороший пример http://www.catch22.net/tuts/titlebar.asp. Я как раз не мог понять, как использовать HRGN, который даёт NCPAINT.
    Спасибо за ответы. Погода шлак, так что проверю хз как, ибо ехать нет смысла.