Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 20000 рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2020, 12:07   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию WM_MOUSEMOSE приходит постоянно

Здравствуйте.
Начал писать новый проект и в почти пустом проекте сразу же появился глюк.
При движении мыши по окну, необходимо рисовать линию от точки X,Y до курсора. Линия-то рисуется, но даже если не двигать мышью, то всё мерцает и в консоль несколько раз в секунду выводятся сообщения. Мерцание происходит потому что нет двойной буферизации. Но почему это происходит даже если не трогаешь мышь? Когда мышь находится вне окна - всё нормально. Значит, проблема именно в WM_MOUSEMOVE.
Код:
void Render(HDC dc)
{
    RECT r;
    if (GetClientRect(hPanelRender, &r))    
    {
        FillRect(dc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

        float x3 = ray.pt1.x;
        float y3 = ray.pt1.y;
        float x4 = ray.pt2.x;
        float y4 = ray.pt2.y;
        float x1 = wall.pt1.x;
        float y1 = wall.pt1.y;
        float x2 = wall.pt2.x;
        float y2 = wall.pt2.y;
        float den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
        std::cout << "den= " << den << std::endl;
        COLORREF colWall = RGB(255, 255, 255);
        if (den != 0.0f)
        {
            float t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / den;
            float u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den;
            std::cout << "t= " << t << std::endl;
            std::cout << "u= " << u << std::endl;
            if (u > 0.0f && t > 0.0f && t < 1.0f)
            {
                colWall = RGB(0, 255, 0);
                std::cout << "Intersects" << std::endl;
            }
        }
        HPEN pen = CreatePen(PS_SOLID, 1, colWall);
        SelectObject(dc, pen);
        MoveToEx(dc, wall.pt1.x, wall.pt1.y, NULL);
        LineTo(dc, wall.pt2.x, wall.pt2.y);
        DeleteObject(pen);

        SelectObject(dc, GetStockObject(WHITE_PEN));
        MoveToEx(dc, ray.pt1.x, ray.pt1.y, NULL);
        LineTo(dc, ray.pt2.x, ray.pt2.y);

    }
}

LRESULT CALLBACK PanelRenderProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_LBUTTONDOWN:
        {
            SetFocus(wnd);
            int x = LOWORD(lParam);
            int y = HIWORD(lParam);
            ray.pt1 = POINT{ x, y };
            InvalidateRect(hMainWindow, nullptr, true);
            break;
        }

        case WM_RBUTTONDOWN:
        {
            SetFocus(wnd);
            //int x = LOWORD(lParam);
            //int y = HIWORD(lParam);
            break;
        }

        case WM_MOUSEMOVE:
        {
            int x = LOWORD(lParam);
            int y = HIWORD(lParam);
            ray.pt2 = POINT{ x, y };
            InvalidateRect(hMainWindow, nullptr, false);
            break;
        }

        case WM_KEYDOWN:
            switch (wParam)
            {
                case VK_ESCAPE:
                case VK_RETURN:
                    DestroyWindow(hMainWindow);
                    break;
            }
            break;

        default:
            return CallWindowProc((WNDPROC)oldPanelRenderProc, wnd, message, wParam, lParam);
    }
    return 0;
}

LRESULT CALLBACK WndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_SIZE:
        {
            int w = LOWORD(lParam);
            int h = HIWORD(lParam);
            MoveWindow(hPanelRender, 0, 0, w, h, false);
            std::cout << "Window size: " << w << "x" << h << std::endl;
            break;
        }

        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(wnd, &ps);
            HDC dc = GetDC(hPanelRender);
            Render(dc);
            ReleaseDC(hPanelRender, dc);
            EndPaint(wnd, &ps);
            break;
        }

        case WM_ACTIVATE:
            SetFocus(hPanelRender);
            break;

        case WM_CREATE:
            hPanelRender = CreateWindow(L"Static", L"", WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_NOTIFY,
                0, 0, 0, 0, wnd, NULL, myInstance, NULL);
            oldPanelRenderProc = (long)SetWindowLongPtr(hPanelRender, GWLP_WNDPROC, (long)&PanelRenderProc);
            wall.pt1 = POINT{ 400, 100 };
            wall.pt2 = POINT{ 400, 400 };
            ray.pt1 = POINT{ 100, 102 };
            ray.pt2 = POINT{ 101, 102 };
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(wnd, message, wParam, lParam);
    }
    return 0;
}
не вижу ошибку.
BLACK_RAIN вне форума Ответить с цитированием
Старый 17.05.2020, 12:32   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,364
По умолчанию

Если нет на то серьезной причины всегда передавайте все сообщения в DefWindowProc.

Еще можно глянуть сюда:
https://devblogs.microsoft.com/oldne...16-00/?p=93685
waleri вне форума Ответить с цитированием
Старый 17.05.2020, 13:04   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Почему в других проектах всё нормально, а в этом не нормально?
Я делал очень много проектов на WinAPI, а такое вижу впервые. На VCL такое бывает. За это, в том числе, я не люблю VCL и редко на нем пишу. А на WinAPI этот глюк откуда, вдруг, взялся?
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.05.2020, 08:03   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 530
По умолчанию

BLACK_RAIN,
1) в конце обеих оконных процедур вместе return 0 поставь
Код:
return DefWindowProc(wnd, message, wParam, lParam);
2) Запускай Spy++ и анализируй, что провоцирует постоянное появление сообщений
Алексей1153 вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не приходит вложение из писем GaLiof PHP 7 02.02.2017 15:11
Похоже, приходит - пипец. Smitt&Wesson Свободное общение 18 11.04.2014 15:29
Приходит не полный ответ Shouldercannon Общие вопросы Delphi 3 12.03.2010 21:45
Беда не приходит одна! Tayfun Свободное общение 6 30.12.2007 07:58


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS