1. win32lib, LV's and icons
- Posted by cafromsw at yahoo.com Jan 11, 2003
- 533 views
Thanks to input form the list I was able to solve my ListView icon problem. It turns out that extractIcon will only pull one icon from an .ico, .dll or .exe at a time. It then resizes that icon either up or down to make it fit the iconLarge and iconSmall imageLists. This is fine for some .ico files, but in .dll's, namely shell32.dll the icons are grouped. Group 1(one) may have a 32x32, 16x16, and 48x48 icon in 16 colors and again in 256 colors. After spending hours browsing around the MSDN website I found that extractIconEx will pull both a small 16x16 and a large 32x32 icon for a given group index, at the same time. Since there are already iconLarge and iconSmall imageLists in win32lib and the ListView will display the right size depending on its state; LVS_REPORT, LVS_ICON etc. all I had to do was put the correct icon in the correct imageList. After many more hours figuring out how to use and call extractIconEx I made a modified version of extractIcon. idx = extractIconEx({"shell32.dll", 1}) It basically calls extractIconEx and addIcon at the same time and returns the index to the last icon loaded. That index can then be used in addLVItem just as normal. This is that same as calling idx = addIcon(extractIcon({"shell32.dll", 1})) except that a large and small icon get added to the image list. I haven't played with TreeViews so I don't know if it has any relevence or not. I have just tested it on a couple of listViews I don't know if this list accepts attachments so here is a link to the code http://home.attbi.com/~sea.star/code/lvextras.ew I took the whole thing and dropped it into win32lib.ew because it calls routines already there and I wasn't sure how to access them externaly. This is my first time digging into the Windows API or messing with win32lib, if there are problems or mistakes please let me know. If it works for anyone else I would be interested in hearing that as well. If the win32lib people want to implement these ideas in someway that's ok as well. Thanks. Chris cafromsw at yahoo.com
2. Re: win32lib, LV's and icons
- Posted by Dan Moyer <DANIELMOYER at prodigy.net> Jan 11, 2003
- 525 views
Chris, You might want to copy the code you put at your website directly into a posting here; when I tried to copy it from your webpage into a file, it mysteriously dropped the "less than" symbol from the line: " if length(Filename) > 0 then", even though it copied it *here* just fine. Not sure if anything else gets mangled or not. Dan Moyer ----- Original Message ----- From: <cafromsw at yahoo.com> To: "EUforum" <EUforum at topica.com> Sent: Friday, January 10, 2003 4:55 PM Subject: win32lib, LV's and icons > > Thanks to input form the list I was able to solve my > ListView icon problem. It turns out that extractIcon > will only pull one icon from an .ico, .dll or .exe at > a time. It then resizes that icon either up or down > to make it fit the iconLarge and iconSmall imageLists. > This is fine for some .ico files, but in .dll's, > namely shell32.dll the icons are grouped. Group > 1(one) may have a 32x32, 16x16, and 48x48 icon in 16 > colors and again in 256 colors. After spending hours > browsing around the MSDN website I found that > extractIconEx will pull both a small 16x16 and a large > 32x32 icon for a given group index, at the same time. > > > Since there are already iconLarge and iconSmall > imageLists in win32lib and the ListView will display > the right size depending on its state; LVS_REPORT, > LVS_ICON etc. all I had to do was put the correct icon > in the correct imageList. > > After many more hours figuring out how to use and call > extractIconEx I made a modified version of > extractIcon. > idx = extractIconEx({"shell32.dll", 1}) > It basically calls extractIconEx and addIcon at the > same time and returns the index to the last icon > loaded. That index can then be used in addLVItem just > as normal. > This is that same as calling > idx = addIcon(extractIcon({"shell32.dll", 1})) except > that a large and small icon get added to the image > list. > I haven't played with TreeViews so I don't know if it > has any relevence or not. I have just tested it on a > couple of listViews > > I don't know if this list accepts attachments so here > is a link to the code > http://home.attbi.com/~sea.star/code/lvextras.ew > I took the whole thing and dropped it into win32lib.ew > because it calls routines already there and I wasn't > sure how to access them externaly. > This is my first time digging into the Windows API or > messing with win32lib, if there are problems or > mistakes please let me know. If it works for anyone > else I would be interested in hearing that as well. > If the win32lib people want to implement these ideas > in someway that's ok as well. Thanks. Chris cafromsw at yahoo.com > > > > TOPICA - Start your own email discussion group. FREE! >
3. Re: win32lib, LV's and icons
- Posted by cafromsw at yahoo.com Jan 12, 2003
- 485 views
Wolf pointed out to me that I was incorrectly use peek4signed when I should have been using peek4unsigned which could have caused some problems with error checking, thanks. I also realized that my extractIconEx didn't cohabitate with win32libs addIcon(extractIcon()) pair. I have slightly rewritten the routine to take both of these things into account. It can still be found here; http://home.attbi.com/~sea.star/code/lvextras.ew I have converted the tabs to spaces so it should copy better now, or a right-click save would work. As before it need to be pasted into win32lib.ew. I will also paste it into this post per Dan's suggestion. Yahoo mail has a really narrow text box for writing emails so it breaks the lines in wierd places. I have also rewritten the routine to test extractIconEx. It now calls addIcon(extractIcon()) then extractIconEx() so you can see the difference between the two calls. Any problems or suggestions are always welcome. Chris cafromsw at yahoo.com --paste into win32lib.ew-------------- -- Version 2003.01.12a CMA -- Routines to extract both large (32x32) and small (16x16) icons from .ico, .dll and .exe files -- for use in ListViews that need both sizes. Can also be used as a replacement for -- NewIco &= addIcon(extractIcon({"shell32.dll",1})) -- Example: -- NewIco &= extractIconEx({"shell32.dll", 1}) -- both examples return an index to the image list for use in ListViews etc. -- can be used as a replacement for or in conjuction with addIcon(extractIcon()) global constant xExtractIconEx = registerw32Function(shell32, "ExtractIconEx", {C_POINTER, C_INT, C_POINTER, C_POINTER, C_INT}, C_INT) --global function extractIcon( sequence Filename ) -- REM'd by CMA 1.10.03 global function extractIconEx( sequence Filename ) -- added by CMA 1.10.03 atom icon -- REM'd by CMA 1.12.03 integer lIdx atom lgico, smico -- added by CMA 1.10.03 object hIcon -- added by CMA 1.12.03 lIdx = 0 if length(Filename) > 0 then if sequence(Filename[1]) then lIdx = Filename[2]-1 Filename = Filename[1] end if end if lgico = acquire_mem(0, Long) -- added by CMA 1.10.03 smico = acquire_mem(0, Long) -- added by CMA 1.10.03 hIcon = w32Func( xExtractIconEx, {Filename, lIdx, lgico, smico, 1} ) -- added by CMA 1.12.03 if hIcon > 0 then -- added by CMA 1.12.03 ILAddIcon( ILlarge, peek4u(lgico) ) -- added by CMA 1.10.03 ILAddIcon( ILsmall, peek4u(smico) ) -- added by CMA 1.10.03 ilicon_list &= hIcon -- added by CMA 1.12.03 end if -- added by CMA 1.10.03 release_mem(lgico) -- added by CMA 1.10.03 release_mem(smico) -- added by CMA 1.10.03 return length(ilicon_list) -- added by CMA 1.12.03 --icon = w32Func( xExtractIcon, {0, Filename, lIdx} ) -- REM'd by CMA 1.10.03 --return icon -- REM'd by CMA 1.10.03 end function --end of extractIconEx()----------------- --test program for extractIconEx()------ include win32lib.ew constant Win1 = createEx( Window, "LV Test", 0, Default, Default, 320, 350, 0, 0) constant LV1 = createEx( ListView, {"Column 1"}, Win1, 4, 10, 300, 150, or_all({LVS_REPORT,LVS_SHOWSELALWAYS}), 0) constant LV2 = createEx( ListView, {"Column 1"}, Win1, 4, 170, 300, 150, or_all({LVS_ICON,LVS_SHOWSELALWAYS}), 0) with trace object OK OK = setLVInsert(1) -- append to end of list seq sq sq = {} seq NewIco NewIco = {} NewIco &= addIcon(extractIcon({"shell32.dll",1})) NewIco &= extractIconEx({"shell32.dll", 1}) NewIco &= addIcon(extractIcon("disks04.ico")) NewIco &= extractIconEx("disks04.ico") NewIco &= addIcon(extractIcon({"shell32.dll",2})) NewIco &= extractIconEx({"shell32.dll", 2}) for i = 1 to length(NewIco) do OK = addLVItem(LV1, NewIco[i], "test line" & sprint(i)) sq = append(sq, {"test line" & sprint(i)}) end for loadLVInfo(LV2, sq) WinMain(Win1, Normal) --- Dan Moyer <DANIELMOYER at prodigy.net> wrote: > > Chris, > > You might want to copy the code you put at your > website directly into a > posting here; when I tried to copy it from your > webpage into a file, it > mysteriously dropped the "less than" symbol from the > line: > " if length(Filename) > 0 then", > even though it copied it *here* just fine. Not sure > if anything else gets > mangled or not. > > Dan Moyer > > > ----- Original Message ----- > From: <cafromsw at yahoo.com> > To: "EUforum" <EUforum at topica.com> > Sent: Friday, January 10, 2003 4:55 PM > Subject: win32lib, LV's and icons > > > > Thanks to input form the list I was able to solve > my > > ListView icon problem. It turns out that > extractIcon > > will only pull one icon from an .ico, .dll or .exe > at > > a time. It then resizes that icon either up or > down > > to make it fit the iconLarge and iconSmall > imageLists. > > This is fine for some .ico files, but in .dll's, > > namely shell32.dll the icons are grouped. Group > > 1(one) may have a 32x32, 16x16, and 48x48 icon in > 16 > > colors and again in 256 colors. After spending > hours > > browsing around the MSDN website I found that > > extractIconEx will pull both a small 16x16 and a > large > > 32x32 icon for a given group index, at the same > time. > > > > > > Since there are already iconLarge and iconSmall > > imageLists in win32lib and the ListView will > display > > the right size depending on its state; LVS_REPORT, > > LVS_ICON etc. all I had to do was put the correct > icon > > in the correct imageList. > > > > After many more hours figuring out how to use and > call > > extractIconEx I made a modified version of > > extractIcon. > > idx = extractIconEx({"shell32.dll", 1}) > > It basically calls extractIconEx and addIcon at > the > > same time and returns the index to the last icon > > loaded. That index can then be used in addLVItem > just > > as normal. > > This is that same as calling > > idx = addIcon(extractIcon({"shell32.dll", 1})) > except > > that a large and small icon get added to the image > > list. > > I haven't played with TreeViews so I don't know if > it > > has any relevence or not. I have just tested it > on a > > couple of listViews > > > > I don't know if this list accepts attachments so > here > > is a link to the code > > http://home.attbi.com/~sea.star/code/lvextras.ew > > I took the whole thing and dropped it into > win32lib.ew > > because it calls routines already there and I > wasn't > > sure how to access them externaly. > > This is my first time digging into the Windows API > or > > messing with win32lib, if there are problems or > > mistakes please let me know. If it works for > anyone > > else I would be interested in hearing that as > well. > > If the win32lib people want to implement these > ideas > > in someway that's ok as well. Thanks. Chris > cafromsw at yahoo.com <snip> > > > >
4. Re: win32lib, LV's and icons
- Posted by cafromsw at yahoo.com Jan 13, 2003
- 516 views
I have just found out that my createIconEx() routine isn't working under Win98. I have tested it on WinME and on WinXP, and it seems to run ok on those platforms. As soon as I get a system loaded with 98 I will try to figure out and fix the problem. Chris cafromsw at yahoo.com --- cafromsw at yahoo.com wrote: > > Wolf pointed out to me that I was incorrectly use > peek4signed when I should have been using > peek4unsigned which could have caused some problems > with error checking, thanks. I also realized that > my > extractIconEx didn't cohabitate with win32libs > addIcon(extractIcon()) pair. I have slightly > rewritten the routine to take both of these things > into account. It can still be found here; > http://home.attbi.com/~sea.star/code/lvextras.ew > I have converted the tabs to spaces so it should > copy > better now, or a right-click save would work. As > before it need to be pasted into win32lib.ew. I will > also paste it into this post per Dan's suggestion. > Yahoo mail has a really narrow text box for writing > emails so it breaks the lines in wierd places. I > have > also rewritten the routine to test extractIconEx. > It > now calls addIcon(extractIcon()) then > extractIconEx() > so you can see the difference between the two calls. > > Any problems or suggestions are always welcome. > Chris > cafromsw at yahoo.com > > --paste into win32lib.ew-------------- > -- Version 2003.01.12a CMA > -- Routines to extract both large (32x32) and small > (16x16) icons from .ico, .dll and .exe files > -- for use in ListViews that need both sizes. Can > also be used as a replacement for > -- NewIco &= addIcon(extractIcon({"shell32.dll",1})) > -- Example: > -- NewIco &= extractIconEx({"shell32.dll", 1}) > -- both examples return an index to the image list > for > use in ListViews etc. > -- can be used as a replacement for or in conjuction > with addIcon(extractIcon()) > > > global constant > xExtractIconEx = registerw32Function(shell32, > "ExtractIconEx", {C_POINTER, C_INT, C_POINTER, > C_POINTER, C_INT}, C_INT) > > --global function extractIcon( sequence Filename ) > > -- REM'd by CMA 1.10.03 > global function extractIconEx( sequence Filename ) > > -- added by CMA 1.10.03 > atom icon > > -- REM'd by CMA 1.12.03 > integer lIdx > > atom lgico, smico > > -- added by CMA 1.10.03 > object hIcon > > -- added by CMA 1.12.03 > > lIdx = 0 > if length(Filename) > 0 then > if sequence(Filename[1]) then > lIdx = Filename[2]-1 > Filename = Filename[1] > end if > end if > > lgico = acquire_mem(0, Long) > > -- added by CMA 1.10.03 > smico = acquire_mem(0, Long) > > -- added by CMA 1.10.03 > hIcon = w32Func( xExtractIconEx, {Filename, lIdx, > lgico, smico, 1} ) -- added by CMA 1.12.03 > if hIcon > 0 then > > -- added by CMA 1.12.03 > ILAddIcon( ILlarge, peek4u(lgico) ) > > -- added by CMA 1.10.03 > ILAddIcon( ILsmall, peek4u(smico) ) > > -- added by CMA 1.10.03 > ilicon_list &= hIcon > > -- added by CMA 1.12.03 > end if > > -- added by CMA 1.10.03 > release_mem(lgico) > <snip>
5. Re: win32lib, LV's and icons
- Posted by cafromsw at yahoo.com Jan 14, 2003
- 466 views
Update; I have just tested extractIconEx() on a Win98 2nd edition system and it seems to work just fine. I haven't been able to test on Win98 1st edition. I think that there might be some problems if font or icon sizes have been changed markedly from the Windows defaults. Other than that most people should see improved results though. Chris cafromsw at yahoo.com --- cafromsw at yahoo.com wrote: > > I have just found out that my extractIconEx() routine > isn't working under Win98. I have tested it on > WinME > and on WinXP, and it seems to run ok on those > platforms. As soon as I get a system loaded with 98 > I > will try to figure out and fix the problem. Chris > cafromsw at yahoo.com > > --- cafromsw at yahoo.com wrote: > > > > Wolf pointed out to me that I was incorrectly use > > peek4signed when I should have been using > > peek4unsigned which could have caused some > problems > > with error checking, thanks. I also realized that > > my > > extractIconEx didn't cohabitate with win32libs > > addIcon(extractIcon()) pair. I have slightly > > rewritten the routine to take both of these things > > into account. It can still be found here; > > http://home.attbi.com/~sea.star/code/lvextras.ew > > I have converted the tabs to spaces so it should > > copy > > better now, or a right-click save would work. As > > before it need to be pasted into win32lib.ew. I > will > > also paste it into this post per Dan's suggestion. > > > Yahoo mail has a really narrow text box for > writing > > emails so it breaks the lines in wierd places. I > > have > > also rewritten the routine to test extractIconEx. > > It > > now calls addIcon(extractIcon()) then > > extractIconEx() > > so you can see the difference between the two > calls. > > > > Any problems or suggestions are always welcome. > > Chris > > cafromsw at yahoo.com > > > > --paste into win32lib.ew-------------- > > -- Version 2003.01.12a CMA > > -- Routines to extract both large (32x32) and > small > > (16x16) icons from .ico, .dll and .exe files > > -- for use in ListViews that need both sizes. Can > > also be used as a replacement for > > -- NewIco &= > addIcon(extractIcon({"shell32.dll",1})) > > -- Example: > > -- NewIco &= extractIconEx({"shell32.dll", 1}) > > -- both examples return an index to the image list > > for > > use in ListViews etc. > > -- can be used as a replacement for or in > conjuction > > with addIcon(extractIcon()) > > > > > > global constant > > xExtractIconEx = registerw32Function(shell32, > > "ExtractIconEx", {C_POINTER, C_INT, C_POINTER, > > C_POINTER, C_INT}, C_INT) > > > > --global function extractIcon( sequence Filename ) > > > > > -- REM'd by CMA 1.10.03 > > global function extractIconEx( sequence Filename ) > > > > > -- added by CMA 1.10.03 > > atom icon > > > > > -- REM'd by CMA 1.12.03 > > integer lIdx > > > > atom lgico, smico > > > > > -- added by CMA 1.10.03 > > object hIcon > > > > > -- added by CMA 1.12.03 > > > > lIdx = 0 > > if length(Filename) > 0 then > > if sequence(Filename[1]) then > > lIdx = Filename[2]-1 > > Filename = Filename[1] > > end if > > end if > > > > lgico = acquire_mem(0, Long) > <snip> > > > >