Wie kann ich auf ein mausklick eines eigenen CWnd Objekts reagieren?



  • habe ein Dialog, in dem ich ein eigenes CWnd Objekt benutze.. ich ereuge es im konstruktor und lösche es im destruktor.. die anderen CWnd Obekte (Button's) etc werden ja von CDialog verwaltet erzeuget gelöscht etc. da bekom ich ja ein maus klick ereigniss...

    Aber wie kann ich ereignisse meine eigen CWnd objet abfangen??



  • Wo willst du die denn Behandeln?
    Und verwendest du direkt CWnd oder eine eigene von CWnd abgeleitete Klasse?

    Im Grund genommen musst du nen eigenen Message Handler für z.B. WM_LBUTTONDOWN machen. Entweder behandelst du die Klicks dann direkt da drinnen, oder du schickst an der Stelle dann eine Benachrichtigung ans parent Fenster, so wie es eben auch Buttons etc. machen.
    (Was für eine Message das jetzt ist mit der sich normale Controls melden müsste ich jetzt nachgucken/ausprobieren, aber ich schätze es wird wohl WM_NOTIFY sein)



  • ist net abgeleitet klasse... kannst du mir ein beispiel machen? wie das geht... steh da bischen aufm schlauch



  • Ist abgeleitet ja oder nein?
    "ist net abgeleitet klasse" is nicht Deutsch, das kann nu ein Tippfehler ("is ne abgeleitet klasse") oder schlechtes Deutsch sein ("ist net abgeleitet klasse" statt "ist keine ..."). Blubb?

    Beispiel kann ich dir im Moment keines machen, bin grad etwas beschäftigt. Guck in der MSDN nach 😃

    Bzw.: Wie erzeugst du denn dieses Fenster? Erklär mal oder lass die entsprechenden Stücke Code sehen...



  • Tippfehler;) ist ne abgeleitet Klasse;)

    hier der code der Klasse;

    class CWorkflowGraphic : public CWnd{ 
    
    public: 
        CMyVisDiagramm *m_Graphic; 
        CWorkflow *m_Workflow; 
    
        CWorkflowGraphic(CWnd *m_Hw,CRect &m_rc,CWorkflow *m) : CWnd(){ 
    
            m_Workflow=m; 
           Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,m_rc, m_Hw, 1234); 
    
                //Grafik erzeugen und dne CDC des CWnd verwenden! 
           m_Graphic= new CMyVisDiagramm(this->GetWindowDC(),    
                    CPoint(1,1), 
                    m_rc.right-m_rc.left-1, 
                    m_rc.bottom-m_rc.top-1); 
    
           m_Graphic->getData(m_Workflow); 
        } 
    
        virtual ~CWorkflowGraphic(){ 
            if(m_Graphic) 
                delete m_Graphic; 
        } 
    
        //void Invalidate(); 
    
        inline CMyVisDiagramm* getGraphic(){ 
            return m_Graphic; 
        } 
        //inline virtual BOOL Create() : Create( 
    
    };
    

    in meinem dialog erzeug ich die klasse einfach in OnInitDialog
    mit "new" und hab eine Membervariable (Zeiger auf das Objekt)

    später lösch ich das ganze wieder im destruktor im dialog...


  • Mod

    Du benötigst für das entsprechende Fenster eine MessageMap.
    DECLARE_MESSAGE_MAP / IMPLEMENT_MESSAGE_MAP / BEGIN_MESSAGE_MAP / END_MESSAGE_MAP, dann kannst Du entsprechende Handler integrieren.



  • BEGIN_MESSAGE_MAP(CWorkflowGraphic, CWnd)
    
    	ON_BN_CLICKED(id, memberFxn)
    
    END_MESSAGE_MAP()
    

    ok nun die frage... wenn ich in auf die grafik clicke.. will ich die kkordinaten des mauszeigers haben...

    bei der ON_BN_CLICKED müsste ich ja die ID des Controls welches in meinem CWnd fenster ist übergeben.. aber die IDE ist ja quaise das CWnd selber.. da ich ja in diese CWnd klicke... verstanden??



  • Ich würde an deiner Stelle lieber die WM_LBUTTONDOWN etc. abfangen, um die Mausklicks direkt abzufangen. Alternativ kannst du deine Position per GetCursorPos() abfragen (aber afaik reagiert ON_BN_Clicked auch, wenn du das Element per Tastatur auslöst).



  • ok gute idee.. nun ist die frage wie ich das mache.. habe ja ne message map, und schreib da warhscehinlich ON_WM_LBUTTONDOWN und weiter?? muss ja ne afx_msg funktion dafür haben wo er bei dem ereigenis reinspringt wie mach ich das?



  • Diese Handler-Funktion hat die CWnd schon definiert, du mußt sie nur noch überschreiben und mit Inhalt füllen. Die korrekte Signatur lautet:

    afx_msg void OnLButtonDown(UINT flags, CPoint pos);
    

    (flags gibt an, welche Steuer- und Maustasten bei der Aktion gedrückt waren, pos ist der Ort, wo sich die Maus befunden hat (realtiv zum eigenen Fenster))



  • ok super danke:)

    P.S: d.h. die positon von CWnd Fenster obere linke ecke aus, oder vom dialog aus?



  • Afaik von der Ecke des CWnd aus (aber um ganz sicher zu gehen, solltest du mal deinen Debugger fragen).



  • ok das programm läuft, allerding springt er nich beim nem links klick in die funktion:

    BEGIN_MESSAGE_MAP(CWorkflowGraphic, CWnd)
    
    	ON_WM_LBUTTONDOWN()
    
    END_MESSAGE_MAP()
    
    void CWorkflowGraphic::OnLButtonDown(UINT flags, CPoint pos){
    
    	//this->SoetDlgItemText(this,"TEST);
    
    	CString str;
    	str.AppendFormat("Maus Pos (x:%i ,y:%i)", pos.x,pos.y);
    	AfxMessageBox(str);
    }
    

    was mach ich noch falsch??

    ich will lediglich später ein dilaog öffen wenn der mauszeiger über der CWnd Objekt ist und diese dialog ist von der positon abhaängig...



  • keine ne IDEE 😞


  • Mod

    Die Mausaktionen beziehen sich immer nur auf die entsprechende Client Area nicth den gesamten Dialog!

    BTW: Du brauchst nicht brüllen. Ich bin zwar hier regelmässig aber im Allgemeinen arbeite ich auch noch nebenbei... :xmas1:



  • naja ich klicke ja nur in das CWnd Objekt.. also im bereich des CRects welches ich in "Create" übergebe....

    Haja Martin, du bist halt nunmal der checker hier...;) Allwissender:)



  • Hast du denn DECLARE_MESSAGE_MAP und IMPLEMENT_MESSAGE_MAP auch wo stehen? Wenn nicht, dann mach mal.



  • aha das IMPLEMENT.... da muss ich mal schaun;)



  • DECLARE hab ich , aber IMPLEMENT Nicht.. aber in meinen anderen Dialogen steht auch nirgens was von IMPLEMENT oder das ein sonderfall???


Log in to reply