Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94

Рисуем окошки под Dos

28.02.2010, 10:25. Показов 883. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Значится собираю проект в Open Watcom под Dos 16. Глаза уже замылились, никак ошибку не могу узреть. Собственно подозреваю что ошибка связана с моим буфером, т.е. это либо в функции upLoadInBuffer(), где в буфер сохраняется экран под окном, либо в unLoadInBuffer(), где из буфера выгружаются данные на экран (типа окно закрыли). Поэтому, если лень проглядывать весь код, то прокомментируйте пожалуйста только эти два метода класса на наличие ошибок. Вот код:

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
#include <stdlib.h>
#include <conio.h>
#include "win.h"
 
int main( void )
{
    system( "cls" );
    win_lib w1( 1, 1, 78, 23, "First");
    win_lib w2( 10, 10, 40, 20, "Second", 0x3F, 0x5E );
    
    w1.upLoadInBuffer();
    getch();
    w1.writeWin();
    getch();
    w2.upLoadInBuffer();
    getch();
    w2.writeWin();
    getch();
    w2.unLoadFromBuf();//ошибка вылезает где то здесь
    getch();
    w1.unLoadFromBuf();
    getch();
    
    return 0;
}
win.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
class win_lib
{
public:
    win_lib( int startX, int startY, int endX, int endY, char *name,
    char colorFrame = 0x1F, char colorInner = 0x1F );
    
    ~win_lib( void );
    
    void writeWin( void );
        
    void upLoadInBuffer( void );
    void unLoadFromBuf( void );
 
private:
    void writeChar( int x, int y,
    char symbol, char symbolColor );
    void writeFrame( void );
 
    char *videoAdress;
    char *winBuffer;
    char *itsName;
    
    char itsFrameColor;
    char itsInnerColor;
    
    int itsStartX;
    int itsStartY;
    int itsEndX;
    int itsEndY;    
};
win.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
#include "win.h"
 
win_lib::win_lib( int startX, int startY, int endX, int endY, char *name,
char colorFrame, char colorInner )
{
    videoAdress = ( char * ) 0xB8000000L;
    winBuffer   = ( char * ) new char[ ( ( endX - startX + 1 ) * ( endY - startY + 1 ) ) * 2 ];
       
    itsStartX   = startX;
    itsEndX     = endX;
    itsStartY   = startY;
    itsEndY     = endY;
    
    itsFrameColor = colorFrame;
    itsInnerColor = colorInner;
 
    itsName = name;   
}
 
void win_lib::upLoadInBuffer( void )
{
    char *v = videoAdress;
    int k = 0;
        
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v += ( 160 * y ) + ( 2 * x );
            winBuffer[ k++ ] = *( v++ );
            winBuffer[ k++ ] = *v;
        }
    }
}
 
void win_lib::writeWin( void )
{
    writeFrame();
    
    for( int i = itsStartY + 1; i <= itsEndY - 1; i++ )
    {
        for( int j = itsStartX+1; j <= itsEndX-1; j++ )
        {
            writeChar( j, i, 0, itsInnerColor );
        }
    }
}
 
void win_lib::writeFrame( void )
{
    writeChar( itsStartX, itsStartY, 201, itsFrameColor );
    for( int i = itsStartX + 1; i <= itsEndX - 1; i++ )
        writeChar( i, itsStartY, 205, itsFrameColor );
 
    writeChar( itsEndX, itsStartY, 187, itsFrameColor );
    for( int i = itsStartY + 1; i <= itsEndY - 1; i++ )
        writeChar( itsEndX, i, 186, itsFrameColor );
 
    writeChar( itsEndX, itsEndY, 188, itsFrameColor );
    for( int i = itsEndX - 1; i >= itsStartX + 1; i-- )
        writeChar( i, itsEndY, 205, itsFrameColor );
 
    writeChar( itsStartX, itsEndY, 200, itsFrameColor );
    for( int i = itsEndY - 1; i >= itsStartY + 1; i-- )
        writeChar( itsStartX, i, 186, itsFrameColor );
 
    for( int i = 0; ( ( itsStartX + i + 1 ) < itsEndX )
    && ( *( itsName + i ) ); i++ )
        writeChar( ( itsStartX + i + 1 ), itsStartY,
        *( itsName + i ), itsFrameColor );
}
 
