Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рисую окошки под Dos
 
 автор: G-Cat   (27.02.2010 в 23:13)   письмо автору
 
 

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

main.cpp
#include <stdlib.h>
#include <conio.h>
#include "win.h"
 
int mainvoid )
{
    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
class win_lib
{
public:
    win_libint startX, int startY, int endX, int endY, char *name,
    char colorFrame = 0x1F, char colorInner = 0x1F );
    
    ~win_libvoid );
    
    void writeWinvoid );
        
    void upLoadInBuffervoid );
    void unLoadFromBufvoid );
 
private:
    void writeCharint x, int y,
    char symbol, char symbolColor );
    void writeFramevoid );
 
    char *videoAdress;
    char *winBuffer;
    char *itsName;
    
    char itsFrameColor;
    char itsInnerColor;
    
    int itsStartX;
    int itsStartY;
    int itsEndX;
    int itsEndY;    
};


win.cpp
#include "win.h"
 
win_lib::win_libint 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::upLoadInBuffervoid )
{
    char *v = videoAdress;
    int k = 0;
        
    forint y = itsStartY; y <= itsEndY; y++ )
    {
        forint x = itsStartX; x <= itsEndX; x++ )
        {
            v += ( 160 * y ) + ( 2 * x );
            winBuffer[ k++ ] = *( v++ );
            winBuffer[ k++ ] = *v;
        }
    }
}
 
void win_lib::writeWinvoid )
{
    writeFrame();
    
    forint i = itsStartY + 1; i <= itsEndY - 1; i++ )
    {
        forint j = itsStartX+1; j <= itsEndX-1; j++ )
        {
            writeChar( j, i, 0, itsInnerColor );
        }
    }
}
 
void win_lib::writeFramevoid )
{
    writeChar( itsStartX, itsStartY, 201, itsFrameColor );
    forint i = itsStartX + 1; i <= itsEndX - 1; i++ )
        writeChar( i, itsStartY, 205, itsFrameColor );
 
    writeChar( itsEndX, itsStartY, 187, itsFrameColor );
    forint i = itsStartY + 1; i <= itsEndY - 1; i++ )
        writeChar( itsEndX, i, 186, itsFrameColor );
 
    writeChar( itsEndX, itsEndY, 188, itsFrameColor );
    forint i = itsEndX - 1; i >= itsStartX + 1; i-- )
        writeChar( i, itsEndY, 205, itsFrameColor );
 
    writeChar( itsStartX, itsEndY, 200, itsFrameColor );
    forint i = itsEndY - 1; i >= itsStartY + 1; i-- )
        writeChar( itsStartX, i, 186, itsFrameColor );
 
    forint i = 0; ( ( itsStartX + i + 1 ) < itsEndX )
    && ( *( itsName + i ) ); i++ )
        writeChar( ( itsStartX + i + 1 ), itsStartY,
        *( itsName + i ), itsFrameColor );
}
 
void win_lib::writeCharint x, int y, char symbol, char symbolColor )
{
        char *v = ( char * ) 0xB8000000L;
 
        v += ( 160 * y ) + ( 2 * x );
        *( v++ ) = symbol;
        *v = symbolColor;
}
 
void win_lib::unLoadFromBufvoid )
{
    char *v = videoAdress;
    int k = 0;
 
    forint y = itsStartY; y <= itsEndY; y++ )
    {
        forint x = itsStartX; x <= itsEndX; x++ )
        {
            v += ( 160 * y ) + ( 2 * x );
            *( v++ ) = winBuffer[ k++ ];
            *v = winBuffer[ k++ ];
        }
    }
}
 
win_lib::~win_libvoid )
{
    delete winBuffer;
    winBuffer = 0;
}


Если соберётесь компилировать этот код то воспользуйтесь либо Borland C++ 3.1, либо Turbo C++, либо Open Watcom (компиляция под DOS 16). В современных компиляторах этот код пройдёт, но запустить вы его не сможете, ибо тут идёт прямая адресацая к видеопамяти текстового режима консоли.

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

  Ответить  
 
 автор: g-cat   (28.02.2010 в 10:33)   письмо автору
 
   для: G-Cat   (27.02.2010 в 23:13)
 

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

main.cpp
#include <stdlib.h>
#include <conio.h>
#include "win.h"

int mainvoid )
{
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
class win_lib
{
public:
win_libint startX, int startY, int endX, int endY, char *name,
char colorFrame = 0x1F, char colorInner = 0x1F );

~win_libvoid );
    
void writeWinvoid );
int writeInWinvoid );
        
void upLoadInBuffervoid );
void unLoadFromBufvoid );

private:
void writeCharint x, int y, char symbol, char symbolColor );
void writeFramevoid );

char *videoAdress;
char *winBuffer;
char *itsName;
    
char itsFrameColor;
char itsInnerColor;
    
int itsStartX;
int itsStartY;
int itsEndX;
int itsEndY;
};


win.cpp
#include <conio.h>
#include "win.h"

win_lib::win_libint 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::upLoadInBuffervoid )
{
char *v = videoAdress;
int k = 0;
        
forint y = itsStartY; y <= itsEndY; y++ )
{
forint x = itsStartX; x <= itsEndX; x++ )
{
v = videoAdress + ( 160 * y ) + ( 2 * x );
winBuffer[ k++ ] = *(v++);
winBuffer[ k++ ] = *v;
}
}
}

void win_lib::writeWinvoid )
{
writeFrame();
    
forint i = itsStartY + 1; i <= itsEndY - 1; i++ )
{
forint j = itsStartX+1; j <= itsEndX-1; j++ )
{
writeChar( j, i, 0, itsInnerColor );
  }
}
}

void win_lib::writeFramevoid )
{
writeChar( itsStartX, itsStartY, 201, itsFrameColor );
forint x = itsStartX + 1; x <= itsEndX - 1; x++ )
writeChar( x, itsStartY, 205, itsFrameColor );

writeChar( itsEndX, itsStartY, 187, itsFrameColor );
forint y = itsStartY + 1; y <= itsEndY - 1; y++ )
  writeChar( itsEndX, y, 186, itsFrameColor );

writeChar( itsEndX, itsEndY, 188, itsFrameColor );
forint x = itsEndX - 1; x >= itsStartX + 1; x-- )
  writeChar( x, itsEndY, 205, itsFrameColor );

writeChar( itsStartX, itsEndY, 200, itsFrameColor );
forint y = itsEndY - 1; y >= itsStartY + 1; y-- )
writeChar( itsStartX, y, 186, itsFrameColor );

forint i = 0; ( ( itsStartX + i + 1 ) < itsEndX )
&& ( *( itsName + i ) ); i++ )
writeChar( ( itsStartX + i + 1 ), itsStartY,
*( itsName + i ), itsFrameColor );
}

void win_lib::writeCharint x, int y, char symbol, char symbolColor )
{
char *v = videoAdress;

v += ( 160 * y ) + ( 2 * x );
  *( v++ ) = symbol;
*v = symbolColor;
}

int win_lib::writeInWinvoid )
{
forint y = itsStartY + 1; y <= itsEndY - 1; y++ )
{
forint 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::unLoadFromBufvoid )
{
char *v = videoAdress;
int k = 0;

forint y = itsStartY; y <= itsEndY; y++ )
{
forint x = itsStartX; x <= itsEndX; x++ )
{
v = videoAdress + ( 160 * y ) + ( 2 * x );
*( v++ ) = winBuffer[ k++ ];
*v = winBuffer[ k++ ];
}
}
}

win_lib::~win_libvoid )
{
delete winBuffer;
winBuffer = 0;
}


Всем удачи!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования