TextBox



  • Hallo alle miteinander,

    hätte da mal drei Fragen bezüglich TextBoxen in C++
    und zwar:
    1: Wie kann ich in einer TextBox die aktuelle Uhrzeit anzeigen lassen hier der erste Versuch

    if(connect==false){
    
                time_t t=time(0);
                ctime(&t);
    
                     Ereignisse->Text=t+" Keine Verbindung zum Interface vorhanden!\r\n"+Ereignisse->Text;
    
                }
    

    geht aber net, da er nur die Sekunden Anzeigt die seit dem 1.1.1970 vergangen sind

    2. Kann ich direkt den Inhalt einer TextBox ausdrucken? Habe mal nach "print dialog c++" gesucht aber nix dazu gefunden 👎

    3. Und zum Schluss wie kann man den Inhalt der TextBox in eine *.txt - Datei abspeicher?

    (Arbeite mit Visual Studio 2005)

    Danke schonmal für die Hilfe^^



  • 1. Uhrzeit: http://www.c-plusplus.net/forum/viewtopic-var-t-is-209105.html (z.B. über SetWindowText der Textbox zuweisen)

    2. Ich habe mal eine Funktion geschrieben, die ein beliebiges Fenster ausdruckt. Das sollte auch mit einer Textbox klappen. Einfach den HDC übergeben. Du musst die Funktion wohl noch ein wenig anpassen (z.B. defines, die du nicht hast).

    //--------------------------------------------------------------------------------------------------------------------------
    FCT PrintWindowEx(HWND hWnd,BOOL bCenterWnd) {
    //--------------------------------------------------------------------------------------------------------------------------
      int       iWidth,iHeight,iWidthPrn,iHeightPrn;
      BOOL      bBitBltRes=FALSE;
      RECT      rcWnd;
      POINT     pn;
      HWND      hWndForegroundTmp;
      HCURSOR   hOldCursor;
      PRINTDLG  lpPrintDlg;
    
      if(!IsWindow(hWnd)) { 
        return ERR_NOWINDOW;
      }
      if(hWnd==INVALID_HANDLE_VALUE) {
        return ERR_INVALIDHANDLE;
      }
    
      GetWindowRect(hWnd,&rcWnd); //Maße des zu druckenden Fensters holen
      OffsetRect(&rcWnd,-rcWnd.left,-rcWnd.top);
    
      iWidth  = rcWnd.right - rcWnd.left;
      iHeight = rcWnd.bottom - rcWnd.top;
    
      memset(&lpPrintDlg,0,sizeof(PRINTDLG)); //soll die nicht behandelte Ausnahme in KERNEL32.DLL verhindern (tut es aber nicht!)
      lpPrintDlg.lStructSize  = (DWORD)sizeof(lpPrintDlg);
      lpPrintDlg.hwndOwner    = NULL;
      lpPrintDlg.hDevMode     = NULL;//&lpDevmode;
      lpPrintDlg.hDevNames    = NULL;
      lpPrintDlg.hDC          = NULL;
      lpPrintDlg.Flags        = PD_HIDEPRINTTOFILE|PD_NONETWORKBUTTON|PD_NOPAGENUMS|PD_NOSELECTION|PD_RETURNDC|PD_USEDEVMODECOPIESANDCOLLATE;
      PrintDlg(&lpPrintDlg);      //erzeugt manchmal (!) eine nicht behandelte Ausnahme in KERNEL32.DLL (nicht reproduzierbar)
    
      if(lpPrintDlg.hDC==NULL) {  //Drucker-DC ungültig;
        return ERR_INVALIDPRINTER;
      }
      if( !(GetDeviceCaps(lpPrintDlg.hDC,RASTERCAPS) & RC_STRETCHBLT) ) { //StretchBlt wird vom Drucker nicht unterstützt
        return ERR_NOSTRETCHBLT;
      }
      DOCINFO di = { sizeof(DOCINFO) };
      di.lpszDocName = "modusAOI - Druckauftrag";
    
      iWidthPrn  = GetDeviceCaps(lpPrintDlg.hDC,HORZRES);
      iHeightPrn = GetDeviceCaps(lpPrintDlg.hDC,VERTRES);
    
      pn = GetZoomedWidthHeight(iWidthPrn,iHeightPrn,iWidth,iHeight);
    
      hOldCursor=SetCursor(NULL);
      hWndForegroundTmp=GetForegroundWindow();
      SetForegroundWindow(hWnd);    //ist das letztendlich nötig? oder kann ich mich darauf verlassen, dass das Zielfenster immer oben ist?
      UpdateWindow(hWnd);
      HDC     hdc     = ::GetWindowDC(hWnd);
      HDC     memDC   = ::CreateCompatibleDC(hdc);
      HBITMAP hbm     = ::CreateCompatibleBitmap(hdc,pn.x,pn.y);
      HBITMAP hbmOld  = (HBITMAP)::SelectObject(memDC, hbm);
    
      if( !StretchBlt(memDC,0,0,pn.x,pn.y,hdc,rcWnd.left,rcWnd.top,iWidth,iHeight,SRCCOPY) ) {  
        //StretchBlt ist fehlgeschlagen, warum auch immer...
        ::SelectObject(memDC, hbmOld);
        ::DeleteDC(memDC);
        ::ReleaseDC(hWnd,hdc);
        ::DeleteObject(hbm);
        SetForegroundWindow(hWndForegroundTmp);
        return ERR_BLTREADFAILED;
      }
      SetForegroundWindow(hWndForegroundTmp);
      SetCursor(hOldCursor);
    
      BITMAPINFO bmi;
      ZeroMemory(&bmi,sizeof(bmi));
    
      bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
      bmi.bmiHeader.biWidth        = pn.x;
      bmi.bmiHeader.biHeight       = pn.y;
      bmi.bmiHeader.biBitCount     = 24;
      bmi.bmiHeader.biPlanes       = 1;
      bmi.bmiHeader.biCompression  = BI_RGB;
      bmi.bmiHeader.biSizeImage    = 32 * iWidth * iHeight / 8;
    
      BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage];
    
      ::GetDIBits(memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS);
    
      BITMAPFILEHEADER bfh;
      bfh.bfType      = ('M' << 8) + 'B';
      bfh.bfSize      = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER); 
      bfh.bfReserved1 = 0;
      bfh.bfReserved2 = 0;
      bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
      SetDIBits(memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS);
    
      if(StartDoc(lpPrintDlg.hDC,&di) > 0) { 
        if(StartPage(lpPrintDlg.hDC) > 0) { 
    
          if(bCenterWnd) {
            bBitBltRes=BitBlt(lpPrintDlg.hDC,   //Bild wird zentriert auf dem Drucker ausgegeben
                              (iWidthPrn-pn.x)/2,                   //Startposition X (Target)
                              /*0*/(iHeightPrn-pn.y)/2,             //Startposition Y (Target)
                              (pn.x)+((iWidthPrn-pn.x)/2),          //Breite (Target)
                              /*pn.y*/(pn.y)+((iHeightPrn-pn.y)/2), //Höhe (Target)
                              memDC,
                              0,                                //Startposition X (Source)
                              0,                                //Startposition Y (Source)
                              SRCCOPY);
          }else {  
            bBitBltRes=BitBlt(lpPrintDlg.hDC,   //Bild wird nicht zentriert
                              (iWidthPrn-pn.x)/2,                   //Startposition X (Target)
                              0,                                    //Startposition Y (Target)
                              (pn.x)+((iWidthPrn-pn.x)/2),          //Breite (Target)
                              pn.y,                                 //Höhe (Target)
                              memDC,
                              0,                                //Startposition X (Source)
                              0,                                //Startposition Y (Source)
                              SRCCOPY);
          }
          if(!bBitBltRes) {   //BitBlt ist fehlgeschlagen
            ::SelectObject(memDC, hbmOld);
            ::DeleteDC(memDC);
            ::ReleaseDC(hWnd,hdc);
            ::DeleteObject(hbm);
            delete[] pbBits;
            return ERR_BLTWRITEFAILED;
          }
          if(EndPage(lpPrintDlg.hDC ) > 0) {
            EndDoc(lpPrintDlg.hDC); 
          }else {
            ::SelectObject(memDC, hbmOld);
            ::DeleteDC(memDC);
            ::ReleaseDC(hWnd,hdc);
            ::DeleteObject(hbm);
            delete[] pbBits;
            return ERR_ENDPAGEFAILED;
          }
        }else {
          ::SelectObject(memDC, hbmOld);
          ::DeleteDC(memDC);
          ::ReleaseDC(hWnd,hdc);
          ::DeleteObject(hbm);
          delete[] pbBits;
          return ERR_STARTPAGEFAILED;
        }
      }else {
        ::SelectObject(memDC, hbmOld);
        ::DeleteDC(memDC);
        ::ReleaseDC(hWnd,hdc);
        ::DeleteObject(hbm);
        delete[] pbBits;
        return ERR_STARTDOCFAILED;
      }//if(StartDoc...)
      //
      DeleteDC( lpPrintDlg.hDC );
      ::SelectObject(memDC, hbmOld);
      ::DeleteDC(memDC);
      ::ReleaseDC(hWnd,hdc);
      ::DeleteObject(hbm);
      delete[] pbBits;
      //
      return 0;
    }
    

    3. Such mal nach fstream.



  • Danke für die Antwort 😉

    Das mit der Uhhrzeit hat soweit geklappt.

    Aber mit dem drucken will es nicht so richtig...
    sieht auch für mich nicht so richtig verständlich aus^^

    Das Speichern klappt mehr oder weniger...er speichert zwar die text datei ab aber ohne inhalt, weil ich nicht weis wie ich die TextBox einbinden soll

    Stream^ myStream;
    				  SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
    				  saveFileDialog1->Filter = "txt files (*.txt)|*.*";
    				  saveFileDialog1->FilterIndex = 2;
    				  saveFileDialog1->RestoreDirectory = true;
    
    				  if ( saveFileDialog1->ShowDialog() == ::DialogResult::OK )
    				  {
    					 if ( (myStream = saveFileDialog1->OpenFile()) != nullptr )
    					 {
    
    						myStream->Close();
    					 }
    				  }
    

    danke schonmal für weitere anregungen^^



  • Hey, du schreibst ja managed code! Da bist du eigentlich im falschen Forum (C++/CLI wäre richtig). Damit kenne ich mich gar nicht aus. In C++ könntest du deine Textbox in etwa so speichern (ungetestet):

    fstream myStream;
    char s[512];
    
    myStream.open("C:\\myTextfile.txt",ios::out);
    m_myTextbox.GetWindowText(s);
    myStream << s;
    myStream.close();
    

Anmelden zum Antworten