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

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

Восстановить пароль Регистрация
 
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
28.02.2010, 10:25     Рисуем окошки под Dos #1
Значится собираю проект в 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;
}
Всем удачи!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2010, 10:25     Рисуем окошки под Dos
Посмотрите здесь:

Графика под DOS C++
C++ У кого есть Turbo C++ под DOS
C++ Turbo C++ v3.0 под DOS
C++ Как сделать меню в программе под DOS, написанную в С++3.0?
C++ DOS прога работает под WIN98
Назад в прошлое, графика под DOS. [graphics.h] C++
Назад в прошлое, графика под DOS. [graphics.h] part 2 C++
C++ Утечка памяти в С++ (Borland C++ 3.1 под DOS)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru