вопрос о массивах и таймерах...

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Irene_001
Сообщения: 4
Зарегистрирован: 06 ноя 2007, 16:25

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

Код: Выделить всё

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;
}
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Вот эта строка кода выполняется при каждом вызове оконной процедуры, в т.ч. на WM_TIMER:

Код: Выделить всё

x1[0] = 0, y1[0] = 240, x2[0] = 10, y2[0] = 250;
Т.е. все время в процедуру отрисовки попадают те же координаты, поэтому и не движется изображение. А когда вы объявляете переменные не массивами, наверняка пишите что-то вроде:

Код: Выделить всё

static int x1 = 0, y1 = 240, x2 = 10, y2 = 250;
При этом инициализация локальных статических переменных выполняется только один раз. Как и было задумано, не так ли? Короче, почитайте про разницу между инициализацией и присваиванием, особенно в контексте статических переменных.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

И на будущее, пользуйтесь тегами выделения кода, иначе читать тяжело (на первый случай поправил).
Irene_001
Сообщения: 4
Зарегистрирован: 06 ноя 2007, 16:25

спасибо боьшое за помощь! и за редактирование тоже)))
Ответить