Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_MOUSEMOVE & WM_MOUSELEAVE 
:(
    Опции темы
devmstr
Дата 24.10.2005, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Почему не отлавливаются эти сообщения?
Код
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#include <commctrl.h>

HWND        hMainWnd;
HWND        hCldWnd;
HINSTANCE    hInst;

int            iL        = 10;    
int            iT        = 20;
int            iW        = 160;
int            iH        = 20;
int            iClH    = 150;    

LONG WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS    wnd;
    
    hInst                = hInstance;
    memset(&wnd, 0, sizeof(wnd));
    wnd.hbrBackground    = (HBRUSH)COLOR_WINDOW;
    wnd.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wnd.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    wnd.hInstance        = hInst;
    wnd.lpfnWndProc        = MainWndProc;
    wnd.lpszClassName    = "iClock";
    wnd.style            = CS_HREDRAW|CS_VREDRAW;
    if (!RegisterClass(&wnd))
    {
        MessageBox(NULL, "Error create class", "Error", MB_ICONERROR|MB_OK);
        return 1;
    }

    hMainWnd = CreateWindow("iClock", "Hello Word", WS_POPUPWINDOW,  iL, iT, iW, iH, NULL, NULL, hInst, NULL);
    if (!hMainWnd)
    {
        MessageBox(NULL, "Error create window", "Error", MB_OK|MB_ICONERROR);
        return 1;
    }
    SetWindowPos(hMainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);

    //CreateCldFrm();    
    
    ShowWindow(hMainWnd, nCmdShow);
    UpdateWindow(hMainWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.lParam;
}

LONG WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar)
{
    static RECT rct;
    switch (msg)
    {
    case WM_NCHITTEST:
        return HTCAPTION;
        break;
    case WM_LBUTTONDOWN:
          SetCapture(hWnd);
        break;
    case WM_LBUTTONUP:
        ReleaseCapture();
    case WM_MOUSEMOVE:
        MessageBox(NULL, "On Window", "Inf", MB_OK);
        break;
    case WM_MOUSELEAVE:
        MessageBox(NULL, "Out of application", "Inf", MB_OK);
        break;
    case WM_CLOSE:
        SendMessage(hCldWnd, WM_DESTROY, 0,0);
        SendMessage(hMainWnd, WM_DESTROY, 0,0);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wPar, lPar);
    }
    return 0;
}



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
devmstr
Дата 25.10.2005, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



C WM_MOUSEMOVE вообщем разобрался. Я его словить не могу , так как присутствует код
Код

case WM_NCHITTEST:
        return HTCAPTION;
        break;

Выход ловить WM_NCMOUSEMOVE. А вот что в этом случае делать со вторым пока не понятно.


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
devmstr
Дата 25.10.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Пробовал WM_NCMOUSEMOVE. Как ни ловилось так и не ловится!
Код
case WM_NCMOUSEMOVE:
        MessageBox(NULL, "On Window", "Inf", MB_OK);
        break;

Или я где то затупил?


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Earnest
Дата 25.10.2005, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата
The WM_MOUSELEAVE message is posted to a window when the cursor leaves the client area of the window specified in a prior call to TrackMouseEvent.


Что-то я у тебя никаких TrackMouseEvent не заметила.

Еще код
Код

  case WM_NCHITTEST:
        return HTCAPTION;
        break;

выглядит, гм..., странно. Зачем тут break?

Цитата(magician @ 25.10.2005, 05:37)
Выход ловить WM_NCMOUSEMOVE.

Если все, что тебя волнует, это узнать, что мышь над окном, когда capture установлено, - проверяй координаты мыши, и делай это хоть в WM_NCHETTEST, хоть таймер повесь.

Объясни, что нужно-то? Ты уж извини, но действия какие-то проктологические.



--------------------
...
PM   Вверх
devmstr
Дата 26.10.2005, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Цитата(Earnest @ 25.10.2005, 19:51)
выглядит, гм..., странно. Зачем тут break?

Ну бывает, не обратил внимания, хотя смысла это не меняет.
Вообщем код в конце концов заработал.
Возникла несколько иная проблема.

TrackMouseEvent когда вызывать?
Делал это по WM_MOUSEMOVE, но WM_MOUSELEAVE почему то не вызывается.
А если вызывать TrackMouseEvent по клику мыши. То все прекрастно работает. Но надо все же делать по WM_MOUSEMOVE.
Как можно решить данную проблему?
Код
static RECT rct;
    static TRACKMOUSEEVENT tme;
    switch (msg)
    {
    case WM_LBUTTONDOWN:
        tme.cbSize        = sizeof(tme);
        tme.dwFlags        = TME_LEAVE;
        tme.dwHoverTime        = HOVER_DEFAULT;
        tme.hwndTrack        = hMainWnd;
        TrackMouseEvent(&tme);
        break;
    case WM_MOUSEMOVE:
        tme.cbSize        = sizeof(tme);
        tme.dwFlags        = TME_LEAVE;
        tme.dwHoverTime        = HOVER_DEFAULT;
        tme.hwndTrack        = hMainWnd;
        ShowWindow(hCldWnd, SW_SHOW);
        break;
    case WM_MOUSELEAVE:
        MessageBox(NULL, "Leave", "", 0);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wPar, lPar);
    }
    return 0;


Это сообщение отредактировал(а) magician - 26.10.2005, 08:45


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
rsm
Дата 26.10.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 4
Всего: 62



См. в аттаче пример.

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  msevnt.zip 2,29 Kb
PM MAIL   Вверх
devmstr
Дата 27.10.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Большое спасибо! Вы мне очень помогли!


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
GremlinProg
Дата 28.10.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Вообще-то, TrackMouseEvent решает только часть проблемы: попробуй резко провести мышью над областью, за которой ты следишь. WM_MOUSELEAVE будет работать через раз. Это следствие того, что сообщение WM_NCHITTEST приходит в окно только тогда, когда мышь находится над этим окном. Для того, чтобы полностью контролировать вклад мыши необходимо повесить на Idle дополнительную проверку. Дальше мне лень писать, но принцип прост: вместо GetMessage нужно вызывать PeekMessage. Если она возвращает FALSE, значит нет сообщений в очереди, т.е. пришло время Idle Здесь-то как раз и надо проверить текущие координаты мыши.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
devmstr
Дата 29.10.2005, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



GremlinProg
Мда, Вы правы, сейчас попробую!


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.