Printdialog mit bestimmten Drucker vorbelegen



  • Hallo und Guten Tag,

    da ich in diesem Forum bisher nur mitlese und mir schon häufiger dadurch helfen konnte hier mal eine ganz eigene Frage:

    Ich möchte einen abgeleiteten Printdialog mit einen bestimmten Drucker (bereits vorhanden) vorblenden, so das der User den Drucker zwar wechseln kann, aber im Grunde nur bestätigen muss.

    Ich gehe wie folgt vor:

    - Druckername ist als Member vorhanden.
    - Druckername wird in der Combobox gesetzt
    - Dann Device erzeugt und mit "AfxGetApp()->SelectPrinter" gesetzt.

    BOOL CABSPrintDialog::OnInitDialog()
    {
        m_pd.nCopies = m_nAnzahl;
    
        BOOL bRet =  CPrintDialog::OnInitDialog();
    
        int nSel = m_cbPrinter.SelectString(-1, m_strPrinterName);
        if(nSel == CB_ERR)
        {
            m_cbPrinter.AddString(m_strPrinterName);
            nSel = m_cbPrinter.SelectString(-1, m_strPrinterName);
        }
        // Wenn immer noch kein Drucker ausgewählt ist,
        // dann Versuche den 1. Drucker auszuwählen.
        if((nSel == CB_ERR) && (m_cbPrinter.GetCount()))
        {
            m_cbPrinter.SelectString(-1, CPrintDialog::GetDeviceName());
            m_cbPrinter.GetLBText(m_cbPrinter.GetCurSel(), m_strPrinterName);
        }
    
        LPTSTR strPrinter = m_strPrinterName.GetBuffer(1024);
    
        // set to non-default printer without changing default app printer
        HGLOBAL hDevMode = NULL;
        HGLOBAL hDevNames = NULL;
    
        if (GetPrinterDevice(strPrinter, &hDevNames, &hDevMode))
            AfxGetApp()->SelectPrinter(hDevNames, hDevMode);
        else
            AfxMessageBox(_T("Failed to select custom printer"));
    
        UpdateData(false);
        return bRet;
    }
    

    In der Combobox des Druckdialogs erscheint der von mir übergebene Drucker und unter dem Btn. "Einstellungen" sind auch die des richtigen Druckers zu sehen.

    Jedoch bei "Status", "Typ" und "Standord" im Druckdialog stehen der Standardrucker drin. Auf den auch bei "OK" gedruckt wird.

    Wenn ich in der Combobox meinen Drucker explicit nochmal auswähle dann werden alle Felder aktualisiert und es wird richtig gedruckt.

    Hat jemand noch einen Hinweis für mich ?
    Ich sitze schon einen ganzen Tag dran und mir gehen die Ideen aus.

    Danke


  • Mod



  • Vielen Dank für die Links.

    Ich habe das Beispiel von CodeProjekt umgesetzt und musste feststellen das der Ansatz in unserer Applikation leider nicht funktioniert.
    Grund hierfür ist das wir die application m_hDevMode und m_hDevNames überschreiben aber der Druck über Crystal Report passiert. Was scheinbar als eigene application läuft.

    Unsere letzte Idee ist in einem abgeleiteten Druckdialog das Auswählen eines bestimmten Druckers aus einer Combobox zu simulieren.

    Wenn wir dies manuell testen dann werden alle Daten ( im Eigenschaften-Dialog ) dieses Druckers geladen.
    (Im Gegenzug dazu geschiet dies nicht wenn wir nur den richtigen Drucker in der Combobox selektieren.)

    Bisher probiert habe ich:

    myCombobox.SetCurSel(nIndex); ->bringt nicht den gewünschten Erfolg

    PostMessage(CB_SETCURSEL,0,0); ->bringt nicht den gewünschten Erfolg

    Jemand noch eine Idee ?

    Ich kann mir irgendwie nicht vorstellen das Das so schwer sein soll.

    🙄


Anmelden zum Antworten