// simple Text window #include #pragma hdrstop #include #include #ifdef WIN32 #define MaxLines 2000 #else #define MaxLines 1000 #endif EV_START(TextWindow) EV_MESSAGE(WM_CLOSE,WMClose) EV_MESSAGE(WM_CREATE,WMCreate) EV_END TextWindow::TextWindow(Object *Parent,char *title,BOOL Stay) : Window(Parent,title) { App::TextWindow=this; App::Active=TRUE; // hack Style=WS_OVERLAPPEDWINDOW; StayOpen=Stay; First=NULL; Last=NULL; Lines=0; MaxStr=0; Flags|=W_OVERSCROLL; } char *TextWindow::GetClassName() { return "TextWindow"; } TextWindow::~TextWindow() { App::TextWindow=NULL; DeleteObject(Font); // clean up mem ClearMem(); } void TextWindow::ClearMem() { TWString *temp=First,*temp2; while (temp) { delete[] temp->String; temp2=temp->Next; delete temp; temp=temp2; } } void TextWindow::Clear() { ClearMem(); First=NULL; Last=NULL; Lines=0; MaxStr=0; InvalidateRect(hWnd,NULL,TRUE); } BOOL TextWindow::WMCreate(TMSG&) { ShowWindow(hWnd, SW_HIDE ); TEXTMETRIC tm; HDC dc=GetDC(hWnd); LOGFONT lf; memset(&lf,0,sizeof(lf)); lf.lfHeight=-12; lf.lfWeight=FW_NORMAL; lf.lfCharSet=ANSI_CHARSET; lf.lfOutPrecision=OUT_TT_PRECIS; lf.lfClipPrecision=CLIP_DEFAULT_PRECIS; lf.lfQuality=PROOF_QUALITY; lf.lfPitchAndFamily=4; //FIXED_PITCH | 4 | FF_MODERN; strcpy(lf.lfFaceName,"Courier New"); Font=CreateFontIndirect(&lf); HFONT OldFont=(HFONT) SelectObject(dc,Font); GetTextMetrics(dc, &tm); SelectObject(dc,OldFont); ReleaseDC(hWnd, dc); FontHeight = tm.tmHeight + tm.tmExternalLeading; FontWidth = tm.tmAveCharWidth; return FALSE; } BOOL TextWindow::WMClose(TMSG&) { if (Parent) { ShowWindow(hWnd, SW_HIDE ); SetFocus(ParentHWnd); } else DestroyWindow(); return TRUE; } void TextWindow::AddString(char *S) { TWString *temp; if (Lines==MaxLines) { // delete last temp=Last->Prev; delete[] Last->String; delete Last; Last=temp; Last->Next=NULL; } else Lines++; temp=new TWString; temp->String=strdup(S); temp->Next=First; if (First) First->Prev=temp; else Last=temp; First=temp; temp->Prev=NULL; if ((int)strlen(S)>MaxStr) MaxStr=strlen(S); SetVirtualExtent(MaxStr*FontWidth,Lines*FontHeight,FontWidth,FontHeight,0,0); ShowWindow(hWnd, SW_SHOW ); RECT rc; GetClientRect(hWnd,&rc); if (Lines*FontHeightString,strlen(temp->String)); y+=FontHeight; temp=temp->Prev; } SelectObject(dc,OldFont); ::SetBkColor(dc,OldBk); } void TextWindowInit(Object *Parent,char *Title,BOOL Stay) { if (App::TextWindow==NULL) (new TextWindow(Parent,Title,Stay))->Create(); } int printf(const char *fmt,...) { char temp[256]; va_list ap; va_start(ap,fmt); vsprintf(temp,fmt,ap); va_end(ap); if (App::TextWindow==NULL) { FName F; GetModuleFileName(App::hInstance,F,MAX_PATH); TextWindowInit(0,F.GetName(),TRUE); } App::TextWindow->AddString(temp); // if message loop?? return 0; }