CMFCShellListCtrl Header Spalten ändern



  • Hallo,

    ich möchte das neue CMFCShellListCtrl control einsetzen funktioniert auch so weit.
    Nun möchte ich jetzt im Header die Spalten Size+Typ will ich nicht angezeigt haben und Spalten Breite ändern können. Hat jemand Erfahrung? MSDN konnte ich darüber nichts finden


  • Mod

    Ein CMFCShellListCtrl ist ein normales CListCtrl.
    Also kannst Du ganz normal SetColumnWidth verwenden.

    Du kannst eine Spalte nicht wntfernen, denn die Spaltennummern sind hart codiert.
    DDu kannst aber die Splatenweite auf 0 setzen und das Aufziehen der Spalte verhindern.



  • Hallo Martin,

    danke für den Tipp hat wunderbar funktioniert.



  • ich bins noch mal hab da noch was 😉

    kann ich beim Doppelclick auf PDF Dateien verhindern, dass externe PDF Programm gestartet wird? Ich brauch lediglich ausgewählte Dateinamen.


  • Mod

    OnDblClk (NM_DBLCLK) Handler selbst schreiben.

    Oder CMFCShellListCtrl::DoDefault überschreiben.
    Schau Dir den Code in der MFC an, was dort gemacht wird.



  • Nochmals Danke

    ich habs so gelöst vielleicht braucht das ja jemand

    BOOL OpenDial::PreTranslateMessage(MSG* pMsg)
    {
    	if( pMsg->message == WM_LBUTTONDBLCLK )
    	{
    	  s = m_ShellList.GetItemText( m_ShellList.GetSelectionMark() ,0 );
    		if( s.MakeUpper().Find(".PDF")!=-1)
    		{
    			SelectedFile = s ;
    			( ( CEMS_ClientDlg* )m_pWnd )->SelectedFile = m_OrdnerPfad+"\\"+SelectedFile;
    			CDialog::OnOK();
    		}
    		else 
    		{
    			SelectedFile.Empty();
    			return 0;
    		}
    	}
    	else 	return CDialogEx::PreTranslateMessage(pMsg);
    }
    

  • Mod

    Falscher Weg. Damit fängst Du auch einen Doppelklick auf den Header ab.

    Warum baust Du keinen Handler ein.



  • Hallo,

    ganz einfach, wenn ich das Ereignis (NM_DBLCLK) über VS2010 hinzufüge, wird sie nicht angesprungen. Vielleicht mach ich das ja falsch 😢 deswegen der Umweg über Pretranslate und über Abfrage ist das z.Z. selektierte Zeile wirklich eine Datei.


  • Mod

    Ist denn in der Message-Map auch ein Eintrag drin?
    Hast Du auch eine Messagemap definiert?

    Da in der Basisimplementierung NM_DBLCLK angesprungen wird, kannst Du mir schwer erzählen, dass es nicht geht 😉



  • Ich hab es wieder getestet und es klappt nicht!!!

    .h Datei 
    afx_msg void OnNMDblclkMfcshelllist1(NMHDR *pNMHDR, LRESULT *pResult);
    
    .cpp Datei 
    BEGIN_MESSAGE_MAP(OpenDial, CDialogEx)
    ON_NOTIFY(NM_DBLCLK, IDC_MFCSHELLLIST1, &OpenDial::OnNMDblclkMfcshelllist1)
    END_MESSAGE_MAP()
    
    void OpenDial::OnNMDblclkMfcshelllist1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	*pResult = 0;
    }
    

  • Mod

    Du sollstest auch eine eigene Klasse ableiten und dort per ON_NOTIFY_REFLECT NM_DBLCLK behandeln.
    Schau Dir bitte einfach mal den Sourcode von CMFCShellListCtrl. Da NM_DBLCLK durch ON_NOTIFY_REFLECT behandelt wird, erreicht es niemals die Messagemap des Dialoges.


Log in to reply