Shoutbox

Cannot CreateChildWnd - Printable Version

-Shoutbox (https://shoutbox.menthix.net)
+-- Forum: MsgHelp Archive (/forumdisplay.php?fid=58)
+--- Forum: Messenger Plus! for Live Messenger (/forumdisplay.php?fid=4)
+---- Forum: Scripting (/forumdisplay.php?fid=39)
+----- Thread: Cannot CreateChildWnd (/showthread.php?tid=61462)

Cannot CreateChildWnd by mathieumg on 06-25-2006 at 11:36 PM

I would like to know why this works:

code:
var WndManageFiles = null;
var WndAddFile = null;

WndManageFiles = MsgPlus.CreateWnd("GUI.xml", "WndManageFiles");
WndAddFile = MsgPlus.CreateWnd("GUI.xml", "WndAddFile");


whereas, this does not:

code:
var WndManageFiles = null;
var WndAddFile = null;

WndManageFiles = MsgPlus.CreateWnd("GUI.xml", "WndManageFiles");
WndAddFile = MsgPlus.CreateChildWnd("WndManageFiles", "GUI.xml", "WndAddFile", 100, 40, true);


Debugging console:

Error : Type mismatch.
Line : 22. Code : -2146828275.

Is there something that must be done differently in the .xml file?

Thank you in advance!
RE: Cannot CreateChildWnd by mickael9 on 06-26-2006 at 12:54 AM

code:
var WndManageFiles = null;
var WndAddFile = null;

WndManageFiles = MsgPlus.CreateWnd("GUI.xml", "WndManageFiles");
WndAddFile = MsgPlus.CreateChildWnd(WndManageFiles, "GUI.xml", "WndAddFile", 100, 40, true);
:D
RE: Cannot CreateChildWnd by mathieumg on 06-26-2006 at 01:05 AM

No error, but no window... :s


RE: Cannot CreateChildWnd by mickael9 on 06-26-2006 at 01:17 AM

Can you paste the xml file ?


RE: Cannot CreateChildWnd by mathieumg on 06-26-2006 at 01:25 AM

Did the test with that sample window, same behaviour:

code:
    <Window Id="WndTest" Version="1">
        <Attributes>
            <Caption>Example</Caption>
        </Attributes>
       
        <TitleBar>
            <Title>
                <Text>Example</Text>
            </Title>
        </TitleBar>
       
        <Position Width="180" Height="75"/>
        <DialogTmpl/>
    </Window>


RE: Cannot CreateChildWnd by matty on 06-26-2006 at 01:25 AM

code:
    function LoadChildWindows(Wnd){
    /*
        Load Child Windows
    */
        WndGeneral = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndGeneral", 153, 40, true);
            /*                Set option values                */
            with (WndGeneral){
                Combo_AddItem('cboFileType', 'BMP', 1);
                Combo_AddItem('cboFileType', 'GIF', 2);
                Combo_AddItem('cboFileType', 'JPG', 3);
                Combo_AddItem('cboFileType', 'PNG', 4);
                SetControlText('txtFilename', strFileName);
                Combo_SetCurSel('cboFileType', lngFileType-1);
                SetControlText('txtTimeDelay', lngTimeDelay);
                Button_SetCheckState('chkPreviewSave', blnPreviewSave);
                Button_SetCheckState('chkPreviewSend', blnPreviewSend);
                Button_SetCheckState('chkCopyImage', blnCopyToClipboard);
                Button_SetCheckState('chkShowSaveConfirm', blnShowSaveConfirmation);
                Button_SetCheckState('chkDeleteScreenshots', blnDeleteSessionImages);
                Button_SetCheckState('chkTimeDelay', blnWarnTimeDelay);
                Button_SetCheckState('txtWarnTimeDelay', lngWarnTimeDelay);
                SetControlText('txtSaveDirectory', strSaveDirectory);
            }
       
        WndAreas = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndAreas", 153, 40, false);
        WndOverlay = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndOverlay", 153, 40, false);
        WndCountdown = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndCountdown", 153, 40, false);
        WndWebcam = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndWebcam", 153, 40, false);
        WndAdvanced = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndAdvanced", 153, 40, false);
            /*                Set option values                */
            with (WndAdvanced){
                SetControlText('txtServer', ftpServer);
                SetControlText('txtLogin', ftpLogin);
                SetControlText('txtPassword', ftpPassword);
                SetControlText('txtPort', ftpPort);
                SetControlText('txtDirectory', ftpPath);
            }
       
        WndFTPUpload = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndFTPUpload", 153, 40, false);
            /*                Set option values                */
            with (WndAdvanced){
                Button_SetCheckState('chkStripPlusCodes', blnStripPlusCodes);
                Button_SetCheckState('chkOriginalWinFocus', blnOriginalWinFocus);
                Button_SetCheckState('chkHideUsers', blnHideUsers);
                Button_SetCheckState('chkAltSending', blnDefaultSendCommand);
                Interop.Call('user32', 'EnableWindow', GetControlHandle('txtAltSending'), blnDefaultSendCommand);
            }
        WndCurrentWnd = WndGeneral;
   
    /*
        Click Default General Button
    */
        Wnd.SendControlMessage('RadGeneral', 256 , 32, 0);
        Wnd.SendControlMessage('RadGeneral', 257 , 32, 0);
       
        WndGeneral.Visible = true;
       
        return Wnd;
    }

    function OnEvent_MenuClicked(sMenuId, nLocation, ChatWnd){
        if(sMenuId == "preferences"){
            if (WndPref){
                Interop.Call('user32', 'SetForegroundWindow', WndPref.Handle);
            }else{
                WndPref = LoadChildWindows(MsgPlus.CreateWnd("ss4_gui.xml", "WndPref"));
            }
       
        }

    }

As well ChildWnd XML should look like this

code:
    <Window Id="WndOverlay" Version="1">
        <ChildTmpl/>
        <Position Width="243" Height="193"/>
        <Controls>
            <Control xsi:type="StaticControl" Id="lblVersion3">
                <Position Top="5" Width="100" Left="5" Height="15" />
                <Caption>Overlay Text</Caption>
                <Color><GlobalColor>green</GlobalColor></Color>
                <Font><Bold>true</Bold><Size>12</Size></Font>
            </Control>
            <Control xsi:type="StaticControl" Id="lblTitle">
                <Position Top="25" Width="100" Left="15" Height="15" />
                <Caption>To be later incorporated</Caption>
            </Control>
        </Controls>
    </Window>

Thats what I use for SS4
RE: Cannot CreateChildWnd by mickael9 on 06-26-2006 at 01:29 AM

code:
    <Window Id="WndTest" Version="1">
        <Attributes>
            <Caption>Example</Caption>
        </Attributes>
       
        <TitleBar>
            <Title>
                <Text>Example</Text>
            </Title>
        </TitleBar>
       
        <Position Width="180" Height="75"/>
        <DialogTmpl/>
    </Window>


code:
var WndManageFiles = null;
var WndAddFile = null;

WndManageFiles = MsgPlus.CreateWnd("GUI.xml", "WndManageFiles");
WndAddFile = MsgPlus.CreateChildWnd(WndManageFiles, "GUI.xml", "WndAddFile", 100, 40, true);

RE: Cannot CreateChildWnd by mathieumg on 06-26-2006 at 01:30 AM

Sorry, I had modified the line in my script but not here, I did that simple WndTest as a proof of concept.


RE: Cannot CreateChildWnd by matty on 06-26-2006 at 01:32 AM

Post the script contents and the xml contents and let me see what your doing.


RE: Cannot CreateChildWnd by mickael9 on 06-26-2006 at 01:34 AM

Messenger Plus ! Live Documentation :

quote:
WindowId
[string] Unique identifier of the window to create. A window with the same identifier has to be found in the XML file for the function to succeed.

RE: Cannot CreateChildWnd by mathieumg on 06-26-2006 at 01:37 AM

Script

code:
var WndManageFiles = null;
var WndAddFile = null;

WndManageFiles = MsgPlus.CreateWnd("GUI.xml", "WndManageFiles");
WndAddFile = MsgPlus.CreateChildWnd(WndManageFiles, "GUI.xml", "WndTest", 100, 40, true);


XML

code:
<Window Id="WndTest" Version="1">
<Attributes>
<Caption>Example</Caption>
</Attributes>

<TitleBar>
<Title>
<Text>Example</Text>
</Title>
</TitleBar>

<Position Width="180" Height="75"/>
<DialogTmpl/>
</Window>


RE: Cannot CreateChildWnd by mickael9 on 06-26-2006 at 01:42 AM

Where is the WndManageFiles window ? :p


RE: Cannot CreateChildWnd by matty on 06-26-2006 at 01:44 AM

quote:
Originally posted by mathieumg
Script

code:
...

XML

code:
...


The point of the CreateChildWnd is to create One window then create another inside of it instead of having to use the SetParent API. Now what you need to do is first create your WndManageFiles which has the <DialogTmpl /> Template then you create your WndText window which has the <ChildTmpl />.


To show you a bit easier

XML
code:
    <Window Id="WndPref" Version="1">
        <Attributes>
            <Caption>Screenshot Sender</Caption>
            <SetForeground>True</SetForeground>
        </Attributes>
        <TitleBar>
            <Title><Text>Preferences</Text></Title>
        </TitleBar>
        <Position Width="350" Height="250"/>       
        <Elements>
            <Element xsi:type="ImageElement" Id="imgSidebar">
                <Position Top="121" Left="30" />
                <Image><Name>preferences-side-messenger</Name></Image>
            </Element>
            <Element xsi:type="FigureElement" Id="mnuFiller">
                <Position Top="102" Left="0" Width="96" Height="150"/>
                <Figure><Rectangle/></Figure>
                <Fill>
                    <LinearGradient Angle="0">
                        <Color1><BaseColor><Transparency>100</Transparency></BaseColor></Color1>
                        <Color2><BaseColor><Transparency>0</Transparency></BaseColor></Color2>
                    </LinearGradient>
                </Fill>
            </Element>
            <Element xsi:type="LineElement" Id="LnVerticalLine">
                <Position Top="0" Left="96" Width="0" Height="210">
                    <Anchor Horizontal="LeftRightFixed"/>
                </Position>
                <Size>1</Size>
                <Color><Red>195</Red><Green>195</Green><Blue>195</Blue></Color>
            </Element>               
        </Elements>
        <DialogTmpl>
            <BottomBar Style="Plain">
                <LeftControls>
                    <Control xsi:type="ButtonControl" Id="BtnAbout">
                        <Position Left="0" Top="0" Width="50"/>
                        <Caption>About...</Caption>
                    </Control>
                </LeftControls>
                <RightControls>
                    <Control xsi:type="ButtonControl" Id="BtnOk">
                        <Position Left="0" Top="0" Width="50"/>
                        <Caption>OK</Caption>
                    </Control>
                    <Control xsi:type="ButtonControl" Id="BtnCancel">
                        <Position Left="0" Top="0" Width="50"/>
                        <Caption>Close</Caption>
                    </Control>
                    <Control xsi:type="ButtonControl" Id="BtnApply">
                        <Position Left="0" Top="0" Width="50"/>
                        <Caption>Apply</Caption>
                    </Control>
                </RightControls>
            </BottomBar>
        </DialogTmpl>
       
        <Controls>
        </Controls>
    </Window>


    <Window Id="WndOverlay" Version="1">
        <ChildTmpl/>
        <Position Width="243" Height="193"/>
        <Controls>
            <Control xsi:type="StaticControl" Id="lblVersion3">
                <Position Top="5" Width="100" Left="5" Height="15" />
                <Caption>Overlay Text</Caption>
                <Color><GlobalColor>green</GlobalColor></Color>
                <Font><Bold>true</Bold><Size>12</Size></Font>
            </Control>
            <Control xsi:type="StaticControl" Id="lblTitle">
                <Position Top="25" Width="100" Left="15" Height="15" />
                <Caption>To be later incorporated</Caption>
            </Control>
        </Controls>
    </Window>


Script

code:
    function OnEvent_MenuClicked(sMenuId, nLocation, ChatWnd){
        if(sMenuId == "preferences"){
            if (WndPref){
                Interop.Call('user32', 'SetForegroundWindow', WndPref.Handle);
            }else{
                WndPref = LoadChildWindows(MsgPlus.CreateWnd("ss4_gui.xml", "WndPref"));
            }
       
        }
        }

    function LoadChildWindows(Wnd){
    /*
        Load Child Windows
    */
        WndGeneral = MsgPlus.CreateChildWnd(Wnd, "ss4_gui.xml", "WndGeneral", 153, 40, true);

        WndCurrentWnd = WndGeneral;
   
    /*
        Click Default General Button
    */
        Wnd.SendControlMessage('RadGeneral', 256 , 32, 0);
        Wnd.SendControlMessage('RadGeneral', 257 , 32, 0);
       
        return Wnd;
    }


I hope this makes a bit more sense on how to do it.
RE: Cannot CreateChildWnd by mathieumg on 06-26-2006 at 01:50 AM

quote:
Originally posted by mathieumg
Is there something that must be done differently in the .xml file?


In the first post of the thread :p

Will test now.
RE: Cannot CreateChildWnd by matty on 06-26-2006 at 02:22 AM

Here is an example of how to do it.


RE: Cannot CreateChildWnd by mathieumg on 06-26-2006 at 02:39 AM

Thank you for the demonstration! I guess it will help the people that use the forums search function too (are there any? :p)

I think I misunderstood what a WindowChild actually was ^^ Still good to know though If I ever need it.