1. commctrl v6 working
- Posted by prickle Sep 18, 2009
- 1219 views
Hi all.
In the process of developing Nickfrac I have managed to get commctrl.dll version 6 from Win XP to work with Euphoria 3.11 and produced a shiny XP window using the standard methods.
Is this news?
Cheers, Nick.
2. Re: commctrl v6 working
- Posted by prickle Sep 19, 2009
- 1219 views
Okay, nobody's shouting "it's been done" yet.
So what is it that it does do? I'm glad you asked. We have all seen those glossy dialogs and shiny controls those modern programs all have. You know they are there somewhere. Yet when you use Exw to create a window it looks plain old and grey no matter what flags and styles you give it. You may as well be using Win3.1.
This is no way to make impressive software.
Here is one method I found to activate the newer common controls library. Unlike all other system dlls the common controls will not activate the most recent version but will use an old version 5 unless instructed otherwise.
Microsoft alleges it is to increase compatibility, forcing coders to verify operation with the newer controls.
WARNING: This method requires altering your Euphoria executable(s). I would not expect much bad effect from an extra resource but no guarantees. If it is harmless, it may be an idea to throw it in the main Euphoria trunk, as one can still choose to use commctrl v6 or not with the init_commctrl call.
So here is what I did for anybody interested:
I added the following resource to exwc.exe as Type: "24" and Name: "1"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Open.Euphoria.Program" type="win32" /> <description>Euphoria program.</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>I then declare Windows' InitCommonControlsEx:
comctl32 = open_dll("comctl32.dll") iInitCommonControlsEx = define_c_func(comctl32, "InitCommonControlsEx", {C_POINTER}, C_INT),
and make a function with it.
--Initialise Common Controls v6 global procedure init_commctrls(atom controls) atom ptr, ok ptr = allocate(8) poke4(ptr, 8) poke4(ptr + 4, controls) ok = c_func(iInitCommonControlsEx, {ptr}) free(ptr) end procedure
I then call this routine from the WM_CREATE of my main window's callback.
... if iMsg = WM_CREATE then init_commctrls(or_all({ICC_LISTVIEW_CLASSES,...}) ...
And suddenly all my controls are even more windowsy without me needing to do anything else. M$ says this code ought to work with the following Windows and higher: Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
There is a long list of control classes that correspond to many of the new standard windows controls. M$ says:
dwICC The set of bit flags that indicate which common control classes will be loaded from the DLL. This can be a combination of the following values. ICC_ANIMATE_CLASS = #00000080 Load animate control class. ICC_BAR_CLASSES = #00000004 Load toolbar, status bar, trackbar, and tooltip control classes. ICC_COOL_CLASSES = #00000400 Load rebar control class. ICC_DATE_CLASSES = #00000100 Load date and time picker control class. ICC_HOTKEY_CLASS = #00000040 Load hot key control class. ICC_INTERNET_CLASSES = #00000800 Load IP address class. ICC_LINK_CLASS = #00008000 Load a hyperlink control class. ICC_LISTVIEW_CLASSES = #00000001 Load list-view and header control classes. ICC_NATIVEFNTCTL_CLASS = #00002000 Load a native font control class. ICC_PAGESCROLLER_CLASS = #00001000 Load pager control class. ICC_PROGRESS_CLASS = #00000020 Load progress bar control class. ICC_STANDARD_CLASSES = #00004000 Load one of the intrinsic User32 control classes. The user controls include button, edit, static, listbox, combobox, and scrollbar. ICC_TAB_CLASSES = #00000008 Load tab and tooltip control classes. ICC_TREEVIEW_CLASSES = #00000002 Load tree-view and tooltip control classes. ICC_UPDOWN_CLASS = #00000010 Load up-down control class. ICC_USEREX_CLASSES = #00000200 Load ComboBoxEx class. ICC_WIN95_CLASSES = #000000FF Load animate control, header, hot key, list-view, progress bar, status bar, tab, tooltip, toolbar, trackbar, tree-view, and up-down control classes.
I have tried all four combinations of mod/unmod Eu with init/no init code and nothing complains, you just don't get the new controls unless both are present.
Hope this helps someone.
Cheers, Nick.
3. Re: commctrl v6 working
- Posted by ghaberek (admin) Sep 19, 2009
- 1161 views
Okay, nobody's shouting "it's been done" yet.
"It's been done yet." I've done this before with Win32Lib and a .manifest file. I've also translated programs to C and compiled the manifest directly into the executable. Works great!
-Greg
4. Re: commctrl v6 working
- Posted by prickle Sep 19, 2009
- 1142 views
"It's been done yet."
Hehe nobody can say I dont miss a trick. Never mind, I now know more about Windoze than I really care to.
Who has other fun Windowsy tricks? It is hard to tell from one-line descriptions what might have what in the archives, and I have been out of touch for some years.
Cheers, Nick