1

в Microsoft Visual C++

Как можно в окне приложения нарисовать движущийся предмет?
Например, шарик. Или просто точку - ту, которая функцией SetPixel рисуется.
Или текст.
Скорость движения - как можно больше. Траектория - любая пошагово вычисляемая. Например, эллипс (замкнутая, чтоб за окно не вылазить).
Или рандом.

Проблема в том, что если рисовать его внутри обработки события WM_PAINT, то он рисуется лишь при ресайзинге окна (а в остальное время событие не вызывается).  А если за пределами этого события (например, в процедуре таймера) - то он не рисуется вовсе (или рисуется где-нибудь на невидимом девайс-контексте, хотя DrawFocusRect рисует на том же девайс-контексте вполне видимый прямоугольник).


И второй вопрос, ещё более ламерский: что нужно сказать транслятору, чтобы он не ругался "unexpected end of file" на новые добавляемые в проект файлы.
Замечу, что пока в проекте только один cpp-файл с программой - тот, который автоматически создан - компилятор не ругается, а нормально запускает приложение.

2

дык в таймере... делаешь PostMessage чего нибудь. А в обработчике события делаешь Repaint. И все. Можно прямо из таймера делать WM_PAINT...

3

busak пишет:

дык в таймере... делаешь PostMessage чего нибудь. А в обработчике события делаешь Repaint. И все. Можно прямо из таймера делать WM_PAINT...

Попробовал. На слово Repaint идёт ругань: необъявленный идентификатор. Видимо, нет такой встроенной функции (если б была, в редакторе появлялась бы автоподсказка о параметрах).

Посылка WM_PAINT из процедуры обработки таймера ничего не меняет в поведении программы.


И ещё, в Windows XP есть такая странность. Если запустить Far, а из него некую графическую DOS-программу, написанную на турбо-паскале, то она пять секунд работает, а потом виснет, продолжая работать. Если пошевелить мышку или нажать любую кнопку, она продолжит работу с нормальной скоростью, а через пять секунд снова остановится. В Windows 98 ничего подобного не происходит.

4

kaprizka пишет:

И ещё, в Windows XP есть такая странность. Если запустить Far, а из него некую графическую DOS-программу, написанную на турбо-паскале, то она пять секунд работает, а потом виснет, продолжая работать. Если пошевелить мышку или нажать любую кнопку, она продолжит работу с нормальной скоростью, а через пять секунд снова остановится. В Windows 98 ничего подобного не происходит.

таймслайсы система некорректно забирает. используй что-то типа http://www.tamedos.com/

5

xeye пишет:

таймслайсы система некорректно забирает. используй что-то типа http://www.tamedos.com/

В описании сказано:
Tame solves these problems and many others.
Application changes the system date
Application forces the console to full screen mode
Application uses file locks excessively
Only one user at a time can start the application
Printing is delayed, or does not start until you exit the application
Application depends on BIOS services that are not implemented

Однако аппликейшн не меняет системную дату (и не использует её),
во время запуска аппликейшена скрин и так уже фулл,
к файлам обращается только в крайнем случае, а не постоянно,
запускается от одного юзера - а больше и не надо: компьтер к сетям не подключен,
принтер не используется, да его и нет,
BIOS сервисы тут, скорее всего, ни при чём - иначе бы и в Win98 те же глюки наблюдались.

Вот и возникает вопрос: по какому принципу WinXP режет таймслайсы?
Если при запуске аппликейшена как единственного на одиночном компьютере и от имени пользователя Admin (имеющего права администратора) аппликейшен через пять секунд тормозится. Если нажать Ctrl-Alt-Del и посмотреть процессы, то 98% процессорного времени занимает процесс "Бездействие системы". Повышение приоритета процесса с приложением вплоть до "Real-Time" никак не меняет поведение.

Есть процессы, подозрительные из-за высокого приоритета:
csrss.exe
winlogon.exe
Что бы это csrss значило?

6

kaprizka пишет:

Вот и возникает вопрос: по какому принципу WinXP режет таймслайсы?
Если при запуске аппликейшена как единственного на одиночном компьютере и от имени пользователя Admin (имеющего права администратора) аппликейшен через пять секунд тормозится. Если нажать Ctrl-Alt-Del и посмотреть процессы, то 98% процессорного времени занимает процесс "Бездействие системы". Повышение приоритета процесса с приложением вплоть до "Real-Time" никак не меняет поведение.

Есть процессы, подозрительные из-за высокого приоритета:
csrss.exe
winlogon.exe
Что бы это csrss значило?

паскалевкий RTL большую часть времени мотает пустой цикл ожидания клавиатуры (через сервис int 21h или не-помню-уже-что) или мышки (через int 33h) вот именно этот цикл ловится XP, которая считает, что программа ничем полезным в это время не занимается.

7

А как этому поросёнку можно сказать, что программа занимается чем-то полезным (на самом деле она делает длинные вычисления и вывод точек)?

8

вот пример из MSDN

суть его в том, что если тебе нужно перерисовать клиентскую часть окна, вызывай InvalidateRect

POINT aptPentagon[6] = {50,2, 98,35, 79,90, 21,90, 2,35, 50,2},
      aptHexagon[7]  = {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2};
POINT *ppt = aptPentagon;
int cpt = 6;

  .
  .
  .

case WM_CHAR:
    switch (wParam)
    {
        case '5':
            ppt = aptPentagon;
            cpt = 6;
            break;
        case '6':
            ppt = aptHexagon;
            cpt = 7;
            break;
    }
    InvalidateRect(hwnd, NULL, TRUE);
    return 0L;

case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    GetClientRect(hwnd, &rc);
    SetMapMode(hdc, MM_ANISOTROPIC);
    SetWindowExtEx(hdc, 100, 100, NULL);
    SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);
    Polyline(hdc, ppt, cpt);
    EndPaint(hwnd, &ps);
    return 0L;

9

kaprizka пишет:

Есть процессы, подозрительные из-за высокого приоритета:
csrss.exe
winlogon.exe
Что бы это csrss значило?

это системные процессы и убивать их не стоит - винды навернутся