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