![]() |
Anzeige:
|
|
|||||||
| C/C++, Visual C++, Visual C++.NET Fragen und Antworten zu C/C++, Visual C++ und Visual C++.NET |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 01.09.2005
Beiträge: 83
|
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);
}
__________________
www.nenov.de |
|
|
|
|
|
|
#2 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 01.09.2005
Beiträge: 83
|
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;
}
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: 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 ... 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);
}
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); 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);
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);
}
Code:
CBrush m_brushGreen, m_brushYellow, m_brushRed; Code:
m_brushGreen.CreateSolidBrush(RGB(0, 255, 0)); m_brushYellow.CreateSolidBrush(RGB(255, 255, 0)); m_brushRed.CreateSolidBrush(RGB(255, 0, 0)); Code:
m_brushGreen.DeleteObject(); m_brushYellow.DeleteObject(); m_brushRed.DeleteObject(); 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 |
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|