Benutzer mit den meisten Antworten
Uraltprogramm unter VC 6.0, View- und Druckansicht

Frage
-
Ich habe ein Uraltprogramm, geschrieben unter VC6.0 und Windows 2000, unter Vista wieder zum Laufen bringen wollen. Dabei werden Zahlenkolonnen als View und als Druck ausgegeben. Die einzelnen Zahlen werden mit TextOut in festen Abständen gesetzt. Dies klappt unter Windows 2000 und Windows XP auch, Ansicht auf dem Bildschirm und Ausdruck sind identisch. Unter Vista wird die Ansicht auf dem Bildschirm aber viel zu eng gesetzt, so dass die Zahlen sich überdecken (nicht die einzelnen Ziffern der Zahlen). Der Ausdruck ist ok.
Die Ausgabe erfolgt in einer Ableitung von CSrollView mit:
OnDraw(...) {...}
bzw.
OnPrint(...) {
....
OnDraw(pDC);
CSrollView::OnPrint(pDC, pInfo);
}Woran kann das dran liegen?
Gruß Reusel
- Bearbeitet Reusel Freitag, 10. Februar 2012 15:58
Antworten
-
Ich habe jetzt folgende Lösung (Krücke) gefunden:
if (pDC->IsPrinting())
pDC->SetMapMode(MM_LOMETRIC);
else
pDC->SetMapMode(MM_TEXT);Und die Hilfsfunktionen:
//------------------------------------------------------------
int CLottoDocDoc::getX(int X)
//------------------------------------------------------------
{
static int Xunit = p_DC->GetDeviceCaps(LOGPIXELSX);
if (p_DC->IsPrinting()) return X;
return int((X * Xunit)/254);
}//------------------------------------------------------------
int CLottoDocDoc::getY(int Y)
//------------------------------------------------------------
{
static int Yunit = p_DC->GetDeviceCaps(LOGPIXELSY);
if (p_DC->IsPrinting()) return Y;
return -int((Y * Yunit)/254);
}
Das möglicherweise anders (und eleganter) nicht geht, kann natürlich auch mit einer Inkompatibilität von VC6.0 und Vista oder mit meiner Unfähigkeit zusammenhängen.
Aber trotzdem, für die Mitarbeit schönen Dank
Reusel
- Bearbeitet Reusel Donnerstag, 16. Februar 2012 17:55
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 29. Februar 2012 11:19
Alle Antworten
-
pDC->SetMapMode(MM_LOMETRIC);
Da fällt mir nur noch das hier ein:
http://blog.m-ri.de/index.php/2010/04/20/achtung-die-festen-mapping-modes-des-gdi-basieren-nicht-auf-logpixelsx-und-logpixelsy/Aber da ist Martin Experte ;)
Jochen Kalmbach (MVP VC++) -
Hallo Leute,
jetzt bin ich völlig durcheinander. Ich muss dazu sagen, dass ich vor 12-15 jahren professionell in VC6.0 entwickelt. Jetzt in Rente mach ich das nur noch hobbymäßig.
Zur Sache: Ob ich den MapMode in MM_ANISOMETRIC und mir den Umrechnungsfaktor aus GetDeviceCaps bilde oder in MM_LOMETRIC umsetze, das Verhalten ist nahezu völlig gleich. D.h. unter Windows 2000 und XP alles ok., unter Vista wie oben geschildert. Mit MM_TEXT ging erstmal garnichts.
Gruß Reusel
-
-
Hallo Martin,
mit den von mir nach Deinem Vorschlag (so wie ich ihn verstanden hab) geändertem Programm ist bei anderen dpi unter 2000 und XP Anzeige und Ausdruck ok. Bei Vista immer noch der gleiche Fehler. Auf die Anordnung der gleiche Zahlen in einer Listbox hat das alles überhaupt keinen Einfluß, d.h. es ist ok.
Es gibt noch Verschiebungen im Dialog-Fenster. Das liegt sicher daran, dass ich den größten Teil mit dem Resóurce-Editor gemacht habe und einige Rechtecke mit dem Programm setze (s.u.). Da hat sich MS auch nicht mit Ruhm bekleckert, da die Einheiten im Rescource-File und im Programm unterschiedlich sind (oder ist das irgenwo definiert?).
Hier jetzt ein Programmauszug:
//----------------------------------------------------------------------------
void CLottoDoc::drawLotto(CDC * pDC)
//----------------------------------------------------------------------------
{
p_DC = pDC;
pDC->SetMapMode(MM_ANISOTROPIC); ///
CFont Font1;
Font1.CreatePointFont(140, "ArialBlack", pDC);
CFont Font2;
Font2.CreatePointFont(120, "Arial", pDC);CFont * pOldFont = pDC->SelectObject(&Font1);
.
.
.CString Titel;
UINT TextAlign = p_DC->SetTextAlign(TA_CENTER | TA_BASELINE);
int xRef = getX(660); ///
int yRef = -getY(200); ///
int x = xRef;
int y = yRef;
.
.
.pDC->TextOut(x-getX(100), y, LPCTSTR(Titel));
pDC->SelectObject(&Font2);
int Count = p_Lottoschein->GetCount();
y -= getY(100);
for (int i = 0; i < Count; i++)
{
p_DC->SetTextAlign(TA_RIGHT | TA_BASELINE);
x = xRef-getX(200);
CString String;
String.Format("%2i. Spiel:", i+1);
pDC->TextOut(x, y, LPCTSTR(String));
UINT * pZahlen = (UINT*)p_Lottoschein->GetItemDataPtr(i);
x = druck6Zahlen(x+getX(60), y, pZahlen);
y -= getY(50);
}
p_DC->SetTextAlign(TextAlign);
p_DC->SetTextAlign(TextAlign);
break;
.
.
.
}
}
pDC->SelectObject(pOldFont);
}//----------------------------------------------------------------------------
int CLottoDoc::druck6Zahlen(int x, int y, UINT * Zahlen, UINT ZusatzZahl, BOOL * Richtige)
//----------------------------------------------------------------------------
{
COLORREF OldColor = p_DC->GetTextColor();
for (int i = 0; i < 6; i++)
{
.
.
.
Zahl.Format(" %2i", Zahlen[i]);
p_DC->TextOut(x, y, LPCTSTR(Zahl));
x += getX(60);
}
p_DC->SetTextColor(OldColor);
return x;
}//-----------------------------------------------------------------------------
int CLottoDoc::getX(int X)
//-----------------------------------------------------------------------------
{
static int Xunit = p_DC->GetDeviceCaps(LOGPIXELSX);
return int((X * Xunit)/100);
}//-----------------------------------------------------------------------------
int CLottoDoc::getY(int Y)
//-----------------------------------------------------------------------------
{
static int Yunit = p_DC->GetDeviceCaps(LOGPIXELSY);
return int((Y * Yunit)/100);
}
//----------------------------------------------------------------------------
BOOL CLottoDlg::OnInitDialog()
//----------------------------------------------------------------------------
{
CDialog::OnInitDialog();.
.
.p_DC = GetDC();
p_DC->SetMapMode(MM_ANISOTROPIC); ///
int Zahl = 0;
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
Zahl++;
CString Zahltext;
Zahltext.Format("%i", Zahl);
int links = getX(334 + 35*j); // wie oben formuliert
int top = getY(31 + 35*i);
CRect Taste(links, top, links+getX(25), top+getY(25));
.
.
.
}
}
.
.
.
return TRUE; // return TRUE unless you set the focus to a control
}Wie man unschwer erkennen kann, ist es ein kleines Programm zur Auswertung von Lottozahlen; wie gesagt: Hobby
-
Ich habe jetzt folgende Lösung (Krücke) gefunden:
if (pDC->IsPrinting())
pDC->SetMapMode(MM_LOMETRIC);
else
pDC->SetMapMode(MM_TEXT);Und die Hilfsfunktionen:
//------------------------------------------------------------
int CLottoDocDoc::getX(int X)
//------------------------------------------------------------
{
static int Xunit = p_DC->GetDeviceCaps(LOGPIXELSX);
if (p_DC->IsPrinting()) return X;
return int((X * Xunit)/254);
}//------------------------------------------------------------
int CLottoDocDoc::getY(int Y)
//------------------------------------------------------------
{
static int Yunit = p_DC->GetDeviceCaps(LOGPIXELSY);
if (p_DC->IsPrinting()) return Y;
return -int((Y * Yunit)/254);
}
Das möglicherweise anders (und eleganter) nicht geht, kann natürlich auch mit einer Inkompatibilität von VC6.0 und Vista oder mit meiner Unfähigkeit zusammenhängen.
Aber trotzdem, für die Mitarbeit schönen Dank
Reusel
- Bearbeitet Reusel Donnerstag, 16. Februar 2012 17:55
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 29. Februar 2012 11:19
-
Und wo bitte setzt Du die Mapping Koordintanen von MM_ANSIOTROPIC?
Du initialisierst den DC doch gar nicht für den Mappingmode!Was für Umrechnungen hast Du denn für Windows und Vieport gesetzt oder beabsichtigt?
Dann hättest Du auch bei MM_TEXT bleiben können...
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de