Wohin mit CListCtrl::SetExtendedStyle(...) ???



  • Hallo zusammen!

    Habe mir eine eigene, von CListCtrl abgeleitete Klasse geschrieben. In meinem ListControl soll bei einer Auswahl immer die ganze Zeile markiert werden. Die Lösung dafür habe ich gerade eben im FAQ gefunden: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39111.html

    SetExtendedStyle( LVS_EX_FULLROWSELECT)

    Klappt ja alles wunderbar, meine Frage ist nur wo ich diese Methode am besten aufrufe? (Soll ja innerhalb meiner Klasse aufgerufen werden)

    Konstruktor?
    OnCreate?
    PreCreateWindow?
    usw...

    Wo gehört so was hin??? Bin durch die große Anzahl der Möglichkeiten etwas verwirrt... 😕

    Gruß Brainiac



  • Konstruktor ist gut 😉



  • War die Antwort ernst gemeint? 😕 Also im Konstrukor bekomme ich einen ASSERT-Fehler. (IsWindow)

    Ich will halt kein Gefrickel, deswegen frage ich hier so blöd, will halt wissen wo so etwas in einem sauberen Code steht. Für mich wäre es logisch, in der PreCreateWindow den Style zu setzen. Deshalb mein Versuch:

    BOOL CFileListCtrl::PreCreateWindow(CREATESTRUCT& cs)
    {
    	cs.dwExStyle |= LVS_EX_FULLROWSELECT;
    	return CListCtrl::PreCreateWindow(cs);
    }
    

    Dies hat jedoch keine Auswirkungen?!? 😕
    Es gibt keinen Fehler, im ListControl wird jedoch nicht die ganze Zeile bei einer Auswahl markiert.

    Gruß Brainiac


  • Mod

    Weil Du denkst die Extended Styles würden den Window Style betreffen. Das ist ein Irrtum. Du musst die Funktion SetExtendedStyle verwenden, anders lassen sich diese Stile nicht anwenden.
    Wenn ich ein eigenes Control baue, dann platziere ich diese Funktion immer in meinem OnCreate Handler.



  • Danke für deine Antwort Martin!

    Ok, OnCreate war ja auch eine meiner Ideen, hier habe ich jedoch das Problem, dass die Funktion nicht aufgerufen wird?!? 😕 Also irgendwie is mal wieder der Wurm drin... 😞 Ich habe ganz normal einen Message-Handler für WM_CREATE in meine Control-Klasse eingebaut:

    int CFileListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	TRACE("OnCreate()\n");
    	if (CListCtrl::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	SetExtendedStyle(LVS_EX_FULLROWSELECT);
    
    	return 0;
    }
    

    Diese Funktion wird jedoch gar nicht erst aufgerufen, ich sehe nichts von dem TRACE! 😕

    Was läuft den hier schon wieder falsch???

    Der Konstruktor z.B. wird aufgerufen, den habe ich ebenfalls mit einem TRACE versehen. Nur auf WM_CREATE wird komischerweise nicht reagiert. (Hab den Handler ganz normal über den Assistenten eingebaut, also auch die MessageMap stimmt...)

    Kann mir jemand sagen woran das nun liegen kann???

    Danke im voraus,

    Gruß Brainiac



  • OnCreate(...) wird offensichtlich nicht aufgerufen. Das Objekt wird im Konstruktor geschaffen, da gehört die Funktion aber nicht hin.
    ... wenn Du die Funktion in PreCreateWindow(...) verwendest, klappt es dann?

    ..



  • Danke nochmals für deine Antwort,

    leider funktioniert das auch nicht. Es liegt aber ebenfalls daran, dass die PreCreateWindow gar nicht aufgerufen wird!

    Ich glaube ich mache etwas grundsätzliches falsch. Es ist das erste Mal, dass ich mich an eigene Controls wage... 🙄

    Hab auch mal mit den verschiedenen Einstellungen, z.B. "Ownerdrawn fixed" herumgespielt, jedoch keine Änderung erzielt. (Außer dass dann gar nichts mehr in meinem Control dargestellt wurde. 😞 OnCreate, PreCreateWindow o.ä. kamen jedoch trotzdem nicht an...)

    Hat mir jemand ein gutes Tutorial über das Erstellen eigener Controls?

    (Irgendwie komme ich mir gerade ziemlich dumm vor, ich hätte nicht gedacht dass mich das vor solche Probleme stellt... Ist ja nicht das erste Mal das ich was mit MFC mache 😉 )

    Ich erläutere mal einfach meine Vorgehensweise, vielleicht habe ich etwas total banales vergessen:

    - Ich habe einen eigenen Dialog, in dem ich im Ressourcen-Editor ein ListCtrl eingefügt habe
    - Dann habe ich mir eine neue Klasse erstellt (CFileListCtrl), abgeleitet von CListCtrl
    - Nun im Ressourcen-Editor Rechtsklick auf das ListCtrl -> Variable hinzufügen.
    - Dort eine Steuerelementvariable m_List erstellt und den Typ von CListCtrl auf CFileListCtrl geändert.

    Und nun müssten doch bei Aktionen mit meinem Control die Handler meiner eigenen Klasse aufgerufen werden, oder?
    Aber wie gesagt, das einzige was bis jetzt definitiv aufgerufen wird ist der Konstruktor. (Also wird zumindest mal eine Instanz meiner Control-Klasse erstellt)

    Wo ist der Fehler???

    PS: Nicht einmal WM_PAINT kommt in meiner Klasse an... 😞

    Gruß Brainiac

    EDIT: Oh, habe erst jetzt deinen Edit gesehen! Ich glaube das hört sich für mich interessant an, könnte es sein das hier mein Fehler liegt?

    2. Initialize the CListCtrl object and attach an actual Windows list view common control to it with a call to the CListCtrl::Create() method.


  • Mod

    Also wenn Du das ListCtrl erst in einem Dialog subclasses, dann bekommst Du natürlich keine WM_CREATE Nachricht, denn der Dialog hat das Control längst erzeugt.
    Auch PreCreateWindow kann nicht funktionieren, denn auch in diesem Fall müsste Create aufgerufen werden, aber das passiert in einem Dialog nicht mehr.

    Genau für Deinen Fall wurde PreSubclassWindow geschaffen. D.h. Du bekommst das Handle eines Plain Windows angeboten, dass demnächst in der MFC verwendet werden soll. Hier kannst Du nun Deine entsprechenden Vorbereitungen treffen.

    Warum ein WM_PAINT nicht ankommt ist mir unklar. Messagemap Entry Eintrag vergessen?



  • Erstelle doch mal probeweise dein CMyListView/CMyListCtrl nicht über die Ressourcen, sondern auf die o.g. Weise, also mit Create(...):

    BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
    /*
    •  dwStyle Specifies the combination of styles used by a list control. 
    •  rect Specifies a list control’s size and position. 
    •  pParentWnd Specifies the list control’s parent window. 
    •  nID Specifies the control identifier for a list control. 
    */
    

    Vielleicht kannst Du auch von Demo-Projekten erweiterter CListCtrl's Ideen finden:
    http://www.codeproject.com/listctrl/filedroplistctrl.asp u.a.


Anmelden zum Antworten