Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > C/C++, Visual C++, Visual C++.NET

C/C++, Visual C++, Visual C++.NET Fragen und Antworten zu C/C++, Visual C++ und Visual C++.NET

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50849, Antworten: 1390
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26615, Antworten: 4194
Gehe zum ersten neuen Beitrag Windows Oberfläche (Schrift,...
Aufrufe: 176, Antworten: 10
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 63, Antworten: 5
Gehe zum ersten neuen Beitrag TabCtrl
Aufrufe: 121, Antworten: 12
Gehe zum ersten neuen Beitrag Rechner fährt herunter,...
Aufrufe: 93, Antworten: 4
Gehe zum ersten neuen Beitrag Dateien lassen sich nicht...
Aufrufe: 17, Antworten: 2
Gehe zum ersten neuen Beitrag Suche Programm um Werbung zu...
Aufrufe: 49, Antworten: 2
Gehe zum ersten neuen Beitrag McAfee AVERT Stinger...
Aufrufe: 13, Antworten: 0
Gehe zum ersten neuen Beitrag Sticky Password 6.0.2...
Aufrufe: 25, Antworten: 0
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09.03.2006, 16:55   #1 (Direktlink)
Ist öfter hier
 
Benutzerbild von Don_Pazo
 
Registriert seit: 01.09.2005
Beiträge: 83
Standard CListCtrl mit Imag´s drucken

Hallo,
ich habe eine MFC Anwendung. In meinem Programm habe ich ein dialogbasierte Fenster mit CListCtrl, wie man auf dem Bild zu sehen ist.
http://www.fh-augsburg.de/~nenov/drucken.jpg
Ich möchte dasganze ausdrucken. Problematisch für mich sind die Imag´s.

Weißt jemand wie man Image´s in CListCtrl ausdruckt ???

Meine bisherige CODE:
Code:
	
       for(int i=0; i < nAnzahl; i++){
        nLaufendeNr++;

        // Ausruckbare Artikel auf 20 begrenzen
        if(i >= 20)
        {
           MessageBox("Es werden nur die ersten 20 Artikel ausgedruckt!", "Info!", MB_ICONEXCLAMATION);
           break;
        }
        // Einträge aus Listenelement lesen
        m_strProdukt = m_cList.GetItemText(i, 0);
        m_strHersteller = m_cList.GetItemText(i, 1);
        m_strPreis = m_cList.GetItemText(i, 2);
        m_strVerfuegbar = m_cList.GetItemText(i, 3);

        // und ausgeben
        dcPrint.TextOut(80, -550-nLaufendeNr*80, m_strProdukt);
  
        /* HIER SOLLEN DIE ICON´S EINGEFÜHGT WERDEN*/
      }
      // Seite auswerfen
      dcPrint.EndPage();

      // Dokument schließen
      dcPrint.EndDoc();

      // Druckergerätekontext löschen
      dcPrint.DeleteDC();

      MessageBox("Daten wurden erfolgreich gedruckt", "Info", MB_ICONEXCLAMATION);
    }
MSDN Library , http://www.codeproject.com/ und soweiter habe ich mir schon angeschaut.
__________________
www.nenov.de
Don_Pazo ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 10.03.2006, 11:44   #2 (Direktlink)
Ist öfter hier
 
Benutzerbild von Don_Pazo
 
Registriert seit: 01.09.2005
Beiträge: 83
Standard

Das ist eine Antwort auf meine Frage(oben) das ich in einem anderen Forum bekommen habe! Ich hatte seher viel Zeit gebraucht um diese Lösung zu kriegen. Deswegen poste ich den Antwort von "Dings" um wetere Mitglieder die Suche zu erleihtern.

Es wäre vielleicht auch möglich, Text statt der Icons auszugeben (eben jeweils ein Wort für jeden Status). Jedenfalls könntest Du eine etwas ausgefeiltere Druckroutine verwenden. Wo Du gerade CodeProject erwähnst ... wie wäre es damit:

http://www.codeproject.com/listctrl/listprintdemo.asp

- listdemoviewprint.cpp und listdemoviewprint.h Deinem Projekt hinzufügen
- In listdemoviewprint.h über der Klassendefinition noch 'class CListView;' einfügen.
- listdemoviewprint.h in Deine Dialog-Sourcedatei einbinden
- Entferne die Variable m_pListView, die entsprechenden ASSERTs und die Methode SetListView aus der Klasse CListDemoViewPrint.
Optional kannst Du die Klasse natürlich auch umbenennen.

Dann fügst Du noch "#include "listdemoviewprint.h"" und eine Druckfunktion ein. Beispiel (nur etwas angepasst):

Code:
BOOL DeinDialog::PrintList()
{
  CPrintDialog dlg(FALSE);
  CPrintInfo pInfo;
  CListDemoViewPrint m_print;

  if (AfxGetApp()->DoPrintDialog(&dlg))
  {
    HDC hdcPrinter = dlg.GetPrinterDC();
    if (hdcPrinter == NULL) {
      // 
      // Ist auch NULL, wenn der Vorgang abgebrochen wird
      
    } else {
      CDC dcPrinter;
      dcPrinter.Attach(hdcPrinter);
      dcPrinter.m_bPrinting = TRUE;
      CString Str; 

      m_print.SetDocTitle(_T("Titel"));
      // m_print.SetAppName(_T("AppName"));
      
      DOCINFO docinfo;
      memset(&docinfo, 0, sizeof(docinfo));
      docinfo.cbSize = sizeof(docinfo);
      docinfo.lpszDocName = _T("");

      if (dcPrinter.StartDoc(&docinfo) < 0) {
        AfxMessageBox(_T("Fehler beim Drucken aufgetreten."));
      }
      else
      { 
        m_print.SetListCtrl(&m_List);
        m_print.OnPreparePrinting(&pInfo);
        m_print.OnBeginPrinting(&dcPrinter, &pInfo);
        for (unsigned int i=1; i<=p Info.GetMaxPage(); i++)
        {
          dcPrinter.StartPage();
          pInfo.m_nCurPage = i;
          m_print.OnPrint(&dcPrinter, &pInfo);
          dcPrinter.EndPage();
        }

        m_print.OnEndPrinting(&dcPrinter, &pInfo);

        dcPrinter.EndDoc(); 
      }
    }
  }
  return TRUE;
}
Natürlich solltest Du zumindest noch die Fehlermeldungen anpassen bzw. Ressourcen-Strings verwenden.
Wenn Du die Anzahl der Zeilen begrenzen willst, kannst Du das in PrintList bzw. CListDemoViewPrint::PrintBody tun.

Deine Spalten, in denen auf dem Bildschirm Icons gezeigt werden, sind trotzdem noch leer ...
Das liegt eben daran, dass a) sich kein Text darin befindet und b) Du (genau wie in CListDemoViewPrint:rawRow) ja Text ausgibst und keine Icons - wie Du ja selbst schon geschrieben hast.

Bei Dir:
Code:
m_strProdukt = m_cList.GetItemText(i, 0);
m_strHersteller = m_cList.GetItemText(i, 1);
m_strPreis = m_cList.GetItemText(i, 2);
m_strVerfuegbar = m_cList.GetItemText(i, 3);
// und ausgeben
dcPrint.TextOut(80, -550-nLaufendeNr*80, m_strProdukt);  // Hmm ...
und in CListDemoViewPrint:rawRow
Code:
for (int nCol = 0; nCol < m_nPageCols; nCol++)
{
  CRect rect = GetCellRect(nRow,nCol);
  CString strText = m_pListCtrl->GetItemText(nRow, m_nColumns[nCol]);
  DrawText(pDC->m_hDC, strText, -1, rect, DT_LEFT | DT_VCENTER);
}
Wenn Du nun Wörter statt der Icons ausgeben willst, musst Du nur den Subitems jeweils Text zuweisen. Dieser wird ja nicht auf dem Bildschirm ausgegeben (in der Custom-Draw Methode), kann aber trotzdem beim Drucken abgerufen werden.

Also z.B. statt
Zitat
Code:
m_List.SetItem(idx, 3, LVIF_IMAGE, NULL, 2, 0, 0, 0);
Code:
m_List.SetItem(idx, 3, LVIF_IMAGE | LVIF_TEXT, DeinStatusString, 2, 0, 0, 0);
Ok, Du willst Icons ... Vorschlag: Da es mit Icons beim Drucken Probleme geben kann (skalieren ...) - teilweise auch abhängig von der Windows-Version - zeichnest Du direkt farbige, gefüllte Kreise. Die können auch noch gleich einen dunklen Umriss haben, was gerade bei der gelben Farbe auf dem Papier sinnvoll wäre.

Aber zuerst müssen die Header zentriert sein. Ersetze in CListDemoViewPrint::PrintBody
Code:
for (int i = 0; i < m_nPageCols; i++) {
  DrawText(pDC->m_hDC, GetColumnHeading(i), -1, GetColumnRect(i), DT_LEFT | DT_VCENTER);
durch
Code:
for (int i = 0; i < m_nPageCols; i++) {
  CRect colRect = GetColumnRect(i);
  if(i > 0) {  // Anpassen!
    // Column-Header-Text zentrieren
    CSize txtSize = pDC->GetTextExtent(GetColumnHeading(i));     
    colRect.left = colRect.left + colRect.Width() / 2 - txtSize.cx / 2;
  }
  DrawText(pDC->m_hDC, GetColumnHeading(i), -1, colRect, DT_LEFT | DT_VCENTER);
}
Neue CListDemoViewPrint-Membervariablen:
Code:
CBrush m_brushGreen, m_brushYellow, m_brushRed;
In den Konstruktor von CListDemoViewPrint (Farben anpassen):
Code:
m_brushGreen.CreateSolidBrush(RGB(0, 255, 0));
m_brushYellow.CreateSolidBrush(RGB(255, 255, 0));
m_brushRed.CreateSolidBrush(RGB(255, 0, 0));
In den Dekonstruktor:
Code:
m_brushGreen.DeleteObject();
m_brushYellow.DeleteObject();
m_brushRed.DeleteObject();
CListDemoViewPrint:rawRow: Bei Items mit zugeordnetem Icon wird zentriert ein entsprechender Kreis gezeichnet.
In der ImageList müssen die Icons 0=grün, 1=gelb und 2=rot sein, damit es so passt.
Man könnte natürlich auch die Indizes der Spalten, in denen die "Icons" gezeichnet werden sollen, dem Konstruktor übergeben und in einer Membervariable speichern (in einem Array z.B.). Oder auch die Zuordnung "Image Index <-> Farbe". Ähnliches gilt für CListDemoViewPrint::PrintBody; dort wird einfach jeder Header-String > 0 zentriert. Das kannst Du ja selbst ändern, wie Du möchtest; hier geht es nur ums Prinzip. BTW: Du kannst auch noch Linien zeichnen, wenn Du willst.
Code:
void CListDemoViewPrint::DrawRow(CDC* pDC, int nRow)
{
   ASSERT(m_pListCtrl);
   for (int nCol = 0; nCol < m_nPageCols; nCol++)
   {
      CRect rect = GetCellRect(nRow, nCol);
      CString strText = m_pListCtrl->GetItemText(nRow, m_nColumns[nCol]);
      DrawText(pDC->m_hDC, strText, -1, rect, DT_LEFT | DT_VCENTER);
      
      CImageList* pImgList = m_pListCtrl->GetImageList(LVSIL_SMALL);
      
      if(pImgList != NULL) {

        LVITEM item;
        ZeroMemory(&item, sizeof(LVITEM));
        item.iItem = nRow;
        item.iSubItem = m_nColumns[nCol];
        item.mask = LVIF_IMAGE;

        m_pListCtrl->GetItem(&item);

        CBrush *oldBrush;

        switch(item.iImage)  {
          case 0: oldBrush = pDC->SelectObject(&m_brushGreen); break;
          case 1: oldBrush = pDC->SelectObject(&m_brushYellow); break;
          case 2: oldBrush = pDC->SelectObject(&m_brushRed); break;
          default: continue;
        }
        const int spFrac = 6;

        int tbSpace = rect.Height()/spFrac;
        int radius = rect.Height()/2 - tbSpace;
        int topLeftX = rect.left + rect.Width()/2 - radius;
        int topLeftY = rect.top + tbSpace;
        int bottomRightX = topLeftX + 2*radius;
        int bottomRightY = rect.bottom - tbSpace;
        pDC->Ellipse(topLeftX, topLeftY, bottomRightX, bottomRightY);

        pDC->SelectObject(oldBrush);
      }
   }
}
__________________
www.nenov.de
Don_Pazo ist offline   Mit Zitat antworten
Antwort

  Paules-PC-Forum.de > Programmierung > C/C++, Visual C++, Visual C++.NET

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an




Alle Zeitangaben in WEZ +2. Es ist jetzt 05:55 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2