none
Uraltprogramm unter VC 6.0, View- und Druckansicht RRS feed

  • 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
    Freitag, 10. Februar 2012 15:57

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


    Donnerstag, 16. Februar 2012 17:53

Alle Antworten

  • Vermutlich hast Du ein Display, welches keine 96 dpi hat, sondern wo mehr eingestellt ist und Du hast dies vermutlich nicht korrekt programmiert...


    Jochen Kalmbach (MVP VC++)
    Freitag, 10. Februar 2012 16:42
  • Schönen Dank für die schnelle Antwort. Werds gleich mal überprüfen.

    Gruß Reusel

    Freitag, 10. Februar 2012 17:03
  • Ich dachte, alles wäre erledigt mit:

        pDC->SetMapMode(MM_LOMETRIC);

    oder?

    Außerdem haben beide Bildschirme die gleich Schriftauflösung (96 dpi) und eine Bildschirmgröße von 1280 * 1024.



    • Bearbeitet Reusel Freitag, 10. Februar 2012 17:32
    Freitag, 10. Februar 2012 17:28
  •      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++)
    Freitag, 10. Februar 2012 17:36
  • Danke, das wars denn wohl. Kann ich aber heute nicht mehr verifizieren.

    Gruß Reusel

    Freitag, 10. Februar 2012 21:34
  • 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

    Sonntag, 12. Februar 2012 17:36
  • Dein zeig mal bitte ein paar Codezeilen.
    Und wie schon vermutet: Wenn Du in XP die DPI Größe verändern würdest hättest Du zu 100% die gleichen Probleme.
    D.h. es hat vermutlich noch nie funktioniert...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 13. Februar 2012 07:07
    Moderator
  • 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

    Montag, 13. Februar 2012 17:40
  • 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


    Donnerstag, 16. Februar 2012 17:53
  • 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

    Freitag, 17. Februar 2012 06:55
    Moderator
  • Hast recht. Mein Fehler das static im UP. Mir fehlt die Praxis und die Reflexion.

    Gruß Reusel

    Freitag, 17. Februar 2012 10:38