'Klick' auf Oberfläche



  • Hallo,

    ich möchte mittels 'Klick' auf meine OnDraw-Oberfläche, ein Dialogfenster öffnen, wenn ich aber diesen Befehl mit diesem Code ausführe, wird das Dialogfenster immer geöffnet, wenn ich die linke Maustaste drücke, was ja auch gewollt ist, nur sollte es eben mittels If-Abfrage o.Ä. nur dann ausgeführt werden, wenn ich mich eben auch innerhalb meines Programmes befinde.

    void CProgramm::OnLButtonDown(UINT nFlags, CPoint point)
    {
    Info_Klick();  
    }
    
    void CProgramm::Info_Klick(void)
    {
    //sollte nur ausgeführt werden, wenn ich mich mit dem Mauszeiger innerhalb meiner programmierten Oberfläche befinde)
    CDialog dlgInfo(IDD_DIALOG1); 
    dlgInfo.DoModal();
    }
    

    Vielen Dank im Voraus 🙂



  • ...



  • Ich arbeite mit einem ActiveX TestContainer, und wenn ich mein Programm dort teste, dann wird dieser Dialog immer geöffnet, egal wohin ich klicke, auch wenn ich mich außerhalb der Testumgebung befinde, ich möchte aber irgendwie abfragen, dass es nur dann ausgeführt wird, wenn ich mich auch innerhalb meines ActiveX Programmes befinde...Ich hoffe so ist es etwas verständlicher um was es mir geht?



  • Du hast das Rectangle deines Fensters.
    Du hast die Position des Maus clicks.

    CRect::PtInRect (Point p);

    Ein Click ist Button down gefolgt von Button up. Die Aktion wird nur ausgelöst wenn Button up im gleichen Rechteck wie Button down ist.



  • Danke für deine Hilfe
    zu dem:

    weicher schrieb:

    Ein Click ist Button down gefolgt von Button up. Die Aktion wird nur ausgelöst wenn Button up im gleichen Rechteck wie Button down ist.

    da habe ich ja das

    CProgramm::OnLButtonDown(UINT nFlags, CPoint point)
    

    das wird ausgeführt, wenn ich die linke Maustaste drücke. (das passt mir ja eigentlich schon so...)

    weicher schrieb:

    CRect::PtInRect (Point p);

    Aber wie gesagt, ich bin wirklich noch ein kompletter Neuling und ich verstehe nicht wirklich, wie ich dann mit dem weiterarbeiten sollte, und wenn ich das schreibe, erhalte ich immer die Fehlermeldung "'Point': nicht deklarierter Bezeichner" 😕

    mfG Jenny



  • Hallo Jenny,

    Edit:
    Die Deklaration von PtInRect sollte so sein

    BOOL CRect::PtInRect (CPoint p);
    

    Versuchs mal so

    CProgramm::OnLButtonDown(UINT nFlags, CPoint point)
    {
      CRect rect;
      appWin.GetWindowRect (rect);
      if (rect.PtInRect (point))
        Info_Klick ();
    }
    

    appWin ist ein CWindow und ist das Fenster Deines Programms.

    Eventuell musst Du das Rect noch mit ClientToScreen() oder ScreenToClient() zurechtrücken damit es funktioniert.

    Windows like wäre aber:
    -In OnLButtonDown das Rect in einer Membervariablen (mClickRect) zu speichern wenn point im Rect ist andernfalls mClickRect.SetEmptyRect().
    -In OnLButtonUp wenn point im mClickRect ist Info_Click() aufrufen.

    Versuchs mal in irgend einer Windows Anwendung. Du wirst sehen, dass die Aktion immer erst beim loslassen des Button ausgelöst wird.



  • Hallo,

    wenn ich jetzt das ausprobiere:

    void CProgramm::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
    
    	CRect rect;
    	//appWin.GetWindowRect(rect);
    	CWnd::GetWindowRect (rect);
    	if (rect.PtInRect(point))
    	{Info_Klick();}
    //ClientToScreen(point); //Konvertierung 'CPoint' in 'LPPOINT' nicht möglich 
    	COleControl::OnLButtonDown(nFlags, point);
    }
    

    dann stürzt mein Programm beim Linksklick jedes Mal ab.
    mit

    //appWin.GetWindowRect(rect);
    

    bekomme ich 2 Fehlermeldungen:
    "Links von ".GetWindowsRect" muss sich eine Klasse/Struktur/Union befinden"
    bzw. "'appWin': nichtdeklarierter Bezeichner...

    Und danke für die Erklärung!
    aber da es in dem bestehenden Programm auch schon mit dem OnLButtonDown gelöst wurde, möchte ich es eigentlich so beibehalten.



  • ...



  • Hallo Jenny,

    wenn ich sehe WIE Du das ausprobiert hast, dann stehst Du wirklich noch ganz am Anfang und ich muss mich, so leid es mir tut Swordfish anschliessen.

    Du musst zuerst einige Grundlegende Dinge verinnerlichen. Es ist eindeutig zu hoch gegriffen gleich mit UI und auch noch mit ActiveX zu beginnen.


  • Mod

    Zudem GetWindowRect hier auch vollkommen falsch ist. Es muss GetClientRect sein!



  • Hallo zusammen,

    das ist richtig, die Grundlagen fehlen mir auf alle Fälle (da hat leider ein kurzes Tutorial nicht wirklich helfen können), aber meine Aufgabe ist es für meine Firma, dieses Programm etwas zu erweitern, ich arbeite ansonsten NICHT mit C++, und brauche es im Normalfall auch nie. Ich dachte eigentlich, dass meine Fragen, für Profis ziemlich leicht zu beantworten sind, ich wollte auf keinen Fall jemanden damit nerven oder seine Zeit stehlen.

    Aber da ich mit dem Beispiel von 'weicher' leider nicht weit gekommen bin, habe ich es mit anderen Befehlen gelöst und es funktioniert so auch. 🙂
    (Bei Linksklick lege ich zuerst die Fläche meines Text(-feldes) fest, und frage dann genau ab, ob sich die x-/y-Koordinate des Mausklicks in dieser Fläche befindet)
    Ich bedanke mich aber vielmals für eure Hilfe! 🙂

    mfG


Anmelden zum Antworten