Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вопрос о таймерах и использовании массивов...

14K
06 ноября 2007 года
Irene_001
43 / / 29.07.2007
Подскажите пожалуйста в чём ошибка...
Проблема заключается в том, что если вместо массивов ставить просто переменные, то движение прямоугольника на экране происходит... а если оставить код как есть, то ничего не происходит... прямоугольник только рисуется, но не движется...Объясните пожалуйста почему так и как это можно избежать...
вот код моей оконной процедуры:

LRESULT CALLBACK xxxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDc, hComppatibleDC;
PAINTSTRUCT ps;
HBRUSH brush;
HPEN hpen;
RECT rect;
int t;
static int x1[10], y1[10], x2 [10], y2[10];//а во если "это" заменить переменнми
//(ну и по всему коду тоже) работать будет как надо...
x1[0] = 0, y1[0] = 240, x2[0] = 10, y2[0] = 250;
static int posX = 10, posY = 0;

static int ProvPosX = 0, ProvPosY = 0;



switch(message)
{
case WM_PAINT:
hDc = BeginPaint(hWnd, &ps);

GetClientRect(hDc, &rect);

RoundRect(hDc, x1[0], y1[0], x2[0], y2[0], 3, 3 );

EndPaint(hWnd,&ps);

break;

case WM_TIMER :
InvalidateRect(hWnd, NULL, TRUE);
x1[0] += posX;
x2[0] += posX;
y1[0] += posY;
y2[0] = posY;
InvalidateRect(hWnd, NULL, TRUE);

return 0;


case WM_KEYDOWN:
switch(wParam)
{
case VK_LEFT:
posX = -10;
posY = 0;
break;
case VK_RIGHT:
posX = 10;
posY = 0;
break;
case VK_UP:
posX = 0;
posY = -10;
break;
case VK_DOWN:
posX = 0;
posY = 10;
break;


case VK_F3:
if (posX != 0 || posY != 0)
{
ProvPosX = posX;
ProvPosY = posY;
posX = 0;
posY = 0;
}
else
{
posX = ProvPosX;
posY = ProvPosY;
}
break;
}
break;



case WM_DESTROY:
KillTimer(hWnd, ID_TIMER);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}
6.4K
06 ноября 2007 года
Host
122 / / 22.09.2005
Цитата: Irene_001
Подскажите пожалуйста в чём ошибка...

x1[0] = 0, y1[0] = 240, x2[0] = 10, y2[0] = 250;



Эта строка отрабатывает при каждом вызове WndProc, и соответственно значения в этих переменных перезаписываются. Если необходимо проинициализировать переменные, используй сообщение WM_CREATE

1.9K
06 ноября 2007 года
max_dark
256 / / 11.11.2005
Дело в том, что элементы массивов не воспринимаются статическими
Поэтому необходимо выполнять их инициализацию в другом месте
Например, в обработке WM_CREATE:
Код:
LRESULT CALLBACK xxxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    HDC hDc, hComppatibleDC;
    PAINTSTRUCT ps;
    HBRUSH brush;
    HPEN hpen;
    RECT rect;
    int t;
    static int x1[10], y1[10], x2 [10], y2[10];
    //x1[0] = 0, y1[0] = 240, x2[0] = 10, y2[0] = 250; // Проблемная строка
    static int posX = 10, posY = 0;

    static int ProvPosX = 0, ProvPosY = 0;

    switch(message) {
        case WM_CREATE:
            // Выполняем инициализацию при создании окна
            x1[0] = 0;
            y1[0] = 240;
            x2[0] = 10;
            y2[0] = 250;
            break;
        case WM_PAINT:
            hDc = BeginPaint(hWnd, &ps);
            GetClientRect(hDc, &rect);
            RoundRect(hDc, x1[0], y1[0], x2[0], y2[0], 3, 3 );
            EndPaint(hWnd,&ps);
            break;

        case WM_TIMER :
            //InvalidateRect(hWnd, NULL, TRUE); // Необязательно это делать два раза :)
            x1[0] += posX;
            x2[0] += posX;
            y1[0] += posY;
            y2[0] = posY;
            InvalidateRect(hWnd, NULL, TRUE);

            return 0;


        case WM_KEYDOWN:
            switch(wParam) {
                case VK_LEFT:
                    posX = -10;
                    posY = 0;
                    break;
                case VK_RIGHT:
                    posX = 10;
                    posY = 0;
                    break;
                case VK_UP:
                    posX = 0;
                    posY = -10;
                    break;
                case VK_DOWN:
                    posX = 0;
                    posY = 10;
                    break;


                case VK_F3:
                    if (posX != 0 || posY != 0) {
                        ProvPosX = posX;
                        ProvPosY = posY;
                        posX = 0;
                        posY = 0;
                    } else {
                        posX = ProvPosX;
                        posY = ProvPosY;
                    }
                    break;
                default:
                    return 0;
            }
            InvalidateRect(hWnd,NULL,TRUE); // Перисовываем окно при нажатии клавишы
            break;

        case WM_DESTROY:
            KillTimer(hWnd, ID_TIMER);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}
14K
06 ноября 2007 года
Irene_001
43 / / 29.07.2007
СПАСИБО ОГРОМНОЕ!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог