Um dies zu tun, müssen Sie in den Code für Ihre Bootstrapper Anwendung (WixStdBootstrapperApplication.cpp) vertiefen.
Glücklicherweise basiert dies auf der WixStdBootstrapperApplication, die ich seit einiger Zeit kenne.
Als erstes müssen Sie die EulaAcceptCheckbox auf die Seite mit der aktuellen Eula zurücksetzen. Wenn Sie die aktivierten/deaktivierten Benutzeroberflächenelemente steuern möchten, müssen Sie dies innerhalb des Codes der Bootstrapper-Anwendung tun. Die BA besitzt die Benutzeroberfläche.
Jetzt müssen wir das Verhalten dieser EulaAcceptCheckbox so ändern, dass sie den OptionsButton aktiviert/deaktiviert.
Im WndProc werden alle Nachrichten verarbeitet, die der Benutzer beim Klicken auf eine Schaltfläche oder beim Scrollen oder Ausführen von Aktionen generiert. Unter WM_COMMAND haben wir einen Schalter basierend auf LOWORD (wParam), die die ID des Steuerelements ist, das die Nachricht ausgelöst hat.
Suchen Sie "WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX" und sehen Sie, dass es pBA-> OnClickAcceptCheckbox() aufruft;
Hier ist die Methode
void OnClickAcceptCheckbox()
{
BOOL fAcceptedLicense = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense);
}
Sieht super einfach nicht wahr? Hier müssen Sie nur WIXSTDBA_CONTROL_INSTALL_BUTTON in WIXSTDBA_CONTROL_OPTIONS_BUTTON ändern
Wir müssen auch die Schaltfläche Optionen auf Standard deaktiviert deaktivieren. Dazu müssen wir in „OnChangeState“ gehen und suchen Sie nach, ob für 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);
}
}
Wir müssen dieser Block aktualisieren
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);
}
}
Hier werden wir die erhöhten Sachen entfernt, da diese auf dem Installations geht und aktivieren/deaktivieren Sie stattdessen die Optionsschaltfläche, je nachdem, ob sie im Design definiert ist und ob das Annehmen-Kontrollkästchen aktiviert ist oder nicht.
Als nächstes müssen Sie einen Weg hinzufügen, um das neue OptionsPage-Kontrollkästchen zu finden.
Sie sollten eine ENUM in Ihrer CPP-Datei haben
enum WIXSTDBA_CONTROL
Es sollte in Kontrollen auf den Seiten bestellt werden. Hier müssen Sie einen neuen Eintrag für die neue Optionen Checkbox Steuerelement hinzuzufügen, vielleicht WIXSTDBA_CONTROL_OPTIONS_CHECKBOX
Unterhalb dieser Enum Sie eine 2-D-Array haben werden
static THEME_ASSIGN_CONTROL_ID vrgInitControls[] =
Sie erhalten eine neue hinzufügen müssen Eingabe hier, das ist eingefügt an der gleichen Stelle, die Sie in Ihr enum eingefügt. Das Array eingefügte Element sollte so aussehen
{ WIXSTDBA_CONTROL_OPTIONS_CEHCKBOX, L"OptionsCheckbox" }, //The string should match the Name of the checkbox in the theme xml.
Jetzt müssen wir einen Weg Mitteilungen dieses Control Griff. Gehen Sie zurück zu WndProc und fügen Sie einen neuen Fall an den Schalter unter WM_COMMAND sollte es
case WIXSTDBA_CONTROL_OPTIONS_CHECKBOX:
pBA->OnClickOptionsCheckbox();
return 0;
nun eine OnClickOptionsCheckbox Methode Ihre Bootstrap-Anwendung sein hinzufügen ebenso wie die OnClickAcceptCheckbox()
void OnClickOptionsCheckbox()
{
BOOL fAccepted = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_CHECKBOX);
ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAccepted);
}
Schließlich brauchen wir die llElevated Sachen fügen wir aus dem OnChangeState WIXSTDBA_PAGE_INSTALL Fall WIXSTDBA_PAGE_OPTIONS entfernt und stellen Sie auch den Standardstatus der Schaltfläche Installieren
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);
}
}
Wird zu
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);
}
}
umziehen Es gibt ein paar Dinge, die ich immer noch mit dieser Implementierung drehen würde, aber ich würde versuchen, sehr empfehlen, durch zu gehen, was die Bootstrap-Anwendung tut und wie es funktioniert.
Wenn Sie das Verhalten der Benutzeroberfläche während der Installation ändern möchten, müssen Sie sich hier mit dem Code vertraut machen. Sie können neue Seiten hinzufügen, Steuerelemente hinzufügen und Variablen zusammen mit anderen Elementen festlegen.
Wenn dies scheint eine Menge Arbeit (herauszufinden, alles aus mir selbst war definitiv) zu prüfen, ob Sie wirklich brauchen diese Art von Verhalten über das Standardverhalten eines der Standard-Wixstdba Themen.
Oh, das ist eine lustige Sache zu implementieren. Es gibt eigentlich viel zu tun, um das zu erreichen. Ich werde versuchen, eine gute Antwort auf meine Mittagspause später heute aufzuschreiben, –