Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Dialog von Dialog ableiten?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.08.2004, 10:49 Uhr
~dadings
Gast


Hallo Leute,
ich da hab da mal ein Problem.
Ich habe mehrer Dialoge erstellt. Also für jeden Dialog eine eigene Resource. Wenn ich mir das ganze so ansehe wird schnell klar, daß in den meisten Dialogen ich immer wieder das selbe mache ( Hintergrundfarbe setzen mit OnCtrlColor, Rechtsklick abfangen, Buttons aus der Datenbank lesen und hinmalen ....) Jetzt würde ich das ganze gern generalisieren.

Also ein CUniColorDlg erstellen abgeleitet von CDialog. In dem möchte ich gern alle STandarddinge erledigen. Von diesem CUniColorDlg würde ich dann gern die entsprechenden Dialoge ableiten. Also ungefähr so:

C++:
class CUniColorDlg : public CDialog
{
    DECLARE_DYNAMIC(CUniColorDlg)

public:
    CUniColorDlg(CWnd* pParent, COLORREF bkColor, bool adminMode);   // Standardkonstruktor


class CUserListDlg : public CUniColorDlg
    
{
    DECLARE_DYNAMIC(CUserListDlg)

public:
    CUserListDlg(CWnd* pParent ,CTools *pTools, CGlobalVarHolder* holder,CWnd* parent);   // Standardkonstruktor



IMPLEMENT_DYNAMIC(CUserListDlg, CDialog)
CUserListDlg::CUserListDlg(CWnd* pParent ,
                           CTools *pTools,
                           CGlobalVarHolder *holder,
                           CWnd* parent)
    : CUniColorDlg(NULL,RGB(192,192,192),false)
{
    m_pTools=pTools;
    m_pGlobalVarHolder = holder;
    m_ColorButtonList.RemoveAll();
    m_ButtonDBStruct.RemoveAll();
    m_UserSide=0;
    m_MaxButtons=0;
    m_pParentDlg=parent;
    m_PropertyList.Clear();
    m_ClickButton = NULL;
    m_AdminMode = false;
    m_ConsumerDlgList.RemoveAll();
}






wenn ich das so mache scheint das auch zu klappen aber es wird nie eine Funktion aufgerufen von CUniColorDlg. Wie leite ich das korrekt ab? und was muss ich tun damit die Basisfunktionen von CUniColorDlg aufgerufen werden und nicht von CDialog?
Mag mir da wer helfen?
(obs verständlich war bezweifle ich)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.08.2004, 11:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


gib mal die komplette definition von CUniColorDialog an, wahrscheinlich haste da was vergessen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.08.2004, 11:53 Uhr
~da dings
Gast


Unicolor siht in der definition so aus

C++:
class CUniColorDlg : public CDialog
{
    DECLARE_DYNAMIC(CUniColorDlg)

public:
    CUniColorDlg(CWnd* pParent, COLORREF bkColor, bool adminMode);   // Standardkonstruktor
    virtual ~CUniColorDlg();

// Dialogfelddaten
    enum { IDD = IDD_UNICOLORDLG };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung

    DECLARE_MESSAGE_MAP()
private:
    CBrush        m_Brush;
    CPoint        m_pointOnClick_;
    COLORREF    m_BkColor;
    bool        m_AdminMode;

public:
    virtual BOOL OnInitDialog();
    void ChangeBkColor(COLORREF color);
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};




OnCtlColor und OnLButtonDown wird aber nie aufgerufen wenn ich die Ableitung wie oben beschrieben mache.
Die cpp von UnicolorDlg siehts so aus

C++:
IMPLEMENT_DYNAMIC(CUniColorDlg, CDialog)
CUniColorDlg::CUniColorDlg(CWnd* pParent, COLORREF bkColor, bool adminMode)
    : CDialog(CUniColorDlg::IDD, pParent)
{
    m_BkColor = bkColor;
    m_AdminMode = adminMode;
}

CUniColorDlg::~CUniColorDlg()
{
}

void CUniColorDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CUniColorDlg, CDialog)
    ON_WM_CTLCOLOR()
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()


// CUniColorDlg-Meldungshandler

BOOL CUniColorDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    m_Brush.CreateSolidBrush(m_BkColor);
    if (m_AdminMode)
        this->ModifyStyle(WS_POPUP |WS_CAPTION,WS_CHILD | WS_SIZEBOX);
    else
        this->ModifyStyle(WS_POPUP |WS_CAPTION,WS_CHILD);

    return TRUE;  // return TRUE unless you set the focus to a control
    // AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
}

void CUniColorDlg::ChangeBkColor(COLORREF color)
{
    m_BkColor = RGB(255,0,0);
    m_Brush.Detach();
    m_Brush.CreateSolidBrush(m_BkColor);
    this->Invalidate();
}


HBRUSH CUniColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  Ändern Sie hier alle Attribute für den DC.

    // TODO:  Gib einen anderen Pinsel zurück, wenn der Standard nicht erwünscht ist.
    return m_Brush;
}

void CUniColorDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    CDialog::OnLButtonDown(nFlags, point);
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.08.2004, 11:54 Uhr
Tommix



Hallo,
an Stellen wie

C++:
IMPLEMENT_DYNAMIC(CUserListDlg, CDialog)


musst Du CDialog durch CUniColorDlg ersetzen.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.08.2004, 13:18 Uhr
~daDings
Gast


Scheint zu klappen.
Besten Dank für deine Hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: