user interface - Interfaz de usuario de la aplicación Bootstrapper: cómo moverse entre las páginas
user-interface wix (1)
Estoy escribiendo una aplicación Bootstrapper y quiero crear la interfaz de usuario para ella utilizando la aplicación WixStandardBootstrapper. Quiero la interfaz de usuario tal que en la primera página (página de instalación), veo el EULA estándar y una casilla de verificación que dice Acepto y un botón para avanzar en la página siguiente (página Opciones) que debería habilitarse solo después de seleccionar la casilla . En la siguiente página, lista un texto y quiero tener otra casilla de verificación, que de nuevo dice "Acepto" y un botón para instalar, que se activa solo después de que selecciono la casilla de verificación.
<Page Name="Install">
<Text X="154" Y="12" Width="-65" Height="21" DisablePrefix="yes">#(loc.Title)</Text>
<Image X="120" Y="20" Width="54" Height="325" ImageFile="logo.png"/>
<Richedit Name="EulaRichedit" X="154" Y="60" Width="-21" Height="-76" TabStop="yes" FontId="0" HexStyle="0x800000" />
<Checkbox Name="OptionsCheckbox" X="-11" Y="-41" Width="246" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">I accept.</Checkbox>
<Button Name="WelcomeCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
<Button Name="OptionsButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" Text="Proceed" HideWhenDisabled="yes">Next</Button>
</Page>
<Page Name="Options">
<Text X="185" Y="11" Width="-11" Height="32" FontId="1">#(loc.OptionsHeader)</Text>
<Image X="0" Y="0" Width="177" Height="325" ImageFile="logoside.png"/>
<Text X="180" Y="61" Width="-11" Height="17" FontId="3">Some text.</Text>
<Checkbox Name="EulaAcceptCheckbox" X="180" Y="251" Width="246" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.OptionsButton)</Checkbox>
<Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" Text="Proceed">#(loc.InstallInstallButton)</Button>
<Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
</Page>
La segunda página (página de Opciones) funciona de acuerdo con lo que necesito: la casilla de verificación y el botón Instalar están deshabilitados, y solo se habilita después de seleccionar la casilla de verificación. Pero en la primera página (página de instalación) no puedo hacerlo funcionar. El botón está habilitado incluso si la casilla de verificación no está marcada. Intenté diferentes opciones para Checkbox y Button Name, pero no puedo hacerlo funcionar. ¿Qué puedo hacer para que funcione? Además, si tiene algún enlace para cualquier documentación sobre las diferentes opciones, por favor comparta. Encontré el archivo de ayuda con el esquema de Thmutil pero no enumera las diversas opciones para Casillas de verificación o Botones.
Cualquier sugerencia bienvenida No dude en preguntar si algo no está claro. Gracias por su ayuda con anticipación.
Para hacerlo, deberá profundizar en el código de su aplicación bootstrapperapplication (WixStdBootstrapperApplication.cpp).
Afortunadamente, estás basando esto en WixStdBootstrapperApplication, y he tardado bastante tiempo en conocerlo.
Lo primero que debe hacer es volver a colocar la EulaAcceptCheckbox en la página con el Eula real sobre ella. Cuando vaya a controlar que los elementos de la interfaz de usuario estén habilitados / deshabilitados, debe hacer esto desde el código de la aplicación de arranque. El BA posee la interfaz de usuario.
Ahora tenemos que cambiar el comportamiento de ese EulaAcceptCheckbox para que active / desactive el OptionButton.
En WndProc es donde manejamos todos los mensajes generados por el usuario cuando hace clic en un botón o se desplaza o hace cualquier cosa. Bajo WM_COMMAND tenemos un interruptor basado en LOWORD (wParam) que es el ID del control que levantó el mensaje.
Ubique "WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX" y vea que llama a pBA-> OnClickAcceptCheckbox ();
Aquí está el método
void OnClickAcceptCheckbox()
{
BOOL fAcceptedLicense = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense);
}
Se ve súper simple, ¿verdad? Aquí solo tiene que cambiar WIXSTDBA_CONTROL_INSTALL_BUTTON al WIXSTDBA_CONTROL_OPTIONS_BUTTON
También debemos configurar el botón Opciones para que esté desactivado de manera predeterminada. Para hacer esto vamos a "OnChangeState" y buscamos if para WIXSTDBA_PAGE_INSTALL
if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) // on the "Install" page, ensure the install button is enabled/disabled correctly.
{
LONGLONG llElevated = 0;
if (m_Bundle.fPerMachine)
{
BalGetNumericVariable(WIXBUNDLE_VARIABLE_ELEVATED, &llElevated);
}
ThemeControlElevates(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, (m_Bundle.fPerMachine && !llElevated));
// If the EULA control exists, show it only if a license URL is provided as well.
if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK))
{
BOOL fEulaLink = (m_sczLicenseUrl && *m_sczLicenseUrl);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK, fEulaLink);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, fEulaLink);
}
BOOL fAcceptedLicense = !ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense);
// If there is an "Options" page, the "Options" button exists, and it hasn''t been suppressed, then enable the button.
BOOL fOptionsEnabled = m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] && ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_BUTTON) && !m_fSuppressOptionsUI;
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_BUTTON, fOptionsEnabled);
// Show/Hide the version label if it exists.
if (m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] && ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_VERSION_LABEL) && !m_fShowVersion)
{
ThemeShowControl(m_pTheme, WIXSTDBA_CONTROL_VERSION_LABEL, SW_HIDE);
}
}
Necesitamos actualizar este bloque para que sea
if (m_rgdwPageIds[WIXSTDBA_PAGE_INSTALL] == dwNewPageId) // on the "Install" page, ensure the install button is enabled/disabled correctly.
{
// If the EULA control exists, show it only if a license URL is provided as well.
if (ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK))
{
BOOL fEulaLink = (m_sczLicenseUrl && *m_sczLicenseUrl);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_LINK, fEulaLink);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX, fEulaLink);
}
BOOL fAcceptedLicense = !ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX) || ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
// If there is an "Options" page, the "Options" button exists, and it hasn''t been suppressed, then enable the button.
BOOL fOptionsEnabled = m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] && ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_BUTTON) && !m_fSuppressOptionsUI;
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_BUTTON, fOptionsEnabled & fAcceptedLicense);
// Show/Hide the version label if it exists.
if (m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] && ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_VERSION_LABEL) && !m_fShowVersion)
{
ThemeShowControl(m_pTheme, WIXSTDBA_CONTROL_VERSION_LABEL, SW_HIDE);
}
}
Aquí quitamos las cosas elevadas ya que eso va en el botón de instalación y en su lugar habilita / deshabilita el botón de opciones dependiendo de si está definido en el tema y si la casilla de verificación de aceptar está marcada o no.
A continuación, deberá agregar una forma de ubicar su nueva casilla de verificación de OptionsPage.
Deberías tener una enumeración en tu archivo cpp
enum WIXSTDBA_CONTROL
Se debe ordenar en controles en las páginas. Aquí deberá agregar una nueva entrada para su nuevo control de casilla de verificación Opciones, tal vez WIXSTDBA_CONTROL_OPTIONS_CHECKBOX
Debajo de esta enumeración tendrás una matriz de 2 d
static THEME_ASSIGN_CONTROL_ID vrgInitControls[] =
Tendrá que agregar una nueva entrada aquí insertada en el mismo lugar que insertó en su enumeración . El elemento de la matriz insertada debería verse así
{ WIXSTDBA_CONTROL_OPTIONS_CEHCKBOX, L"OptionsCheckbox" }, //The string should match the Name of the checkbox in the theme xml.
Ahora necesitamos una forma de manejar los mensajes de este Control. Regrese a WndProc y agregue una nueva caja al conmutador en WM_COMMAND.
case WIXSTDBA_CONTROL_OPTIONS_CHECKBOX:
pBA->OnClickOptionsCheckbox();
return 0;
Ahora agregue un método OnClickOptionsCheckbox a su aplicación de arranque igual que OnClickAcceptCheckbox ()
void OnClickOptionsCheckbox()
{
BOOL fAccepted = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_CHECKBOX);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAccepted);
}
Finalmente, debemos agregar las cosas elevadas que eliminamos del caso de WIXSTDBA_PAGE_INSTALL de OnChangeState a WIXSTDBA_PAGE_OPTIONS y también establecer el estado predeterminado del botón Instalar
else if (m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] == dwNewPageId)
{
HRESULT hr = BalGetStringVariable(WIXSTDBA_VARIABLE_INSTALL_FOLDER, &sczUnformattedText);
if (SUCCEEDED(hr))
{
// If the wix developer is showing a hidden variable in the UI, then obviously they don''t care about keeping it safe
// so don''t go down the rabbit hole of making sure that this is securely freed.
BalFormatString(sczUnformattedText, &sczText);
ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX, sczText);
}
}
Se cambiará a
else if (m_rgdwPageIds[WIXSTDBA_PAGE_OPTIONS] == dwNewPageId)
{
LONGLONG llElevated = 0;
if (m_Bundle.fPerMachine)
{
BalGetNumericVariable(WIXBUNDLE_VARIABLE_ELEVATED, &llElevated);
}
ThemeControlElevates(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, (m_Bundle.fPerMachine && !llElevated));
BOOL fAccepted = !ThemeControlExists(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_CHECKBOX) || !ThemeControlEnabled(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_CHECKBOX) || ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_CHECKBOX);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAccepted);
HRESULT hr = BalGetStringVariable(WIXSTDBA_VARIABLE_INSTALL_FOLDER, &sczUnformattedText);
if (SUCCEEDED(hr))
{
// If the wix developer is showing a hidden variable in the UI, then obviously they don''t care about keeping it safe
// so don''t go down the rabbit hole of making sure that this is securely freed.
BalFormatString(sczUnformattedText, &sczText);
ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_FOLDER_EDITBOX, sczText);
}
}
Hay algunas cosas que todavía cambiaría con esta implementación, pero recomiendo tratar de ver qué hace la aplicación de arranque y cómo funciona.
Si desea cambiar el comportamiento de la IU durante la instalación, deberá familiarizarse con el código aquí. Puede agregar páginas nuevas, agregar controles y establecer variables junto con otras cosas.
Si esto parece mucho trabajo (sin duda, resolver todo esto) considere si realmente necesita este tipo de comportamiento sobre el comportamiento predeterminado de uno de los temas predeterminados de wixstdba.