void win_lib::writeChar( int x, int y, char symbol, char symbolColor )
{
        char *v = ( char * ) 0xB8000000L;
 
        v += ( 160 * y ) + ( 2 * x );
        *( v++ ) = symbol;
        *v = symbolColor;
}
 
void win_lib::unLoadFromBuf( void )
{
    char *v = videoAdress;
    int k = 0;
 
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v += ( 160 * y ) + ( 2 * x );
            *( v++ ) = winBuffer[ k++ ];
            *v = winBuffer[ k++ ];
        }
    }
}
 
win_lib::~win_lib( void )
{
    delete winBuffer;
    winBuffer = 0;
}
Если соберётесь компилировать этот код то воспользуйтесь либо Borland C++ 3.1, либо Turbo C++, либо Open Watcom (компиляция под DOS 16). В современных компиляторах этот код пройдёт, но запустить вы его не сможете, ибо тут идёт прямая адресацая к видеопамяти текстового режима консоли.

Всем заранее спасибо за любую помощь.

Добавлено через 7 часов 50 минут
ну так че, ниукого идей нет?

Добавлено через 10 часов 3 минуты
решил проблему, действительно весь трабл заключался в буфере, подправил там. Так же добавил метод письма в окошке, теперь до текстового редактора рукой подать, можно за один вечер склепать...что то типа edit из DOS)))
Кому интересно, выкладываю код...может пригодится, но повторюсь, это только для DOS режима, т.е. надо компилировать под дос, а так код и под винды запустится.

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
#include <stdlib.h>
#include <conio.h>
#include "win.h"
 
int main( void )
{
    system( "cls" );
    win_lib *w1 = new win_lib( 1, 1, 78, 23, "First");
    win_lib *w2 = new win_lib( 10, 10, 40, 20, "Second", 0x3F, 0x5E );
    
    w1->upLoadInBuffer();
    getch();
    w1->writeWin();
    getch();
    //w2->upLoadInBuffer();
    //getch();
    //w2->writeWin();
    //getch();
    //w2->unLoadFromBuf();
    //getch();
    w1->writeInWin();
    w1->unLoadFromBuf();
    getch();
 
    delete w1;
    delete w2;
    
    return 0;
}
win.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
class win_lib
{
public:
    win_lib( int startX, int startY, int endX, int endY, char *name,
    char colorFrame = 0x1F, char colorInner = 0x1F );
 
    ~win_lib( void );
    
    void writeWin( void );
    int writeInWin( void );
        
    void upLoadInBuffer( void );
    void unLoadFromBuf( void );
 
private:
    void writeChar( int x, int y, char symbol, char symbolColor );
    void writeFrame( void );
 
    char *videoAdress;
    char *winBuffer;
    char *itsName;
    
    char itsFrameColor;
    char itsInnerColor;
    
    int itsStartX;
    int itsStartY;
    int itsEndX;
    int itsEndY;
};
win.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
#include <conio.h>
#include "win.h"
 
win_lib::win_lib( int startX, int startY, int endX, int endY, char *name,
char colorFrame, char colorInner )
{
  videoAdress = ( char * ) 0xB8000000L;
    winBuffer   = new char[ ( ( endX - startX + 1 ) * ( endY - startY + 1 ) ) * 2 ];
    
    itsStartX   = startX;
    itsEndX     = endX;
    itsStartY   = startY;
    itsEndY     = endY;
    
    itsFrameColor = colorFrame;
    itsInnerColor = colorInner;
 
    itsName = name;   
}
 
void win_lib::upLoadInBuffer( void )
{
    char *v = videoAdress;
    int k = 0;
        
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v = videoAdress + ( 160 * y ) + ( 2 * x );
            winBuffer[ k++ ] = *(v++);
            winBuffer[ k++ ] = *v;
        }
    }
}
 
void win_lib::writeWin( void )
{
    writeFrame();
    
    for( int i = itsStartY + 1; i <= itsEndY - 1; i++ )
    {
        for( int j = itsStartX+1; j <= itsEndX-1; j++ )
        {
            writeChar( j, i, 0, itsInnerColor );
        }
    }
}
 
void win_lib::writeFrame( void )
{
    writeChar( itsStartX, itsStartY, 201, itsFrameColor );
    for( int x = itsStartX + 1; x <= itsEndX - 1; x++ )
        writeChar( x, itsStartY, 205, itsFrameColor );
 
    writeChar( itsEndX, itsStartY, 187, itsFrameColor );
    for( int y = itsStartY + 1; y <= itsEndY - 1; y++ )
        writeChar( itsEndX, y, 186, itsFrameColor );
 
    writeChar( itsEndX, itsEndY, 188, itsFrameColor );
    for( int x = itsEndX - 1; x >= itsStartX + 1; x-- )
        writeChar( x, itsEndY, 205, itsFrameColor );
 
    writeChar( itsStartX, itsEndY, 200, itsFrameColor );
    for( int y = itsEndY - 1; y >= itsStartY + 1; y-- )
        writeChar( itsStartX, y, 186, itsFrameColor );
 
    for( int i = 0; ( ( itsStartX + i + 1 ) < itsEndX )
    && ( *( itsName + i ) ); i++ )
        writeChar( ( itsStartX + i + 1 ), itsStartY,
        *( itsName + i ), itsFrameColor );
}
 
void win_lib::writeChar( int x, int y, char symbol, char symbolColor )
{
    char *v = videoAdress;
 
    v += ( 160 * y ) + ( 2 * x );
    *( v++ ) = symbol;
    *v = symbolColor;
}
 
int win_lib::writeInWin( void )
{
    for( int y = itsStartY + 1; y <= itsEndY - 1; y++ )
    {
        for( int x = itsStartX + 1; x <= itsEndX - 1; x++ )
        {
            char ch;
            ch = getch();
            
            if( ch == 13)
                break;
            if( ch == 27 )
                return 0;
                
            writeChar( x, y, ch, itsInnerColor );
        }
    }
 
    return 0;
}
 
void win_lib::unLoadFromBuf( void )
{
    char *v = videoAdress;
    int k = 0;
 
    for( int y = itsStartY; y <= itsEndY; y++ )
    {
        for( int x = itsStartX; x <= itsEndX; x++ )
        {
            v = videoAdress + ( 160 * y ) + ( 2 * x );
            *( v++ ) = winBuffer[ k++ ];
            *v = winBuffer[ k++ ];
        }
    }
}
 
win_lib::~win_lib( void )
{
    delete winBuffer;
    winBuffer = 0;
}
Всем удачи!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2010, 10:25
Ответы с готовыми решениями:

Литература C++ под DOS
Конкретно интересует работа с мышью, клавиатурой, видеокартой, звуковой картой и все связаное с ними в дос'е. В общем литература о...

Графика под DOS
подскажите пожалуйста, как запускать программы с графикой под DOS(с использованием graph.h) на Microsoft Visual C++ 6.0? на quick C...

Turbo C++ v3.0 под DOS
Проект компилируется без ошибок. На этапе линковки появляются ошибки: Undefined symbol _Release_All in module ... Все пути библиотек...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2010, 10:25
Помогаю со студенческими работами здесь

DOS прога работает под WIN98
Добрый день! У меня проблема такая. DOS прога работает под WIN98. После ее работы и выхода в Windows экран полностью черный, видать...

У кого есть Turbo C++ под DOS
Всем Привет. У кого есть Turbo C++ под DOS скиньте если не сложно. Срочно нужен.. в поиске нет нормальных ссылок

Утечка памяти в С++ (Borland C++ 3.1 под DOS)
Добрый день! Прошу помощи! Есть старая программа, которую мне надо адаптировать под новое оборудование. Но при выполнении выдает странные...

Назад в прошлое, графика под DOS. [graphics.h]
Сделал двигающийся паравозик, сказали &quot;сделать звездное небо&quot;, проблема заключается в том, что не выводится белые пиксели &quot;на...

Как сделать меню в программе под DOS, написанную в С++3.0?
Уважаемые программеры! Подскажите, как сделать менюшку в программе под DOS, написанную в С++3.0! Я не знаю, с чего начать!Что вообще надо...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru