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

Тема в разделе "MS Visual C++", создана пользователем -, 14 дек 2008.

  1. Гость

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

    ZZmiy Гость

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

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

    ZZmiy Гость

    Видимо потому, что идея использовать бесконечный цикл была (каюсь :) ) не очень здравой.
    Вот как получилось у меня (Без MFC) -
    1. В инициализацию диалога добавляем создание таймера -
    Код (Text):
    UINT_PTR ID_TIMER;
    ID_TIMER = SetTimer(0,0,100,(TIMERPROC) NULL);
    2. В обработчик окна -
    Код (Text):
    с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) вставляем (кто бы четко объяснил зачем?)
    Код (Text):
    if( WM_TIMER == msg.message )
    {
    WndProc( msg.hwnd, msg.message, msg.wParam, msg.lParam);
    continue;
    }
    Должно заработать
     
  5. Maxx

    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 только на аглицком языке, что у некоторых может вызвать большие трудности)
     
Загрузка...
Похожие Темы - Графика приложении Win32
  1. Lers
    Ответов:
    0
    Просмотров:
    1.647
  2. 203
    Ответов:
    2
    Просмотров:
    1.488
  3. vladis222
    Ответов:
    1
    Просмотров:
    2.129
  4. Jokervad
    Ответов:
    0
    Просмотров:
    1.284
  5. Vadik(R)
    Ответов:
    3
    Просмотров:
    3.819

Поделиться этой страницей