Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
#1

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

28.02.2010, 10:25. Просмотров 460. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2010, 10:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рисуем окошки под Dos (C++):

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

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

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

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

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2010, 10:25
Привет! Вот еще темы с ответами:

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

Назад в прошлое, графика под DOS. [graphics.h] part 2 - C++
Есть солнышко., странное правда. По центру круг, вокруг круга N кружочков, так чтобы они были окружали весь главный круг. надо их...

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

Где скачать какой-нибудь компилятор С++ для программ под DOS - C++
Народ!!! Подскажите, пожалуйста, где скачать какой-нибудь компилятор С++ для программ под DOS. Очень надо написать програмульку для DOS. ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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