programm stürzt ab...



  • Hi,

    nun, wenn es funktioniert, hast du eben Glück.
    Und in diesem Fall funktioniert es, da SetIcon(HICON) eine Nachricht an
    CWnd sendet.

    MFC-Quelltext:

    _AFXWIN_INLINE HICON CButton::SetIcon(HICON hIcon)
    	{ ASSERT(::IsWindow(m_hWnd)); return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); }
    

    Trotzdem kann man sich darauf nicht verlassen ⚠

    Wenn keine Kontrolvariable angelegt wird oder das Fenster nach CButton gesubclasst
    (denglisch 😉 ) wird, ist das CWnd Object von GetDlgItem definitiv kein
    CButton Objekt, was die Typüberprüfung beweist.

    CButton* pButton = DYNAMIC_DOWNCAST(CButton, GetDlgItem(IDCANCEL));
    	ASSERT(pButton);
    

    Ich habe mal ein Beispiel gemacht.

    Angenommen ich habe eine super Klasse 💡 von CButton abgeleitet:

    class CExButton : public CButton
    {
    	DECLARE_DYNAMIC(CExButton)
    public:
    	CString GetCaption() const
    	{ return m_strCaption; }
    
    	void SetCaption(const CString& strCaption)
    	{ m_strCaption = strCaption; }
    
    private:
    	CString m_strCaption;
    };
    
    IMPLEMENT_DYNAMIC(CExButton, CButton)
    

    Ich kann ja jetzt auch nicht davon ausgehen, das alle Button's in meinem
    Dialog durch Zauberhand zu CExButton werden, oder?

    Oder doch, denn dann mach ich doch einfach in OnInitDialog folgendes:

    ((CExButton*)GetDlgItem(IDCANCEL))->SetCaption("SuperButton");
    

    Ob das wohl klappt? Wird schon gutgehen 🙄

    Gruss
    EB



  • bitte nicht schlage, aber angenommen ich leg ne variable für den button nahmens mv_close an wie müsste dann der code-schnipsel für das icon aussehen??? 🙄



  • Einfach ((CButton*)GetDlgItem(IDCANCEL)) gegen die Membervariable ersetzen und den Pointer mit einem '.' ersetzen ...

    m_MemberVar.SetIcon(...)
    

    Gruß
    :: NoName ::



  • wunderbar nur ein problem gibt es noch zu bewältigen, der button sieht jetzt recht win98 mäßig aus, ist möglich ihn wieder schön ... mir fällt jetzt kein wort dazu ein... aussehen zu lassen?



  • mfc-noob schrieb:

    wunderbar nur ein problem gibt es noch zu bewältigen, der button sieht jetzt recht win98 mäßig aus, ist möglich ihn wieder schön ... mir fällt jetzt kein wort dazu ein... aussehen zu lassen?

    Hmm, warum "wieder" ... ?

    Möchtest du ihn im Windows-XP Style haben ?
    Dann musst du mal bei Codeproject.com vorbeischauen...

    Gruß
    :: NoName ::



  • ...und diese merkwürdige button demo ziehen...nene
    ich möcht lieber wissen wie man die buttons mit icon so schön glossy macht... vieleicht liegts aber auch nur an den icon die den gesamten button besdecken???
    wie macht ihrs denn? 😕



  • gui-schreiben ist schwerer als algos...hoffentlich nicht mehr lange 😞



  • besorg dir doch einfach eine Klasse von Codeproject die dir gefällt. Die meisten haben ja schon eine Funktion zum einbinden von Icons...

    Gruß
    :: NoName ::



  • :: NoName :: schrieb:

    Einfach ((CButton*)GetDlgItem(IDCANCEL)) gegen die Membervariable ersetzen und den Pointer mit einem '.' ersetzen ...

    m_MemberVar.SetIcon(...)
    

    Gruß
    :: NoName ::

    ich hab das jetzt so gemacht

    CButton Button //Member
    
    Button.GetDlgItem(IDC_BUTTON1)->SetIcon(....
    

    meintest du das so?



  • MSS-Software schrieb:

    ich hab das jetzt so gemacht

    C/C++ Code:
    CButton Button //Member

    C/C++ Code:
    Button.GetDlgItem(IDC_BUTTON1)->SetIcon(....

    meintest du das so?

    Nee...

    m_MemberVar.SetIcon(...)

    m_MemberVar ist eine Membervariable vom Typ CButton, also der Button auf dem du dein Icon gesetzt haben willst. Du musst also vorher eine Membervariable von deinem Button erstellen...

    Ich hab das hier schonmal mit Bitmaps beschrieben :
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-76967-and-highlight-is-icon.html

    Gruß
    :: NoName ::


Anmelden zum Antworten