CPrintDialog mit Papier Orientierung



  • Abend,

    Ich habe eine Dialog Klasse programmiert CMyPrintDialog welche ich von CPrintDialog abgeleitet habe. In diesen Dialog kann man die Standard Einstellungen von CPrintDialog bearbeiten und zusätzlich soll auch die Papier Orientierung geändert werden können.
    Leider fuktioniert das mit der übernahme der Papier Orientierung nicht.
    Weiß jemand wie man das lösen kann?

    Die Folgende Methode soll die im Dialog eingestellte Papier Orientierung übernehmen.

    void CMyPrintDialog::UseData()
    {
      // Orientierung übernehmen
    
      CWinApp* pApp = AfxGetApp();
      pApp->GetPrinterDeviceDefaults(&this->m_pd);
    
      if(this->m_Orientation == Portrait) 
      {
        // Hochformat benutzen
        DEVMODE *pDevMode = (DEVMODE*)::GlobalLock(this->m_pd.hDevMode);
        pDevMode->dmFields|=DM_ORIENTATION;
        pDevMode->dmOrientation = DMORIENT_PORTRAIT;
        ::GlobalUnlock(this->m_pd.hDevMode);
      }
      else if(this->m_Orientation == Landscape) 
      {
        // Querformat benutzen
        DEVMODE *pDevMode = (DEVMODE*)::GlobalLock(this->m_pd.hDevMode);
        pDevMode->dmFields|=DM_ORIENTATION;
        pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
        ::GlobalUnlock(this->m_pd.hDevMode);
      }
    }
    

    PS benutze Visual C++ 6


  • Mod

    Das geht bei mir:

    // Set the orientation to the printer driver
    	if (m_iOrientation==DMORIENT_PORTRAIT || m_iOrientation==DMORIENT_LANDSCAPE) 
    	{
    		// load default printer settings
    		if (!GetDevMode())
    			VERIFY(AfxGetApp()->GetPrinterDeviceDefaults(&m_pd));
    
    		// Get devmode again and set the orientation
    	    LPDEVMODE pDevMode = GetDevMode();
    	    if (pDevMode) 
    		    // Change printer settings in here.
    	        pDevMode->dmOrientation = static_cast<short>(m_iOrientation);
    	}
    


  • Sorry bin erst jetzt wieder am Rechner,

    danke für die schnelle anrwort Martin Richter.
    Ich habe das ausprobiert, funktioniert leider nicht im Dialog.
    Ich denke das liegt daran das ich dieses im CMyPrintDialog aufrufe.
    In der OnPreparePrinting würde es funktionieren da habe ich aber den Wert noch nicht weil der Dialog erst nach der OnPreparePrinting Methode geöffnet wird.

    void CMyPrintDialog::OnOK() 
    {	
      this->UseData();
      CPrintDialog::OnOK();
    }
    

    Weiß jemand wie man den Wert trotzdem setzen kann?


  • Mod

    Ich vermute mal, dass Du Dir durch den CPrintDialog einen DC erzeugen lässt.
    Evtl. ist es zu spät wenn Du OnOk an dieser Stelle abfängst.

    Versuche mal die Orientation direkt zu ändern, wenn die ComboBox oder eben das Control geändert wird, dass Du speziell in Deinem angepassten Dialog eingebaut hast.

    Ich habe auch anderen Code bei dem bereits die Orientierung gesetzt wird bevor/beim Laden des Dialoges (also Wiederherstellung der alten Einstellung). Da geht es auch ohne Probleme.



  • Ging leider auch direkt nach der Änderung im Dialog nicht.

    Wenn folgenden Code in der OnPreparePrinting aufgerufen wird dann wird das Querformat übernommen aber in der OnBeginPrinting funktioniert der gleiche Code nicht.

    LPDEVMODE pDevMode = pd.GetDevMode();
      if(pDevMode)
        pDevMode->dmOrientation = static_cast<short>(DMORIENT_LANDSCAPE);
    

    irgendwie muss das vom MFC Standard Aufbau gespeert werden.
    Aber es sollte doch trotzdem eine Möglichkeit geben.



  • Da hatte ich doch was vergessen 😃

    CPrintDialog pd(false);
    

Anmelden zum Antworten