Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Горизонтальная прокрутка



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Полный экран часть 2 | Все обучалки раздела | Установка значка

Описание

Обучалка, которая использует горизонтальную линию прокрутки для перемещения текста вправо.

Программа выводит в окно длинную строку, которую можно просмотреть с помощью горизонтальной прокрутки.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

// Done by TheTutor -- 07/23/01
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

/*
      То, что мы хотим сделать, не будет слишком сложным. Мы создадим окно, которое
      отображает на экране длинное предложение. Чтобы иметь возможность полностью
      прочитать предложение, нам нужно будет воспользоваться горизонтальной линией
      прокрутки.

      После просмотра этой обучалки, вы будете иметь возможность добавлять в ваши
      программы горизонтальные линии прокрутки.
*/


#include <windows.h>

#define classname "GT_HorzBars" // Имя оконного класса

// Глобальные переменные ***

// Это длинное предложение, которое появится в окне.
// Чтобы прочитать его, нам понадобится прокрутка.
char sentence[] = "Это предложение, которое вам нужно прокрутить горизонтально, 
чтобы полностью прочитать его. Если вы можете прочитать все это предложение 
без горизонтальной прокрутки, вы обладаете потрясающими возможностями и вам 
следует считать себя одаренным. --";

// Стандартная call back функция
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);


int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprev, PSTR cmdline, int ishow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclassex = {0};

    // Заполняем нужные нам поля
    wndclassex.cbSize = sizeof(WNDCLASSEX);
    wndclassex.style = CS_HREDRAW | CS_VREDRAW;
    wndclassex.lpfnWndProc = WinProc;
    wndclassex.hInstance = hinstance;
    wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclassex.lpszClassName = classname;

    RegisterClassEx(&wndclassex);

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, // У окна будет жирная рамка
                                      classname,
                                      "Horizontal Scroll Bar",
                                      WS_SYSMENU | WS_HSCROLL, /* Обратите внимание на WS_HSCROLL
                                                                                Так мы создаем окно с горизонтальной
                                                                                линией прокрутки.

                                                                                На случай, если вы не знаете, что значит
                                                                                '|' между "WS_SYSMENU" и "WS_HSCROLL":
                                                                                это значит "комбинация этих двух стилей"

                                                                              */
                                      320, // Ширина окна
                                      200, // Высота окна
                                      CW_USEDEFAULT,
                                      CW_USEDEFAULT,
                                      NULL,
                                      NULL,
                                      hinstance,
                                      NULL);

            // Проверка на ошибку
            if(hwnd == NULL)
                  return EXIT_FAILURE; // Не смогли создать окно

    // Вывести и обновить окно
    ShowWindow(hwnd, ishow);
    UpdateWindow(hwnd);

      while(1)
      {
            // Проверяем сообщения окна - если они есть, обрабатываем их
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                  if(msg.message == WM_QUIT)
                        break;
                        
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
            }

      } // конец while(1)

      UnregisterClass(classname,hinstance); // Освобождаем память
          return msg.wParam;
}


LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    
    static int cur_xpos; // Эта переменная будет представлять нашу текущую координату х, 
                                     // которая будет показывать, насколько далеко от левой стороны,
                                     // (х = 0), мы прокрутили вправо
                           
    
    SCROLLINFO scroll_info; // Это структура Windows, которая будет хранить информацию
                              // о горизонтальной линии прокрутки

    // В зависимости от сообщения
    switch(message)
    {
            case WM_CREATE:
                  
                  cur_xpos = 0; // Когда мы создаем окно, устанавливаем "cur_xpos" в ноль
                                // (мы еще не прокручивали, поэтому она должна быть равна нулю)

                  // Заполняем SCROLLINFO --

                  // Это ВСЕГДА следует устанавливать таким образом - так говорит MSDN
                  scroll_info.cbSize = sizeof(SCROLLINFO);

                  // А теперь устанавливаем другие параметры "scroll_info", которые нам нужны

                  scroll_info.nMin = 0; // Это наименьшее положение х, на которое можно прокрутить влево
                  
                  scroll_info.nMax = strlen(sentence); // Нам нужно иметь возможность прокручивать по крайней мере
                                                                         // на длину предложения (наибольшая позиция прокрутки направо)
                  
                  scroll_info.nPage = 1; 
                  // Мы будем обрабатывать окно как "одну большую страницу", которую мы прокручиваем

                  scroll_info.fMask = SIF_PAGE | SIF_RANGE; 
                  /*      А теперь установкой этих двух флагов мы говорим следующее:
                        scroll_info.nPage содержит "размер страницы", и поэтому наша линия прокрутки
                        будет выглядеть пропорционально правильно
                        scroll_info.nMin содержит минимальное значение диапазона перемещения
                        scroll_info.nMax содержит максимальное значение диапазона перемещения
                  */
                  
                  /*      Теперь, когда у нас "scroll_info" заполнена так, как нам нужно, установим ее.
                        Параметры функции:
                        hwnd - ссылка на окно
                        SB_HORZ - флаг, определяющий, какой тип линии прокрутки мы используем
                        &scroll_info - адрес структуры SCROLLINFO, которую мы заполнили информацией
                        false - хотим ли мы перерисовывать линию прокрутки
                  */
                  
                  SetScrollInfo(hwnd,SB_HORZ,&scroll_info,false);

                        return 0;

            // Это сообщение посылается, когда происходит событие прокрутки
            case WM_HSCROLL:
                  
                  /*      Это флаг, который указывает, какой тип действия запрашивает прокрутка.
                        Все, что пользователь делает с линией прокрутки, представлено этим флагом.
                  */

                  // LOWORD(wparam) равен флагу, который содержит действия пользователя
                  switch(LOWORD(wparam)) 
                  {
                        case SB_LINELEFT: // Пользователь запросил прокрутку влево на 1 позицию
                              cur_xpos = cur_xpos - 1; // Поэтому обновим cur_xpos 
                                    break;

                        case SB_LINERIGHT: // Пользователь запросил прокрутку вправо на 1 позицию
                              cur_xpos = cur_xpos + 1; // Поэтому обновим cur_xpos 
                                    break;

                        case SB_THUMBPOSITION: // Пользователь передвинул полосу прокрутки мышью
                              cur_xpos = HIWORD(wparam); // HIWORD параметра wparam указывает на новое положение
                                    break;                 // полосы прокрутки

                        default:
                              /*  - Замечание - есть и другие флаги, которые могут посылаться, но
                                    мы не будем ничего делать, получая их. Полный список флагов ищите на MSDN
                              */
                              
                              break;

                  } // конец switch(LOWORD(wparam))
                  
                  scroll_info.cbSize = sizeof(SCROLLINFO);

                  scroll_info.fMask = SIF_POS | SIF_RANGE;  
                  /*      А теперь, так как мы передаем "scroll_info" в GetScrollInfo() следующей строкой,
                        то это означает "заполнить scroll_info.nPos текущим положением полосы прокрутки
                        и заполнить nMin и nMax в scroll_info минимальным и максимальным диапазоном линии
                        прокрутки.
                  */
                  
                  // Заполняем "scroll_info" текущей информацией о прокрутке
                  // SB_HORZ указывает, какой тип прокрутки мы используем
                  GetScrollInfo(hwnd, SB_HORZ, &scroll_info);

                  // Если cur_xpos не равняется позиции полосы прокрутки, значит
                  // пользователь выполнил прокрутку и нам нужно обновить полосу и экран
                  if(cur_xpos != scroll_info.nPos)
                  {
                        // Нам нужно убедиться, что cur_xpos входит в диапазон прокрутки
                        if(cur_xpos > scroll_info.nMax)
                              cur_xpos = scroll_info.nMax;

                        else if(cur_xpos < scroll_info.nMin)
                              cur_xpos = scroll_info.nMin;

                        scroll_info.nPos = cur_xpos; // Мы знаем, что "cur_xpos" попадает в диапазон,
                                                                   // поэтому устанавливаем scroll_info на новое положение

                        // Установим полосу прокрутки на новое положение
                        // Так как мы переместились, перерисуем полосу прокрутки
                        SetScrollInfo(hwnd, SB_HORZ, &scroll_info, true);

                        // Полоса прокрутки обновилась, поэтому нам нужно обновить экран.
                        // Эта функция посылает сообщение WM_PAINT, которое и обновит окно.
                        InvalidateRect(hwnd,NULL,TRUE);
                  }
                  
                  return 0;

            case WM_PAINT:

                  hdc = BeginPaint(hwnd, &ps); // Получаем HDC, связанный с окном
                  
                  /*      Отображаем часть предложения начиная с 2,20 (x,y)
                        А теперь вот где фокус - предложение это глобальный символьный массив, поэтому
                        добавляя к нему "cur_xpos" мы начитаем печатать строку с буквы, равной по номеру
                        "cur_xpos". Например:
                        cur_xpos = 5, первая буква на экране это пятая буква предложения.
                        Мы также используем длину строки таким образом: strlen(sentence + cur_xpos),
                        чтобы в конце строки не получить "мусор"
                  */
                  TextOut(hdc, 2, 25, (sentence + cur_xpos), strlen(sentence + cur_xpos));
                  
                  EndPaint(hwnd, &ps);
                        return 0;

            // Если окно закрыто или уничтожено
            case WM_CLOSE:
            case WM_DESTROY:
                  
                  PostQuitMessage(0);
                        return 0;
    
      } // конец switch(message)

    return DefWindowProc(hwnd, message, wparam, lparam);
}

/*
|  TheTutor                    
|  thetutor@gametutorials.com  
|  © 2000-2002 GameTutorials   
*/
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

Скачать обучалку (Visual C++ 6)

Полный экран часть 2 | Все обучалки раздела | Установка значка

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

трехгорка новостройки и ппм-недвижимость и котельники парковый , только ты в купальники купальники интернет магазин как тут Купальник для тебя , доска пола , основания для матрасов