Бегущая строка

Тема в разделе "C и С++ FAQ", создана пользователем koma, 6 мар 2008.

  1. koma

    koma Гость

    нужно выводить циклическую бегущую строку в окне Win32-приложения
     
  2. Froex

    Froex Гость

    1. Предположим, что текст строки занесен в переменную MyString
    2. На срабатывание таймера пишем
    Код (Text):
    MyString=Copy(MyString,2,length(MyString)-1)+MyString[1];
    если необходимы интервалы между строками, то добавляем в строку пробелы, прежде чем запускать таймер: MyString:=MyString+' ';
     
  3. koma

    koma Гость

    По-моему, так вообще нельзя писать в Win32. Не знаю, что вместо Copy, но вместо length используется strlen() это точно. И что-то я не понимаю, как это должно работать
     
  4. gamecreator

    gamecreator Гость

    ну может он на псевдокоде написал
     
  5. Froex

    Froex Гость

    На Си я практически не пишу, поэтому не совсем знаю, какие там команды)))
    смысл в том, что первый символ перемещается в конец и все. т.к. в конце строки могут быть пробелы, то получается, что строка как бы бежит в сторону.
     
  6. uis99

    uis99 Гость

    Код (Text):
    case WM_TIMER:
    TextOut(hdc,x,y,"Hello!",6);
    InvalidateRect(hWnd,GetClientRect(hWnd),TRUE);
    x++;
    if(x>=800) x=0;
    break;
     
  7. koma

    koma Гость

    ага. пасиба. тока GetClientRect(hwnd, &rect) надо раньше вызывать, т.к. вместо этой функции должна быть передана ссылка на rect.
    тока терь у меня появилась другая проблема: Timer. Как реализовать TimerProc и где SetTimer использовать? и как мне прицепить этот hello в конец? (длину строки в пикселях знаю)

    в общем, я сделала без таймера, тока не знаю, как мне обрубать эту строку при нулевом иксе (у меня она справа налево двигается) и не знаю, как сделать ее циклической
     
  8. gamecreator

    gamecreator Гость

    выше написано: первый символ переводишь в конец строки и печатаешь строку заново.

    а таймер - это событие. используй функцию SetTimer и поставь обработчик на WM_TIMER
     
  9. koma

    koma Гость

    в первом случае не понимаю, что делает Copy; а во втором, как я думаю, строка будет выводиться до 800го пикселя по иксу в окне, а потом начинаццо с начала окна. а мне надо, чтобы она всегда бежала, причем справа налево :) ну фиг с ним...
    теперь таймер: наскока я понимаю из определения в справке, если в функцию
    UINT SetTimer(
    HWND hWnd,
    UINT nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc );
    передавать
    SetTimer(NULL, [все равно что],100[мс], NULL), то каждые 100 мс у меня будет посылаться сообщение WM_TIMER в WndProc, в обработчике которого код. в функции потока я вызываю SetTimer, значит, каждые 100 мс у меня строка должна двигаться вперед на 1 пиксел. так? тока у меня ничего не происходить вообще :(
    код в обработчике:
    Код (Text):
    void WndProc_OnTimer(HWND hwnd, UINT id)
    {
    HDC hdc=GetDC(hwnd);
    GetClientRect(hwnd,&rect);           
    TextOut(hdc,xPos,yPos,"Hello!",6);//xPos=yPos=10 первоначально
    InvalidateRect(hwnd,&rect,TRUE);
    xPos++;
    if(xPos>=800) xPos=0;
    ReleaseDC(hwnd,hdc);

    }
    или я с SetTimer'ом че-то не так делаю? 1) если посылать дескриптор окна, то что тогда посылать вторым параметром? 2) если на TimerProc указатель не нулевой, то что в этой процедуре писать?


    и еще: а смысл этого таймера? мне кажется, можно было это все циклом от х=0 до х=800 сделать, в который добавить какой-нибудь фор для задержки. или я неправильно понимаю все это?

    и не стирает ли InvalidateRect то, что только что вывел TextOut?
     
  10. Pasha

    Pasha Гость

    koma
    Ты определись - или рисуй в OnTimer, но убери InvalidateRect, или перенеси отрисовку в OnPaint и оставь только InvalidateRect.
     
  11. gamecreator

    gamecreator Гость

    на 1 символ

    неправильно, не надо менять координаты, надо 1 символ из начала строки перенести в конец (Froex подробно все описал).

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

    конечно стирает.
     
  12. koma

    koma Гость

    а. согласна. InvalidateRect же и отсылает в OnPaint этот rect. но в OnTimer'e убираю InvalidateRect - все равно не идет :(
    в случае с TextOut это же пиксел.
    второй и третий параметры функции:
    nXStart
    [in] Specifies the logical x-coordinate of the reference point that the system uses to align the string.
    nYStart
    [in] Specifies the logical y-coordinate of the reference point that the system uses to align the string.
    почему? (просто я так и делаю: не могу разобраться с таймером, не работает - и все :()
     
  13. gamecreator

    gamecreator Гость

    нет, это две совершенно разные вещи. просто переноси по символу с начала строки в конец и отображай ее на экране с неизменными координатами
    потому чтотаймер выполняется параллельно с другими функциями
     
  14. koma

    koma Гость

    в общем, все работает, тока все-таки по-своему сделала - с пикселами и без таймера) при ресайзе, конечно, глючит, но демонстрационно - работает.
    всем спасибо)
     
Загрузка...

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