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;
}
вопрос о таймерах и использовании массивов...
Проблема заключается в том, что если вместо массивов ставить просто переменные, то движение прямоугольника на экране происходит... а если оставить код как есть, то ничего не происходит... прямоугольник только рисуется, но не движется...Объясните пожалуйста почему так и как это можно избежать...
вот код моей оконной процедуры:
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;
}
Цитата: Irene_001
Подскажите пожалуйста в чём ошибка...
x1[0] = 0, y1[0] = 240, x2[0] = 10, y2[0] = 250;
x1[0] = 0, y1[0] = 240, x2[0] = 10, y2[0] = 250;
Эта строка отрабатывает при каждом вызове WndProc, и соответственно значения в этих переменных перезаписываются. Если необходимо проинициализировать переменные, используй сообщение WM_CREATE
Поэтому необходимо выполнять их инициализацию в другом месте
Например, в обработке WM_CREATE:
Код:
СПАСИБО ОГРОМНОЕ!!!