in reply to Re4: (post-create image list) Win32::GUI::TreeView and bitmap masks
in thread Win32::GUI::TreeView and bitmap masks

Yah, I saw those, but thought the other solution would be sufficient ;-) Also, I saw the ICON one which I was not able to track down in the time I allowed my self.

Ok, this one was actually pretty easy to track down.

Now, since it sounds like you will be doing quite a bit with win32 stuff I thought I'd take some time to go through the process I used in tracking these types of things down in the hopes that it will be of more help to you in the long run.
You know, the "Tech'em to fish rather than Feed'em a fish" thing :-)

I'm hungry, just gimme da fish!

Ok, so here's the answer: Use a '0'(zero) as the type parameter.

$tv->SetImageList($il, 0); # Use Flag TVSIL_NORMAL for MS TreeView_Set +ImageList()
The Flag TVSIL_NORMAL Indicates the normal image list, which contains selected, nonselected, and overlay images for the items of a tree-view control. You can read more on it here: TreeView_SetImageList

How do ya catch'em

When using something like the Win32:GUI module and something does not work right, the first thing I do is just blame it on Microsoft ;-)

No, really I'm not joking, their APIs often have lots of parameters/options which interact with each other in sometimes less than obvious ways sometimes depending on values in other parameters witin the API call. I'm not bashing MS, this is just the way it is, IMHO. So, to resolve these problems you have to dig into the MS Docs and check the parms!
In order to do this, however, you have to track down each MS API call being made.

So, in this case I just started with the method that worked, per your example and walked through it.

Starting with  my $tv = $main->AddTreeView, go into GUI.pm and look within the TreeView package and you'll see that is really just calls new, which ends up in GUI.xs as _new with a parm of "WIN32__GUI__TREEVIEW". Then in GUI.xs this is used in a switch statement which leads to a section where the constructor options are processed. Looking a little deeper is seems that the "-imagelist" parameter is just saved off into a 'C' structure tagPERLWIN32GUI_CREATESTRUCT. So, this appears to be uninteresting for our purposes, it is a dead-end.

Moving on to the problem call $tv->SetImageList($il, 24);: Look for it in GUI.pm and you'll see that it does not exist. OK fine, check for it GUI.xs and you'll see there are several Methods by that name, so be sure to find the one in the TreeView package.

MODULE = Win32::GUI PACKAGE = Win32::GUI::TreeView ... METHOD:SetImageList(IMAGELIST, [TYPE]) ... RETVAL = TreeView_SetImageList(handle, imagelist, type);

Finally, we come to where the MS API is called, TreeView_SetImageList().

Look this API call up in the MS Docs (MSDN) and you'll read that type controls the interpretation of imagelist. The options are TVSIL_NORMAL, TVSIL_STATE; and NORMAL sounds like the one for our needs. So, I look it up in the include files to get its value of '0' (zero).

So, the lesson here is (as in the previous example) when using MS APIs in particular, ALWAYS check out those dang parameters ;-}

Finally, the Caveats

Please keep in mind that the break down above is only meant to be helpful, NOT to be preachy or anything else; I know i hate being preached to. Also, there are certainly other ways to go about finding the answer. And most definitly there are better ways to explain it that how I did above. Also, I may have ommitted something along the way. ;-)

ANYHOW, I sincerely hope this helps.

Replies are listed 'Best First'.
Re6: (post-create image list) Win32::GUI::TreeView and bitmap masks
by bbfu (Curate) on Sep 10, 2003 at 16:17 UTC

    Ok, so here's the answer: Use a '0'(zero) as the type parameter.

    Gah! At one point I tried using 0, but it was before I got the simple test-case working properly, so there was some other issue that caused it not to work. Then, after the test-case was working, I went and looked it up on MSDN (though I actually used the reference for CTreeCtrl::SetImageList but it indicated the same thing: I needed to use TVSIL_NORMAL). Unfortunately, when I tried to look up the value for TVSIL_NORMAL on Google, I got some page indicating it should be 1, and I didn't think to re-try 0.

    So, where are these include files you looked up the value of TVSIL_NORAML in? :)

    Anyway, I appreciate all your help on this. Hopefully I can figure the rest of it out on my own. :p

    bbfu
    Black flowers blossom
    Fearless on my breath

      Hey, I have certainly made that same mistake more often than I'd like to remember. My favorite "I can't believe I did that!" stupid programming error is changing more than one thing at a time when tracking down a problem. It's such a newbie mistake, but I still do it from time to time and I have been programming for too many years...sheeze!

      So, about the include files?

      Well, I have them because I have MS Visual Studio installed on my system. If you don't have Studio (sound like you don't) then you can download the files from some sites. I don't know much about them, like accuracy, being up to date etc., but I doubt the old stuff (like the GDI calls used in these examples) change much.

      I just found this via google search using win32 API Include Files: DOCs which "seems" to have some good stuff. In particular download this: cyg32api.zip which appears to be pretty complete at first glance... the two parm vals needed in this thread are there at least. ;-)

      BTW: I certainly don't mind helping, as I have certainly recieved my fair share of help from this site. I just offered the tips on tracking it down to help.

      Also, I see we are in the same neck of the woods. Are you working on the project for personal or business? If you don't mind my asking.

        Personal. My girlfriend wanted a program to randomly changer her wallpaper (she's big into anime, so she has a bunch), and none of the ones we could find had the right combination of features. (It's suprising how few wallpaper changer programs can automatically pick up new files added to a directory.) So, I whipped up something in Perl, and now I'm trying to add a nice UI on it so she can change the settings without editing a config file.

        The more I use Win32::GUI and Win32::GUI::Loft, while both wonderful modules, the more I realize that I probably should've went with something like wxPerl or Tk to begin with. There's just too many little problems. Sigh.

        bbfu
        Black flowers blossom
        Fearless on my breath