Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Treeview & osoittimen tallennus TVITEM struktuuriin

tneva82 [06.10.2009 15:03:49]

#

Eli yritän saada TVITEM struktuurin lParam kohtaan tallennettua luokan osoittimen. Luokassa on sitä sun tätä hyödyllistä tietoa johon pääsy olisi tärkeätä. Osoitin suoraan sinne tuntui nopeammalta ja helpommalta kuin yrittää selvittää koko polkua valitusta elementistä juuri elementtiin asti.

Ongelmana vain ettei lParam sisällä oikeata arvoa(sisältää itseasiassa 0). Asiaan liittyvää koodia:

int main(void) {
    //yleiset säädöt jotka koskevat kaikkia elementtejä
    tvinsert.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
    tvinsert.item.mask=TVIF_TEXT;
    tvinsert.item.iImage=0;
    tvinsert.item.iSelectedImage=1;
    // ...
}

//myöhemmin toisessa funktiossa
... {
    if(parent!=NULL) {
	tvInsert.hParent=parent->getHandle();          // parent's handle
    } else {
	tvInsert.hParent=NULL;
    }
    tvInsert.hInsertAfter=TVI_LAST;   // below parent
    tvInsert.item.pszText=(LPTSTR)nameTemp.c_str();
    tvInsert.item.lParam=(LPARAM)this; // tässä nyt yritetään laittaa osoitinta lParamiin

    handle=TreeView_InsertItem(treeMenu, &tvInsert);
}

Tuo siis hoitaa elementtien lisäyksen puuhun eikä siinä ainakaan mitään vikaa tunnu olevan. Debuggerilla kun katsoin lParam arvoa ennen lähetystä on siinä luku jonka muuttaminen desimaaleista heksoihin antoi luvun joka täsmää this muuttujan osoitteen kanssa eli siinä ei vikaa tunnu olevan.

case WM_NOTIFY:
		switch (((LPNMHDR)lParam)->code) {
        case NM_DBLCLK:
			    if (((LPNMHDR)lParam)->idFrom == IDI_TREE1) {
					TVITEM temp;

					temp.hItem=(HTREEITEM)TreeView_GetNextItem(treeMenu, NULL, TVGN_CARET);
					temp.mask=TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE|TVIF_SELECTEDIMAGE | TVIF_CHILDREN; //joo kaikkia näitä en tarvitse mutta halusin vain tarkistaa että mitä kaikkea sieltä tulee oikein
					TreeView_GetItem(treeMenu, &temp);

					folder *newFolder=(folder*)temp.lParam;

					FILE *pFile;
					pFile=fopen("temppi.txt", "a");
					string name=newFolder->getName().c_str();
					newFolder->foo();
					fprintf(pFile, "%s\n", name.c_str());
					fclose(pFile);

					return TRUE;
            }
            break;

		}
		break;

Tuo NÄYTTÄISI antavan oikeaan elementtiin kahvan(sama heksaluku temp struktuurin hItem:issä kuin halutun elementin sisältävän luokan kahva muuttujassa). Silti lParam arvo on 0.

Osaakos joku sanoa missä olen mokannut? Luultavasti hyvin simppeli ja itsestäänselvä virhe jonka olen onnistunut tunaroimaan mutta tähän asti ei ole löytynyt syytä. Muut arvot mitä saan GetItem funktiolla tuntuu järkeviltä mutta lParam on 0.

goala [06.10.2009 15:58:20]

#

Tässä sinun virheesi:

tvinsert.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;

//! Tämä sinun seuraava rivi mitätöi tuon ylemmän tuossa, eli
//! tvinsert.item.mask:sta katoaa TVIF_IMAGE, TVIF_SELECTEDIMAGE sekä se
//! tärkein, eli TVIF_PARAM.
//!

tvinsert.item.mask=TVIF_TEXT;

Tuosta jää nyt pois tuo ensimmäisen määrrittelemä TVIF_PARAM jolloinka
lParamin kautta ei välitetä yhtään mitään.

Muutenkin suosittelen tutustumaan esim. wxWidgetsiin, jonka kanssa tuo Windows-ohjelmointi on huomattavasti helpompaa.

tneva82 [06.10.2009 16:35:06]

#

Voi elämä. "Hupsis"

Nyt tuo ratkesi mutta jostain syystä treeview ei sitten avaudu. Pitäisikö se viesti välittää eteenpäin tai avata se jotenkin käsipelin jos NM_DBLCLICK viestin hoitaa?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta