Ответить на сообщение
Вернуться к теме
Вы отвечаете на сообщение:
Автор: 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 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; }
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; };
#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; }
Ваше имя:
Пароль:
Цитировать Используйте тэги для выделения текста: Код: [code][/code] Жирный: [b][/b] Наклонный: [i][/i] URL: [url][/url]
Сообщение:
Прикрепить: