Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Jasper
0 / 0 / 0
Регистрация: 07.12.2009
Сообщений: 58
#1

Нужен пример интерфейса - C++

15.10.2010, 19:42. Просмотров 2475. Ответов 8
Метки нет (Все метки)

Помагите нужен пример интерфейса на С++. В заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2010, 19:42     Нужен пример интерфейса
Посмотрите здесь:

Нужен пример хэширования - C++
Здравствуйте! Ни как не могу понять хэширование,если не трудно, то напишите какие нибудь простейшие примеры реализации. Заранее благодарю!

Нужен пример с массивами - C++
Не могу догнать, зачем нужен массив конкретно.

Нужен пример классов - C++
Привести пример классов с наследованием и доступом к компонентам их экземпляров через указатели на базовый и производный классы.

Нужен пример цикла while - C++
Помогите решить задачку или хотябы обьясните как делать а то сижу и думаю как это так реализовать

Нужен пример класса - C++
Привести пример класса для работы с комплексными числами и содержащего перегруженную операцию для вычитания комплексных чисел.

Нужен пример написания DLL - C++
Смотрел информацию из msdn, делал все по пунктам, но как то не идет. Можете мне для примера кинуть исходный код простенькой библиотеки на...

Нужен пример закрытого хеширования - C++
Для курсовой работы нужно написать программу. Тема курсовой - Закрытое хеширование. Что писать незнаю( Может подскажите?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
15.10.2010, 20:36     Нужен пример интерфейса #2
Вообще вопрос странный, а что конкретно интересует??
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
15.10.2010, 22:26     Нужен пример интерфейса #3
C++
1
2
3
4
5
6
#define struct interface
 
interface IHell1{
  virtual int getA() = 0;
  virtual int getB() = 0;
}
оно?
Jasper
0 / 0 / 0
Регистрация: 07.12.2009
Сообщений: 58
16.10.2010, 11:34  [ТС]     Нужен пример интерфейса #4
А рабочий вариант кода можно
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.10.2010, 13:01     Нужен пример интерфейса #5
Jasper, Вы для начала обяъсните, что подразумеваете под словом "интерфейс".
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
16.10.2010, 13:20     Нужен пример интерфейса #6
Jasper, имеется в виду GUI-приложение?
Jasper
0 / 0 / 0
Регистрация: 07.12.2009
Сообщений: 58
16.10.2010, 13:39  [ТС]     Нужен пример интерфейса #7
Я имею ввиду что пользователь будет вводить данные не в командной строке а в не котором приложении что-то вроде этого http://www.****************/view_6693calc.png
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
16.10.2010, 14:10     Нужен пример интерфейса #8
Тут в двух словах не объяснишь, смотрим сюда
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2010, 14:22     Нужен пример интерфейса
Еще ссылки по теме:

Нужен пример оператора switch - C++
Приведите пожалуйста простенький пример оператора switch с пояснением. просто чтоб понять как он работает) (в книге непонятный пример)

C++ строки нужен хотябы пример - C++
С клавиатуры вводится текстовая строка. Написать программу которая подщитывает слова котрые имеют одинаковое количество гласных и согласных...

Нужен пример использование паттернов - C++
Мне нужно пример использование паттернов в программах написанных на JAVA или C++ языках!

Нужен пример вычисления матрицы - C++
Пожалуйста скиньте кто-нибудь программу, которая считает матрицы! Оригинал: будьласка скиньте хтонебудь програму яка рахує матриці! ...

Нужен пример игры в CodeBlocks - C++
Добрый вечер! Мне нужно сделать небольшую программу игру на с++ в codeblocks, есть ли у вас какие либо наброски кодов, советы, инструкции?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
16.10.2010, 14:22     Нужен пример интерфейса #9
Классная ссылка. Ну вот тебе пару примеров.
Простое GUI-приложение на Qt:
C++
1
2
3
4
5
6
7
8
9
#include <QtGui>
 
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QWidget wgt;
    wgt.show();
    return app.exec();
}
Приложение WinAPI с меню и вызываемым немодальным диалоговым окном:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
/*
 * Написать программу, в которой используетс диалог для работы со структурами
 * данных, определяющими списки. Ввод элементов данных осуществляется с помощью
 * окна редактирования EDIT_BOX. Состояние списка выводится в окно списка LIST_BOX.
 * элемент списка удаляется, если по нему дважды щелкнуть курсором мыши.
 * 10. очередь, int, немодальный
 */
#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include "res.h"
#include "mqueue.h"
 
my::queue mq;
 
#define SIZE 80
WCHAR szStr[SIZE + 1];
bool verbose;
 
// Оконная процедура
LRESULT CALLBACK WindowProc(
    HWND, // Дескриптор окна
    UINT, // Сообщение
    WPARAM, LPARAM); // Дополнительные данные
 
// Оконная процедура диалога
BOOL CALLBACK DialProc(HWND, UINT, WPARAM, LPARAM);
 
// Является ли строка целым числом
bool isnumber(const WCHAR* szStr, bool sign = false, bool null = true);
 
HINSTANCE hinst;
HWND hdlg = NULL;   // Дескриптор диалога
bool dlgStarted = false;
 
// Главная фукнция приложения
int WINAPI WinMain(
    HINSTANCE hthisinst,    // Текущий экземпляр приложения
    HINSTANCE hprevinst,    // Предыдущий экземпляр (всегда NULL)
    LPSTR lpszargs,         // Параметры командной строки
    int nwinmode)           // Способ показа окна
{
    hinst = hthisinst;
    verbose = true;
 
    HWND hwnd;  // Дескриптор окна
    HACCEL haccel; // Дескриптор акселераторов
    LPCWSTR szWindowClass = L"mwnd"; // Имя класса окна
    LPCWSTR szWindowTitle = L"ЧМВ лабораторная работа №3"; // Заголовок окна
    LPCWSTR szWindowMenu = L"MAINMENU"; // Имя меню
    LPCWSTR szWindowAccs = L"ACCS"; // Имя акселераторов
    LPCWSTR szWindowDial = L"DIAL"; // Имя диалога
    WNDCLASSEX wnd; // Класс (структура) окна
    MSG msg; // Структура сообщения
 
    wnd.cbSize = sizeof(WNDCLASSEX);    // Размер окна
    wnd.style = CS_HREDRAW | CS_VREDRAW;    // Стиль окна
    wnd.lpfnWndProc = WindowProc;   // Оконная процедура
    // Число зарезервированных доп. байтов после структуры окна
    wnd.cbClsExtra = 0; 
    // Число зарезервированных доп. байтов после экземпляра окна
    wnd.cbWndExtra = 0; 
    wnd.hInstance = hthisinst; // Дескриптор экземпляра окна
    wnd.hIcon = LoadIcon(hthisinst, IDI_APPLICATION); // Иконка приложения
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW); // Указатель мыши
    // Дескриптор кисти фона
    wnd.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
    wnd.lpszMenuName = szWindowMenu; // Имя ресурса меню
    wnd.lpszClassName = szWindowClass; // Имя класса окна
    wnd.hIconSm = LoadIcon(wnd.hInstance, IDI_APPLICATION); // Маленькая иконка
    
    if(!RegisterClassEx(&wnd)) // Попытка регистрации класса окна
    {
        MessageBox( // Вывод модального сообщения
            NULL, // Дескриптор окна-владельца
            L"Не удалось зарегестрировать окно", // Текст сообщения
            L"Ошибка", // Заголовок сообщения
            MB_OK | MB_ICONERROR); // Содержимое и поведение окна сообщения
 
        return EXIT_FAILURE;
    }
 
    hwnd = CreateWindow( // Функция создания окна
        szWindowClass,
        szWindowTitle,
        WS_OVERLAPPEDWINDOW, // Стиль окна
        CW_USEDEFAULT, CW_USEDEFAULT, // Начальная позиция
        400, 300, // Начальные размеры
        // Дескриптор родительского окна
        HWND_DESKTOP, // Рабочий стол (= NULL)
        NULL, // Дескриптор меню
        hthisinst,
        NULL);
 
    if(!hwnd) // Если не удалось создать окно
    {
        MessageBox(NULL, L"Не удалось создать окно",
            L"Ошибка", MB_OK | MB_ICONERROR);
 
        return EXIT_FAILURE;
    }
 
    // Загрузка акселераторов
    haccel = LoadAccelerators(hthisinst, szWindowAccs);
    if(!haccel)
    {
        MessageBox(NULL, L"Не удалось загрузить горячие клавиши",
            L"Ошибка", MB_OK | MB_ICONERROR);
 
        return EXIT_FAILURE;
    }
 
    // Показ и обновление окна
    ShowWindow(hwnd, nwinmode);
    UpdateWindow(hwnd);
 
    // Цикл сообщений
    while(GetMessage( // Получение сообщений
        &msg, // Структура сообщения
        NULL, // Дескриптор окна, от которого получаются сообщения
        // Минимальные и максимальные значения, которые могут быть получены
        0, 0)) 
    {
        // Трансляция горячих клавиш
        if((!IsDialogMessage(hdlg, &msg)) &&
            (!TranslateAccelerator(hwnd, haccel, &msg)))
        {
            // Трансляция виртуальных клавиш в символьные сообщения
            TranslateMessage(&msg);
            // Отправка сообщений оконной процедуре
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
// Оконная процедура
LRESULT CALLBACK WindowProc(
    HWND hwnd, UINT message,
    WPARAM wparam, LPARAM lparam)
{
    static LPCWSTR szDialogName = L"DIAL";
 
    switch(message)
    {
 
    case WM_CLOSE: // Закрытие окна
        // Запрашиваем подтверждение пользователя
        if((!verbose) || (MessageBox(hwnd, L"Вы уверены?", L"Завершение работы...",
            MB_YESNO | MB_ICONQUESTION) == IDYES)) 
            // ... и посылаем сообщение WM_DESTROY
            SendMessage(hwnd, WM_DESTROY, 0, 0);
        break;
 
    case WM_COMMAND: // Команда
        switch(LOWORD(wparam))
        {
 
        case IDM_HELP_ABOUT: // О программе
            MessageBox(hwnd, L"Человеко-машинное взаимодействие\n"
                L"Лабораторная работа №3\n"
                L"Диалоговые окна\n\nМаксимов С.Б.", 
                L"О программе", MB_OK | MB_ICONASTERISK);
            break;
 
        case IDM_FILE_EXIT: // Выход из программы
            SendMessage(hwnd, WM_CLOSE, 0, 0);
            break;
 
        case IDM_FILE_DIALOG: // Создание диалога
            if(dlgStarted)
            {
                if(verbose)
                    MessageBox(hwnd, L"Уже запущено одно диалоговое окно!",
                        L"Ошибка", MB_OK | MB_ICONERROR);
            }
            else
            {
                hdlg = CreateDialog(hinst, szDialogName, hwnd, (DLGPROC) DialProc);
                dlgStarted = true;
            }
            break;
 
        case IDM_OPTIONS_VERBOSE:
            verbose = !verbose;
            break;
        }
        break;
 
    case WM_DESTROY: // Уничтожение окна
        // Отправка сообщения WM_QUIT с кодом выхода 0
        PostQuitMessage(EXIT_SUCCESS); 
        break;
 
    default: // Обработка в оконной процедуре по умолчанию
        return DefWindowProc(hwnd, message, wparam, lparam);
    }
 
    return 0;
}
 
// Является ли строка - числом
bool isnumber(const WCHAR* szStr, bool sign, bool null)
{
    if(*szStr == L'-')
    {
        if(sign)
            return false;
        else
            return isnumber(++szStr, true, null);
    }
    if(*szStr == L'0')
    {
        if(null)
            return false;
        else
            return isnumber(++szStr, true, false);
    }
    while(*szStr)
        if(iswdigit(*szStr++))
            return isnumber(szStr, true, false);
        else
            return false;
 
    return true;
}
 
// Оконная процедура диалога
BOOL CALLBACK DialProc(
    HWND hwnd, UINT message,
    WPARAM wparam, LPARAM lparam)
{
    switch(message)
    {
    case WM_INITDIALOG: // При загрузке диалогового окна
        // Печать всех имеющихся в очереди значений
        mq.print(szStr, SIZE, hwnd, IDD_LB1);
        return TRUE;
 
    case WM_COMMAND: // Обработка команд
        switch(LOWORD(wparam))
        {
 
        case IDD_LB1: // Сообщение от от ListBox
            if(HIWORD(wparam) == LBN_DBLCLK) // Двойной клик
            {
                // Удаление записи
                UINT i = SendDlgItemMessage(hdlg, IDD_LB1,
                    LB_GETCURSEL, 0, 0L);
                int val = mq.erase(i);
                if(verbose)
                {
                    _snwprintf(szStr, SIZE,
                        L"Удален %u-ый элемент - %d", i, val);
                    MessageBox(hdlg, szStr, L"Выбор сделан", MB_OK);
                }
                SendDlgItemMessage(hdlg, IDD_LB1,
                    LB_DELETESTRING, i, 0L);
            }
            break;
 
        case IDD_REMOVE: // Удаление элемента
            if(!mq.empty())
            {
                int val = mq.dequeue();
                if(verbose)
                {
                    _snwprintf(szStr, SIZE, 
                        L"Удален элемент из головы очереди - %d", val);
                    MessageBox(hdlg, szStr, L"Удаление", MB_OK);
                }
                SendDlgItemMessage(hdlg, IDD_LB1,
                    LB_DELETESTRING, 0, 0L);
            }
            else if(verbose)
                MessageBox(hdlg, L"Очередь пуста", L"Ошибка",
                    MB_OK | MB_ICONERROR);
            break;
 
        case IDD_CLEAR: // Очистка ListBox
            while(!mq.empty())
            {
                mq.dequeue();
                SendDlgItemMessage(hdlg, IDD_LB1,
                    LB_DELETESTRING, 0, 0L);
            }
            wcscpy(szStr, L"\0");
            SetDlgItemText(hdlg, IDD_EB1, szStr);
            break;
 
        case IDD_INPUT: // Ввод записи
            GetDlgItemText(hdlg, IDD_EB1, szStr, SIZE);
 
            if((*szStr) && (isnumber(szStr)))
            {
                int num = _wtoi(szStr);
                if(verbose)
                {
                    _snwprintf(szStr, SIZE, 
                        L"Введен новый элемент - %d", num);
                    MessageBox(hdlg, szStr, L"Ввод", MB_OK);
                }
                SendDlgItemMessage(hdlg, IDD_LB1, 
                    LB_ADDSTRING, 0, (LPARAM) szStr);
                mq.enqueue(num);
            }
            else if(verbose)
            {
                WCHAR msg[SIZE + 1];
                _snwprintf(msg, SIZE, 
                    L"\'%s\' не является целым числом", szStr);
                MessageBox(hdlg, msg, L"Ошибка", 
                    MB_OK | MB_ICONERROR);
            }
            wcscpy(szStr, L"\0");
            SetDlgItemText(hdlg, IDD_EB1, szStr);
            break;
 
        case IDD_CLOSE: // Закрытие диалогового окна
            DestroyWindow(hdlg);
            dlgStarted = false;
            hdlg = NULL;
            break;
        }
        return TRUE;
        break;
    }
    return FALSE;
}

res.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef RES_H
#define RES_H
 
#include <windows.h>
 
#define IDM_FILE_DIALOG     100
#define IDM_FILE_EXIT       101
#define IDM_OPTIONS_VERBOSE 150
#define IDM_HELP_ABOUT      200
 
#define IDD_LB1     300
#define IDD_EB1     301
#define IDD_INPUT   350
#define IDD_CLEAR   351
#define IDD_CLOSE   352
#define IDD_REMOVE  353
 
#endif // RES_H

res.rc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "res.h"
 
MAINMENU MENU
{
    POPUP "&Файл"
    {
        MENUITEM "&Диалог" IDM_FILE_DIALOG
        MENUITEM SEPARATOR
        MENUITEM "&Выход" IDM_FILE_EXIT
    }
    POPUP "&Опции"
    {
        MENUITEM "&Выводить сообщения" IDM_OPTIONS_VERBOSE
    }
    POPUP "&Помощь"
    {
        MENUITEM "&О программе" IDM_HELP_ABOUT
    }
}
 
ACCS ACCELERATORS
{
    VK_F1, IDM_HELP_ABOUT, VIRTKEY
    VK_F4, IDM_FILE_EXIT, VIRTKEY, ALT
    VK_F5, IDM_FILE_DIALOG, VIRTKEY
}
 
DIAL DIALOG 25, 25, 190, 100
CAPTION "Ввод и вывод"
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
{
    PUSHBUTTON "Завершение диалога", IDD_CLOSE, 10, 80, 80, 12,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP
 
    PUSHBUTTON "Удалить", IDD_REMOVE, 10, 45, 80, 12,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER
 
    PUSHBUTTON "Очистка", IDD_CLEAR, 10, 60, 80, 12,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER
 
    DEFPUSHBUTTON "Ввод", IDD_INPUT, 10, 30, 80, 12,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER
 
    EDITTEXT IDD_EB1, 10, 10, 80, 12,
        WS_CHILD | WS_VISIBLE | 
        WS_TABSTOP | WS_BORDER
 
    LISTBOX IDD_LB1, 100, 10, 80, 82,
        WS_CHILD | WS_VISIBLE | WS_VSCROLL |
        WS_TABSTOP | WS_BORDER | LBS_NOTIFY
}

mqueue.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef LIST_H
#define LIST_H
 
#include <cstdlib>
#include <windows.h>
 
namespace my
{
    class queue
    {
 
    public:
 
        queue();
        queue(const queue& rhs);
        ~queue();
 
        void enqueue(int item);
        int dequeue();
        int erase(size_t index);
 
        void print(LPWSTR szStr, UINT size, HWND hwnd, UINT id);
        bool empty();
 
    private:
 
        struct node
        {
            int     data;
            node*   next;
            node(int item)
                : data(item), next(NULL)
            {
            }
        };
        
        node*   head;
        node*   tail;
    };
}
#endif // LIST_H

mqueue.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "mqueue.h"
 
#include <cstdio>
 
namespace my
{
    queue::queue()
        : head(NULL), tail(NULL)
    {
    }
 
    queue::queue(const queue& rhs)
        : head(NULL), tail(NULL)
    {
        node* currnode = rhs.head;
        while(currnode)
        {
            enqueue(currnode->data);
            currnode = currnode->next;
        }
    }
 
    void queue::enqueue(int item)
    {
        node* newnode = new node(item);
        if(!tail)
            head = newnode;
        else
            tail->next = newnode;
        tail = newnode;
    }
 
    queue::~queue()
    {
        while(head)
        {
            node* delnode = head;
            head = head->next;
            delete delnode;
        }
        tail = NULL;
    }
 
    int queue::dequeue()
    {
        node* delnode = head;
        head = head->next;
        if(!head)
            tail = NULL;
        int retval = delnode->data;
        delete delnode;
        delnode = NULL;
        return retval;
    }
 
    int queue::erase(size_t index)
    {
        int retval;
        if(!index)
            retval = dequeue();
        else
        {
            node* delnode = head->next;
            node* prevnode = head;
            while(--index)
            {
                prevnode = delnode;
                delnode = delnode->next;
            }
            retval = delnode->data;
            prevnode->next = delnode->next;
            delete delnode;
            delnode = NULL;
 
        }
 
        return retval;
    }
 
    void queue::print(LPWSTR szStr, UINT size, HWND hwnd, UINT id)
    {
        node* currnode = head;
        while(currnode)
        {
            _snwprintf(szStr, size, L"%d", currnode->data);
            SendDlgItemMessage(hwnd, id, 
                LB_ADDSTRING, 0, (LPARAM) szStr);
            currnode = currnode->next;
        }
    }
 
    bool queue::empty()
    {
        return head == NULL;
    }
}
Yandex
Объявления
16.10.2010, 14:22     Нужен пример интерфейса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru