Dialog - In Standarddialog weiteres Control einfügen



  • Hallo,

    ich kämpfe gerade mit meinem eigenen CPrintDialog. Den Dialog möchte ich erweitern, eigenen Button, Checkbox usw.
    Dazu habe ich nur Teile in der FAQ gefunden.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39052.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-135202-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    Damit ich diese Dialogresourcen nutzen kann, muss ich meinen PrintDlg von CDialog ableiten. Dann ist aber meine ganze CPrintDialog Funktionalität weg. Wenn ich ihn aber von CPrintDialog ableite, dann kann ich die geänderte Dialogresource nicht nutzen.

    Das hat mir etwas weitergeholfen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-45755.html

    Leider krieg ich es nicht hin, dass MEIN Dialog angezeigt wird. Ich schaff es nicht, die Dialogressource, meine IDD zuzuweisen. 😕

    Momentan sieht meine Lösung so aus:
    Neue Klasse CSpecialPrintDialog mit Wizard eingefügt, von CDialog abgeleitet und dann den Konstruktor überschrieben...

    CSpecialPrintDialog::CSpecialPrintDialog(BOOL bPrintSetupOnly, DWORD dwFlags, CWnd* pParentWnd)
    	: CPrintDialog(bPrintSetupOnly,dwFlags,pParentWnd)
    {
    	m_pd.Flags |= PD_ENABLEPRINTTEMPLATE;
    	m_pd.lpPrintTemplateName=MAKEINTRESOURCE(IDD_PRINT_SPECIAL); 
    }
    


  • CPrintDialog hat einen zweiten Konstruktor: CPrintDialog(PRINTDLG& pdInit)

    Dieser ist protected, der Konstruktor der abgeleiteten Klasse muss also public werden und sähe dann folgendermassen aus:

    CSpecialPrintDialog::CSpecialPrintDialog(PRINTDLG& pdInit):CPrintDialog(pdInit)
    {
      // ...
    }
    

    Der Nachteil der Geschichte ist lediglich, dass pdInit vor Erzeugung von CSpecialPrintDialog gefüllt werden muss.



  • Jetzt hab ichs. Man muss der PRINTDLG Struktur noch den Instancehandle übergeben 🙂

    CSpecialPrintDialog::CSpecialPrintDialog(BOOL bPrintSetupOnly, DWORD dwFlags, CWnd* pParentWnd)
        : CPrintDialog(bPrintSetupOnly,dwFlags,pParentWnd)
    {
        m_pd.hInstance = AfxGetInstanceHandle();
        m_pd.Flags |= PD_ENABLEPRINTTEMPLATE;
        m_pd.lpPrintTemplateName=MAKEINTRESOURCE(IDD_PRINT_SPECIAL); 
    }
    

    Dazu hab ich aber noch ein Problem.
    In meiner Testapplikation(exe) gehts. Da wo ich es brauche (dll) gehts nicht. Es wird einfach die OnInitDialog nicht aufgerufen. Keine Ahnung warum??
    In der Hilfe steht was dazu, ich checks aber nicht...

    This function allows you to retrieve the instance handle of the current
    application. AfxGetInstanceHandle always returns the HINSTANCE of your
    executable file (.EXE) unless it is called from within a DLL linked with the
    USRDLL version of MFC. In this case, it returns an HINSTANCE to the DLL.
    


  • Mann, mann, eine Zeile Code in 6 Stunden, aber jetzt gehts 🙂 👍 👍 🙂

    [cpp]
    CSpecialPrintDialog::CSpecialPrintDialog(BOOL bPrintSetupOnly, DWORD dwFlags, CWnd* pParentWnd)
    : CPrintDialog(bPrintSetupOnly,dwFlags,pParentWnd)
    {
    //m_pd.hInstance = AfxGetInstanceHandle();
    m_pd.hInstance = AfxGetResourceHandle();
    m_pd.Flags |= PD_ENABLEPRINTTEMPLATE;
    m_pd.lpPrintTemplateName=MAKEINTRESOURCE(IDD_PRINT_SPECIAL);
    }
    [/cpp]


Anmelden zum Antworten