tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
19
ZUGRIFFE
2876
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Hallo,

    gibt es eine Möglichkeit, ein ListView-Item mehrzeilig zu gestalten?

    Und noch eine andere Frage: wie bekomme ich in einem Control (Bsp.: ListView) ein Context-Menu eingebaut?

    Habe es mal mit SetMenu( CMenu* ) probiert, aber kein Ergebnis bekommen (bei Rechtsklick passierte nichts!). Muss ich es mit einer Methode (OnClick o. ä.) abfragen, und dann das Menü öffnen lassen?


    mfG

    MAN
     

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    gibt es eine Möglichkeit, ein ListView-Item mehrzeilig zu gestalten?
    Das musst du selber machen. Per Ownerdraw vermutlich. Man könnte auch für die Items einzelne CWnds einblenden, aber das ist eine knifflige Sache.

    Und noch eine andere Frage: wie bekomme ich in einem Control (Bsp.: ListView) ein Context-Menu eingebaut?
    Stichwort: CMenu::TrackPopupMenu. Ich habe allerdings im Moment da kein Beispiel zu. Da muss ich mal in meinen Sourcen wühlen. Vielleicht siehst du schon mal in der MSDN Lib nach, bis ich was gefunden habe.
    ----
    Habe was. CG_IDR_POPUP ist eine normale Menüressource. Die Auswahl der Menüpunkte bekommst du als ganz normale Windowsereignisse.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
        CMenu menu;
        VERIFY(menu.LoadMenu(CG_IDR_POPUP));
        CMenu* pPopup = menu.GetSubMenu(0);
        ASSERT(pPopup != NULL);
        
            // das sieht mir nach Hack aus - kann mich nicht mehr erinnern, 
            // warum es nötig war, das Toplevel-Parent zu bekommen:
            CWnd* pWndPopupOwner = this;
        while (pWndPopupOwner->GetStyle() & WS_CHILD)
            pWndPopupOwner = pWndPopupOwner->GetParent();
     
            pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);
    Geändert von Kachelator (01.04.04 um 00:24 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Vielen Dank für die Mühe!

    Funktioniert super!

    Wäre nur noch die Frage wo du <point> herbekommst? Bestimmt aus irgendeiner Funktion GetMousePosition, oder so. Aber wie genau?


    mfG

    MAN

    P.S.: Das mit den ListView-Items werde ich mir dann nochmal anschauen.
    Geändert von MAN (30.03.04 um 10:57 Uhr)
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Wäre nur noch die Frage wo du <point> herbekommst? Bestimmt aus irgendeiner Funktion GetMousePosition, oder so. Aber wie genau?
    Möglich wäre ::GetCursorPos(), aber ich hatte es in irgendwelchen Messagehandlern verwendet, wo die Position ohnehin übergeben wurde.
    Geändert von Kachelator (30.03.04 um 13:19 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  5. #5
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Na wunderbar

    Genauso wollte ichs haben!


    Vielen Dank nochmals!


    mfG

    MAN
     

  6. #6
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Ach ja, da hätte ich noch eine Frage: wie blendet man ein Menu-Item aus?

    Beispielsweise habe ich die 3 Hauptmenü-Items "Datei", "Bearbeiten" und "Ansicht", und möchte das Menü "Bearbeiten" ausblenden, also per Pseudocode:
    Code :
    1
    
     MenuItem( ID_MNU_EDIT )->SetVisibleState( false );     :)
    Hätte jemand eine Idee?


    mfG

    MAN
     

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Das schon probiert?
    BOOL CMenu::ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
    Keine Ahnung, ob es damit geht.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  8. #8
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Ja, ausprobiert schon, aber es gibt kein zutreffendes Flag! Da gibts nur DISABLED und GRAYED, mit dene es leider nicht funktioniert. Die restlichen sind irrelevant.

    Wollte es mit ->ShowWindow( false ) probieren, aber die Methode wird anscheinend nicht von CMenu unterstützt...

    Sonst noch Vorschläge, Tips, Hinweise?


    mfG

    MAN
    Geändert von MAN (30.03.04 um 17:34 Uhr)
     

  9. #9
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Wollte es mit ->ShowWindow( false ) probieren, aber die Methode wird anscheinend nicht von CMenu unterstützt...
    Klar, ein Item ist da auch kein eigenes Window.

    Sonst noch Vorschläge, Tips, Hinweise?
    Nee, ausser entweder zwei verschiedenen Menüs nach Bedarf verwenden oder das Item nach Bedarf von Hand einfügen und löschen.

    Ich denke aber, es zu disablen reicht auch aus, oder?
    Geändert von Kachelator (31.03.04 um 22:21 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  10. #10
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Hm... ehrlichgesagt hatte ich die dumme Idee, das Kontext-Menü in das Hauptmenü einzubauen, und eben dann nur einen dieser Menüpunkte als Kontext-Menü anzuzeigen, und diesen in dem Hauptmenü eben zu verstecken.

    Ich hatte das so gemacht, weil ich es einfach nicht geschafft hatte, mit einem seperaten Kontext-Menü es anzuzeigen.

    Da ich beim Initialisieren die Methode GetMenu() benutze, und von da aus dann durch GetSubMenu die Untermenüs ableite, ging das nicht mit einem seperaten Menü...

    Jetzt ist es die Frage: wie stelle ich es mit einem seperaten Menü an?


    mfG

    MAN
     

  11. #11
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Ehrlich gesagt verstehe ich dein Problem nicht ganz. Kannst du mir das genauer erklären?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  12. #12
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Das Problem scheint ganz einfach zu sein, aber ich bekomme es nicht hin!

    Und zwar wollte ich eigentlich nur zu meinem Main-Menü noch ein Kontext-Menü für eine ListView basteln. Da ich aber lauter Speicherfehler durch ein eigenständiges Kontext-Menü hatte, habe ich mir gedacht es in das Main-Menü einzubauen und es dann im Main-Menü auszublenden! In der ListView kann ich es ja jetzt durch deinen Tip (Danke ) anzeigen lassen. Jedoch im Hauptmenü nicht ausblenden, verstehst?

    Da ich es ja jetzt nicht ausblenden kann (da es nicht möglich ist), muss ich ja jetzt mein Kontext-Menü als eigenständiges Menü "designen" (zusammenklicken auf der Form).

    Und hier ist die Frage, wie ich auf dieses seperate Kontext-Menü zugreifen und es anzeigen lassen kann?

    Beim Hauptmenü habe ich ja ein Pointer (CMenu*) von der Methode <CMenu* GetMenu()> bekommen, womit ich dann auf das Menü Zugriff hatte.

    Da mein Kontextmenü aber nicht mein Hauptmenü ist, geht das ja nicht mit der Methode GetMenu()!

    Man ist das kompliziert zu erklären.... aber das Problem ist ja glaub ich an sich ganz einfach, aber ich habe es bis jetzt einfach nicht hinbekommen!

    Falls du immernoch Fragen haben solltest, frag nur, ich versuchs dann nochmal vielleicht anders zu beschreiben.


    mfG

    MAN
     

  13. #13
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Da ich aber lauter Speicherfehler durch ein eigenständiges Kontext-Menü hatte, [...]
    Also das Problem waren die Speicherfehler, die du hattest? Und alles andere ein Versuch, diese zu vermeiden? Wenn ich dich soweit richtig verstanden habe, solltest du versuchen, den Fehlern auf den Grund zu gehen. Vermutlich hast du mit deinem Kontextmenü irgendetwas alloziiert und nicht wieder freigegeben. Aber was könnte das sein...? *grübel*
    Könnte es Folgendes sein:
    Zu CMenu::LoadMenu() MSDN Lib: Before exiting, an application must free system resources associated with a menu if the menu is not assigned to a window. An application frees a menu by calling the DestroyMenu member function. Du musst das geladene Menü am Ende (oder vorher) auch wieder freigeben.
    Bringt dich das weiter?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  14. #14
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Joah... öhm... bin gerade zu Hause und muss es für die Arbeit machen. Kann bei der Sache nicht wirklich antworten, da ich das Programm nicht vor mir habe.

    Aber zumindest weiß ich noch, dass es ein Fehler beim Initialisieren war, und nicht beim schließen des Programms.

    Ich schreib morgen nochmal, wo genau das Problem liegt.

    Schonmal Danke bis dahin!

    Schönen Abend noch!


    mfG

    MAN
     

  15. #15
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Sodala, hab mal nochmal bißchen nachgekuckt. Folgenden Code benutze ich:

    mnuMain ist mein Hauptmenü
    mnuContextMain soll mein Kontextmenü sein (wobei "ctrMnuContextMain" die ID von dem Kontextmenü ist)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    mnuMain = GetMenu();                     // Hauptmenü
    mnuFile = mnuMain->GetSubMenu( 0 );        // Untermenü: Datei
    mnuView = mnuMain->GetSubMenu( 1 );        // Untermenü: Ansicht
     
    mnuContextMain = ( CMenu* ) GetDlgItem( ctrMnuContextMain );     // Kontextmenü
     
    mnuContextEdit = mnuContextMain->GetSubMenu( 0 );                // Hier bringt er schon den Speicherfehler, da ich ja
                                                                     // anscheinend die Methode GetSubMenu nicht auf
                                                                     // dieses initialisierte KontextMenü anwenden kann

    Doch wie solle ich es dann sonst machen? Ich weiß echt nicht mehr weiter....


    mfG

    MAN
     

Ähnliche Themen

  1. ListView Item auslesen?
    Von Olimar/Chris im Forum .NET Windows Forms
    Antworten: 1
    Letzter Beitrag: 19.03.10, 21:04
  2. ListView - Selected Item
    Von SG_wXistenZ im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 15.03.05, 09:24
  3. Item in einem Listview selectieren -> Ereignis?
    Von colblake im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 06.10.04, 07:37
  4. Mehrzeiliges Textfeld
    Von Kiramusu im Forum PHP
    Antworten: 3
    Letzter Beitrag: 28.09.03, 18:41
  5. mehrzeiliges Emailscript?
    Von dezign im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 26.10.01, 07:56