Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2010, 23:15   #1
G-Cat
 
Регистрация: 27.02.2010
Сообщений: 4
По умолчанию Рисую окошки под Dos

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

main.cpp
Код:
#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
Код:
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
Код:
#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). В современных компиляторах этот код пройдёт, но запустить вы его не сможете, ибо тут идёт прямая адресацая к видеопамяти текстового режима консоли.

Всем заранее спасибо за любую помощь.
G-Cat вне форума Ответить с цитированием
Старый 28.02.2010, 10:33   #2
G-Cat
 
Регистрация: 27.02.2010
Сообщений: 4
По умолчанию

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

main.cpp
Код:
#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
Код:
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
Код:
#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;
}
Всем удачи!
G-Cat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из Dos под Win Nozema Фриланс 3 30.10.2009 17:34
Графика в Borland C под DOS Goldmane Помощь студентам 0 09.04.2009 22:58
C++ под DOS. Функции Xeon332 Общие вопросы C/C++ 34 29.11.2008 18:01
borland C++под DOS Xeon332 Помощь студентам 9 20.09.2008 20:50