Dringendes CTreeCtrl-Problem zu lösen

CodeFatal

Erfahrenes Mitglied
Hallo Leuts,

ich verzweifel gerade an mir selbst.

Folgendes ich habe ein Element vom Typ CTreeCtrl erzeugt
Code:
m_Tree[i].Create(TVS_HASBUTTONS|TVS_LINESATROOT|TVS_HASLINES|TVS_DISABLEDRAGDROP|TVS_SHOWSELALWAYS|TVS_NOTOOLTIPS , r, this, START_ID_TREE+i);
m_Tree[i].ModifyStyleEx(0, WS_EX_CLIENTEDGE, 0);

Folgende Messages werden abgefangen:
Code:
	ON_NOTIFY(NM_CLICK, START_ID_TREE+0, OnClickTree)
	ON_NOTIFY(NM_DBLCLK, START_ID_TREE+0, OnDblclkTree)
	ON_NOTIFY(NM_SETFOCUS, START_ID_TREE+0, OnSetfocusTree)
	ON_NOTIFY(TVN_SELCHANGED, START_ID_TREE+0, OnSelchangedTree)
	ON_NOTIFY(TVN_ITEMEXPANDED, START_ID_TREE+0, OnTvnItemexpanded)

Mein Problem:
Die OnSelchangedTree wird nicht aufgerufen. Der Code ist für XP und WinCE 5.0 geschrieben. auf dem WinCe 5.0 gibt es keine Probleme.
Kann mir jemand weiterhelfen? Bzw. nen Tip geben, wie ich testen/ermitteln kann wo das Problem ist?

Bräuchte dringend Hilfe. Vielleicht seh ich auch nur den Wald vor lauter Bäumen nicht.

Mit freundlichem Gruß
Michael
 

CodeFatal

Erfahrenes Mitglied
Ich nochmal,

hab jetzt ne kleine Demo Anwendung geschrieben.
Zwei CTreeCtrl auf einer Dialogfeldbasierten Anwendung.Eines über den Wizard angelegt und eines in der OnCreate. Letzteres funktioniert nur eingeschränkt. Messages wie TVN_SELCHANGED und TVN_ITEMEXPANDED werden nicht ausgelöst.
Was mache ich anderes als der Wizard und wie kann ich das Problem lösen.

Gruß Michael
 

jokey2

Erfahrenes Mitglied
Wenn Du TreeControls dynamisch anlegst, dann vergibst du auch die ID's dynamisch.
DAfür solltest du Dir einen Bereich von ID's reservieren, die Du dann beim Erzeugen verwendest. Vielleicht speicherst Du Dir die ID und den Zeiger auf das erzeugte TreeControl in einer map<int,CTreeCtrl*>.
Dann verwendest Du
Code:
ON_NOTIFY_RANGE(TVN_SELCHANGED, START_ID_TREE, END_ID_TREE, OnSelchangedTree)
und die Funktion
Code:
afx_msg void OnSelchangedTree(UINT id, NMHDR *pNotifyStruct, LRESULT *pResult)
Dort kannst du dann anhand der ID den Zeiger auf das entsprechende TreeCtrl aus der map holen.
 

CodeFatal

Erfahrenes Mitglied
Danke für die Antwort,

das mit der Range wusste ich nicht hab da für jedes Element ne eigene Zeile spendiert;)
Werd das auf jedenfall mit aufnehmen. Nur leider löst das mein Problem nicht.

Beim Testprogramm habe ich nur ein Dynamisches Element und da reagieren die Controls genau wie in der eigentlichen Software. Irgendwie scheints, das die NOTIFY Nachrichten nicht weiter gegeben werden. Für CStatic gibts das SS_NOTIFY Flag für Trees hab ich ähnliches nicht gefunden :(

Andere Nachrichten wie die SetFocus oder Reaktion auf den Click werden an das Control weiter gereicht. Es muss also noch irgendwas anderes im Busch sein.

Hier einmal ein Auszug aus dem Quellcode:
Code:
void CProjekt495Dlg::DoDataExchange(CDataExchange* pDX)
{
	int i;
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProjekt495Dlg)
	for(i=0 ; i<ANZ_TREE ; i++)
		DDX_Control(pDX, START_ID_TREE+i, m_Tree[i]);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CProjekt495Dlg, CMyDialog)
	//{{AFX_MSG_MAP(CProjekt495Dlg)
//Tree		#define ANZ_TREE			2
	ON_NOTIFY(NM_CLICK, START_ID_TREE+0, OnClickTree)
	ON_NOTIFY(NM_DBLCLK, START_ID_TREE+0, OnDblclkTree)
	ON_NOTIFY(NM_SETFOCUS, START_ID_TREE+0, OnSetfocusTree)
	ON_NOTIFY(TVN_SELCHANGED, START_ID_TREE+0, OnSelchangedTree)
	ON_NOTIFY(TVN_ITEMEXPANDED, START_ID_TREE+0, OnTvnItemexpanded)

	ON_NOTIFY(NM_CLICK, START_ID_TREE+1, OnClickTree)
	ON_NOTIFY(NM_DBLCLK, START_ID_TREE+1, OnDblclkTree)
	ON_NOTIFY(NM_SETFOCUS, START_ID_TREE+1, OnSetfocusTree)
	ON_NOTIFY(TVN_SELCHANGED, START_ID_TREE+1, OnSelchangedTree)
	ON_NOTIFY(TVN_ITEMEXPANDED, START_ID_TREE+1, OnTvnItemexpanded)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//Schnittstellen aus dem Header
afx_msg void OnClickTree(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSetfocusTree(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult);

Ich weiß die MessageMap ist nicht dolle aber da hab ich ja jetzt ne bessere Lösung :D

Ist denn da irgendein Fehler erkennbar?
Ich steh echt auf dem Schlauch.
Wie gesagt bei dem Embedded System für WinCE 5.0 gibt es keine Probleme.

Gruß Michael
 

jokey2

Erfahrenes Mitglied
Tut mir leid, aber dann weiß ich auch nicht mehr weiter. Der Code schaut soweit gut aus. Vielleicht hat ja noch jemand eine zündende Idee.:(
 

Endurion

Erfahrenes Mitglied
Möglicherweise kollidiert die dynamische ID mit einer bereits verwendeten ID?

Ansonsten würde ich auf den ganzen MessageMap-Krempel verzichten und über OnNotify/PreTranslateMessage/OnCommand direkt auf die Nachrichten abfragen. Dort kannst du dann auch mit dem HWND vergleichen.
 

CodeFatal

Erfahrenes Mitglied
Falls die dynamische Id mit ner anderen im Konflikt stände würde dann nicht auch der ganze andere Messegekram für dieses Element schieflaufen? Und in meinem Demo Programm hab ich das selbe Problem und da sind andere Ids.

Irgendwie ist mir das mal richtig suspekt...

Gruß Michael
 

CodeFatal

Erfahrenes Mitglied
Guten Morgen,

so das Problem hat sich gelöst.

Das Problem ist dem Unicode zuzuordnen.

Ersetzt man TVN_SELCHANGED durch TVN_SELCHANGEDW klappt das ganze.

Hoffe der Nachwelt ist damit geholfen.

So Long

Michael
 

prado

Grünschnabel
TVN_SELCHANGEDW statt TVN_SELCHANGED

Hi Michael,

ich hatte dasselbe Problem, stundenlang rumprobiert, bis ich deinen Beitrag fand.
Die Lösung ist unglaublich; da muss man erst mal drauf kommen.
Du hast mir sehr geholfen!