Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2012, 11:27   #1
DETONAVOMEK
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 28
По умолчанию Вывод текста по букве

Всем привет!
Работаю с WinApi + C/C++.
Мне нужно, чтобы в окне выводило текст по букве. То-есть сначала первую букву, потом, спустя некоторое время, вторую, потом третью, и так далее.
Была идея создать label и в таймере переписывать текст, но тогда на каждый тик таймера перезаписываеться весь текст. Также в WM_PAINT просто перерисовывал текст, но тогда также нужно перерисовывать весь плюс сложно найти верный InvalideRect для перерисовки. Итого я запутался.
Вопрос следующий. Как это сделать верно?
DETONAVOMEK вне форума Ответить с цитированием
Старый 22.06.2012, 12:04   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от DETONAVOMEK Посмотреть сообщение
Была идея создать label и в таймере переписывать текст, но тогда на каждый тик таймера перезаписываеться весь текст.
Хорошая идея. Переписывайте все символы, выведенные ранее, к примеру:

БУ
"таймер отсчитал заданое время"
БУРА
"таймер отсчитал заданое время"
БУРАТИ
"таймер отсчитал заданое время"
БУРАТИНО
8Observer8 вне форума Ответить с цитированием
Старый 22.06.2012, 12:09   #3
DETONAVOMEK
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Хорошая идея. Переписывайте все символы, выведенные ранее, к примеру:

БУ
"таймер отсчитал заданое время"
БУРА
"таймер отсчитал заданое время"
БУРАТИ
"таймер отсчитал заданое время"
БУРАТИНО
А при больших текстах(больше чем 400 символов) и оновлении таймера 0,5 секунды оно не будет глючить? Оно вроде стирает весь текст, а потом записывает снова. Или label не так работает?
DETONAVOMEK вне форума Ответить с цитированием
Старый 22.06.2012, 12:15   #4
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
Мне нужно, чтобы в окне выводило текст по букве. То-есть сначала первую букву, потом, спустя некоторое время, вторую, потом третью, и так далее.
Вот тебе набросок, как для этого вычислять координаты вывода очередной буквы:
Код:
char text[] = "Just a test";

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int curr;
    switch (message)
    {
        case WM_CREATE:
            SetTimer(hwnd, MY_TIMER, 200, NULL);
            curr = 0;
            break;
        case WM_TIMER:
            switch(wParam)
            {
                case MY_TIMER:
                    if(!text[curr]) KillTimer(hwnd, MY_TIMER);
                    else
                    {
                        HDC hdc = GetDC(hwnd);

                        SIZE width;
                        GetTextExtentPoint32(hdc, text, curr, &width); // Вот она, магия

                        TextOut(hdc, width.cx, 0, (LPCTSTR)text+curr, 1);
                        curr += 1;
                        ReleaseDC(hwnd, hdc);
                    }
                    break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
Дорабатывай под свои нужды
volvo877 вне форума Ответить с цитированием
Старый 22.06.2012, 12:21   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от DETONAVOMEK Посмотреть сообщение
А при больших текстах(больше чем 400 символов) и оновлении таймера 0,5 секунды оно не будет глючить? Оно вроде стирает весь текст, а потом записывает снова. Или label не так работает?
Решение вам уже подсказали. А глючить при таких условиях точно не будет. Вот интересно при каких условиях начнёт?

А что за label такой? Как вы его создаёте?

А почему бы в Edit не выводить?

И как первоначально звучит задание?
8Observer8 вне форума Ответить с цитированием
Старый 22.06.2012, 12:22   #6
DETONAVOMEK
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от volvo877 Посмотреть сообщение
Вот тебе набросок, как для этого вычислять координаты вывода очередной буквы:
Код:
...
Дорабатывай под свои нужды
Спасибо, это то что нужно! Попытаюсь сделать =)
DETONAVOMEK вне форума Ответить с цитированием
Старый 22.06.2012, 12:27   #7
DETONAVOMEK
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Решение вам уже подсказали. А глючить при таких условиях точно не будет. Вот интересно при каких условиях начнёт?

А что за label такой? Как вы его создаёте?

А почему бы в Edit не выводить?

И как первоначально звучит задание?
Просто программа под старые компьютеры, поэтому я страхуюсь.
Edit можно использовать.
>И как первоначально звучит задание?
Нужно сделать что-то на подобе иммитации старого... терминала, или консоли. Чёрный фон, зеленый текст и побуквенный вывод. Типа "машына не может печатать быстее" =)
DETONAVOMEK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод текста )Игнат( Общие вопросы Delphi 3 10.08.2010 09:51
Вывод текста Aleksey1989 Помощь студентам 7 25.04.2010 16:52
Вывод текста SeeWhoIam Помощь студентам 2 24.12.2009 22:36
C|Вывод текста Troi666 Помощь студентам 4 09.05.2009 01:31
вывод текста Shkentik Общие вопросы Delphi 5 21.04.2009 23:29