C ++ левая кнопка мыши вниз справка - PullRequest
1 голос
/ 20 августа 2010

хорошо, я знаю, как сделать левую кнопку мыши внизу (WM_LBUTTONDOWN).но у меня есть некоторые проблемы с этим.при использовании его с векторами кажется, что каждый раз при нажатии левой кнопки мыши добавляется 101 элемент.Я думаю, что каждый раз, когда кнопка мыши нажата, она отправляет 101 сообщение на WM_LBUTTONDOWN, что приводит к добавлению 101 элемента.вот код для мероприятия

case WM_LBUTTONDOWN:
    iRegularShots=0;
    pt.x = GET_X_LPARAM(lParam); 
    pt.y = GET_Y_LPARAM(lParam); 
    pRegularShots.push_back(pt); 
    InvalidateRect(hWnd, rect, false); 
    break;

есть идеи?я не пропускаю перерыв;я использовал функцию size (), чтобы сказать мне, сколько элементов было назначено.я установил две точки останова одну одну pRegularShots.push_back (pt);и другой на другой функции, которая будет использовать то, что находится внутри вектора, чтобы отобразить изображение.и я получил 101 вызов там, но только один вызов на pRegularShots.push_back (pt) ;.это код функции

VOID fRegularShot(HDC hdc, HWND hWnd) 
{ 
    Graphics graphics(hdc); 
    Image shot(L"RegularShots.png"); 
    long index=0;
    long s=pRegularShots.size();
    while(index < (long)pRegularShots.size()) 
    { 
        graphics.DrawImage(&shot, pRegularShots[index].x, pRegularShots[index].y); 
        ++index;
    } 
} 

windows prudocer

switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        OnPaint(hdc, hWnd, 1);
        if(iRegularShots==0)
        {
            fRegularShot(hdc, hWnd);
        }
        EndPaint(hWnd, &ps);
        break;
    case WM_LBUTTONDOWN:
        iRegularShots=0;
        pt.x = GET_X_LPARAM(lParam); 
        pt.y = GET_Y_LPARAM(lParam); 
        pRegularShots.push_back(pt); 
        InvalidateRect(hWnd, rect, false); 
        return 0;
        break; 
    case WM_LBUTTONUP:
            iRegularShots=1;
            break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 20 августа 2010

Нет никаких причин, по которым вы обычно получаете много событий WM_LBUTTONDOWN, когда нажимаете кнопку один раз.

Возможно, в вашем предыдущем разделе case (который обрабатывает некоторые другие сообщения) отсутствует break * * 1005

1 голос
/ 20 августа 2010

о боже, это была моя вина, я установил vetor на 100 elemnts извините, ребята

0 голосов
/ 20 августа 2010

Что вы возвращаете из оконной процедуры? WM_LBUTTONDOWN должен вернуть 0 , чтобы указать, что сообщение было обработано (если вы этого не сделаете, вы продолжите получать сообщение до его обработки).

0 голосов
/ 20 августа 2010

Вы уверены, что именно этот код генерирует 101 запись в векторе - предыдущий case (если он есть) не пропущен break; не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...