• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Графика в приложении Win32

  • Автор темы Guest
  • Дата начала
G

Guest

Не могу разобраться с графикой в С++. Нужно сделать: чтобы буковка (любая, пусть будет А) "летала по окошку". Т.е. начиная с какого то места двигалась по окну как бильярдный мячик. В одну сторону, ударяется о край окна, меняет направление.
В принципе, мне бы узнать как сделать так, чтобы было видно как она перемещается по прямой. Я так понимаю, что это делается через dc.TextOut(x,y,"A"); А вот дальше никак... Т.е. проблема в прорисовке...
 
Z

ZZmiy

Не могу разобраться с графикой в С++. Нужно сделать: чтобы буковка (любая, пусть будет А) "летала по окошку". Т.е. начиная с какого то места двигалась по окну как бильярдный мячик. В одну сторону, ударяется о край окна, меняет направление.
В принципе, мне бы узнать как сделать так, чтобы было видно как она перемещается по прямой. Я так понимаю, что это делается через dc.TextOut(x,y,"A"); А вот дальше никак... Т.е. проблема в прорисовке...
Не совсем понятно в чем именно проблема :)
Решение в лоб и кривыми руками -
for (;;)
{
x+=dx;
y+=dy;
***проверяем на столкновение со стенкой и если надо меняем dx dy
dc.TextOut(x,y,"A");
***инвалидейтим окно
*** "спим" несколько миллисикунд
}
Можно "разнести" эти действия между своим таймером и функцией прорисовки окна
 
G

Guest

Не получается так... выводит 4-пять раз и зависает.
 
Z

ZZmiy

Видимо потому, что идея использовать бесконечный цикл была (каюсь :) ) не очень здравой.
Вот как получилось у меня (Без MFC) -
1. В инициализацию диалога добавляем создание таймера -
Код:
UINT_PTR ID_TIMER; 
ID_TIMER = SetTimer(0,0,100,(TIMERPROC) NULL);
2. В обработчик окна -
Код:
сase WM_TIMER:
x+=dx;
y+=dy;
if (y==0 || y == YMAX)
dy*=-1;
if (x ==0 || x == XMAX
dx*= -1;
InvalidateRect(hWnd,NULL,true);
break;
3. по WM_PAINT: рисуем нужный текст - TextOut(hdc,x,y,LPCWSTR("A"),1);
4. И перед вызовом DispatchMessage(&msg) вставляем (кто бы четко объяснил зачем?)
Код:
if( WM_TIMER == msg.message )
{
WndProc( msg.hwnd, msg.message, msg.wParam, msg.lParam);
continue;
}

Должно заработать
 
M

Maxx

ZZmiy : первая релизация работать не будет
но с WM_TIMER должна но могут быть флики что не есть очень гут (особенно когда частота рисования большая)
надо испотльзовать memory dc и еще смотреть на регион (в структуре PAINTSTRUCT или вызывать GetUpdateRect) который надо перерисовывать
и рисовать только тот прямоугольник который потерялся (has been invalidated by windows)
куча if-ов быстрей выполняется чем куча call-ов

ZZmiy та еще по повуду SetTimer
вот что пишут в MSDN
hWnd - Handle to the window to be associated with the timer
nIDEvent - Specifies a nonzero timer identifier. (если указатель на обработчик сообщений событий таймера не 0 (это про C++ где NULL то ли лишнее то ли в наследство от C), то идентификатор таймера должен быть 1 или еще что-нить (но не 0) ну и дескрипрор окна должен представлять какое-нить окно а не 0
Айка в msdn есть много прмеров как рисовать и по таймеру и картинки с прозрачным фоном и еще много чего
искать надо (но тока msdn только на аглицком языке, что у некоторых может вызвать большие трудности)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!