user interface - बूटस्ट्रैपर एप्लिकेशन UI-पृष्ठों के बीच स्थानांतरित करने के लिए



user-interface wix (1)

मैं एक Bootstrapper एप्लिकेशन लिख रहा हूं और WixStandardBootstrapperApplication का उपयोग करके इसके लिए UI बनाना चाहता हूं। मैं यूआई को इस तरह चाहता हूं कि पहले पृष्ठ पर (पेज इंस्टॉल करें), मैं मानक ईयूएलए और एक चेकबॉक्स देखता हूं जो मुझे स्वीकार करता है और अगले पृष्ठ (विकल्प पृष्ठ) पर आगे बढ़ने के लिए एक बटन है, जो मुझे चेकबॉक्स का चयन करने के बाद ही सक्षम होना चाहिए । अगले पृष्ठ पर, मैं कुछ टेक्स्ट की सूची करता हूं और मुझे दूसरा चेकबॉक्स है, जिस प्रकार से मैं फिर से कहता हूं और इंस्टॉल करने के लिए एक बटन सेट करता हूं जो चेकबॉक्स को चुनने के बाद ही सक्षम हो जाता है

<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>

दूसरा पृष्ठ (विकल्प पृष्ठ) मैं क्या जरूरत के मुताबिक काम कर रहा हूं - चेकबॉक्स और इंस्टॉल करें बटन अक्षम है, और यह चेकबॉक्स चुनने के बाद ही सक्षम हो जाता है। लेकिन पहले पेज पर (पेज इंस्टॉल करें) मैं इसे काम करने में सक्षम नहीं हूं बटन सक्षम है भले ही चेकबॉक्स चेक न हो। मैंने चेकबॉक्स और बटन नाम के लिए विभिन्न विकल्पों की कोशिश की लेकिन मैं इसे काम करने में असमर्थ हूं यह काम करने के लिए मैं क्या कर सकता हूं? इसके अलावा यदि आपके पास विभिन्न विकल्पों के लिए कोई दस्तावेज है तो कृपया साझा करें। मुझे थंबूटिल स्कीमा के साथ मदद फ़ाइल मिली लेकिन यह चेकबॉक्स या बटन के लिए विभिन्न विकल्पों की सूची नहीं है

कोई भी सुझाव आपका स्वागत है अगर कुछ भी स्पष्ट नहीं है तो पूछने के लिए स्वतंत्र महसूस करें आपकी सहायता के लिए अग्रिम धन्यवाद।


ऐसा करने के लिए आपको अपने बूटस्ट्रैपरप्लेक्शन (WixStdBootstrapperApplication.cpp) के लिए कोड में तल्लीन करने की आवश्यकता होगी।

सौभाग्य से आप इसे WixStdBootstrapperApplication के बंद का आधार कर रहे हैं, जो मैंने काफी समय व्यतीत किया है।

सबसे पहले आपको ऐसा करने की ज़रूरत है, उस पर ईला एसिसेप्टकैक्सबॉक्स को वास्तविक युल के साथ पृष्ठ पर वापस डाल दिया गया है। जब आप सक्षम / निष्क्रिय होने वाले UI तत्वों को नियंत्रित करने जा रहे हैं, तो आपको बूटस्ट्रैपर एप्लिकेशन के कोड के भीतर से यह करना होगा बीए के पास यूआई है।

अब हमें उस EulaAcceptCheckbox के व्यवहार को बदलने की आवश्यकता है ताकि वह OptionsButton सक्षम / अक्षम कर सके

WndProc में हम उपयोगकर्ता द्वारा उत्पन्न सभी संदेश जब वे एक बटन पर क्लिक करें या स्क्रॉल या कुछ भी करते हैं संभालते हैं। WM_COMMAND के तहत हमारे पास लोवर्ड (डब्ल्यूपीएआरएम) पर आधारित एक स्विच है जो संदेश को नियंत्रित करने वाले नियंत्रण का आईडी है।

"WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX" का पता लगाएँ और देखें कि यह pBA-> OnClickAcceptCheckbox () कॉल करता है;

यहां विधि है

void OnClickAcceptCheckbox()
{
    BOOL fAcceptedLicense = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX);
    ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAcceptedLicense);
}

सुपर सरल सही लगता है? यहां आपको WIXSTDBA_CONTROL_INSTALL_BUTTON को WIXSTDBA_CONTROL_OPTIONS_BUTTON में बदलना होगा

हमें डिफॉल्ट अक्षम करने के लिए विकल्प बटन सेट करने की भी आवश्यकता है ऐसा करने के लिए हम "ऑन-चेंजस्टेट" में जाएं और 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);
    }
}

हमें इस ब्लॉक को अपडेट करने की आवश्यकता है

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);
    }
}

यहां हमने ऊंचा चीजें हटा दीं, क्योंकि वह इंस्टॉलेशन बटन पर चला जाता है और इसके बजाय विकल्प बटन को सक्षम / अक्षम करता है, इस पर निर्भर करता है कि क्या इसे थीम में परिभाषित किया गया है और अगर चेक चेक बॉक्स को चेक किया गया है या नहीं।

इसके बाद आपको अपने नए OptionsPage चेकबॉक्स को खोजने के लिए एक तरीका जोड़ना होगा।

आपकी सीपीपी फ़ाइल में आपके पास एक एन्यूम होना चाहिए

enum WIXSTDBA_CONTROL

इसे पृष्ठों पर नियंत्रण में आदेश दिया जाना चाहिए यहां आपको अपने नए विकल्प चेकबॉक्स नियंत्रण के लिए एक नई प्रविष्टि जोड़ने की आवश्यकता होगी, हो सकता है कि WIXSTDBA_CONTROL_OPTIONS_CHECKBOX

इस enum नीचे आप एक 2-डी सरणी होगा

static THEME_ASSIGN_CONTROL_ID vrgInitControls[] = 

आपको यहां एक नई प्रविष्टि जोड़नी होगी जो कि आपकी जगह में डाली गई उसी जगह पर डाली गई है । सम्मिलित सरणी आइटम को इस तरह दिखना चाहिए

{ WIXSTDBA_CONTROL_OPTIONS_CEHCKBOX, L"OptionsCheckbox" },  //The string should match the Name of the checkbox in the theme xml.

अब हमें इस कंट्रोल से संदेशों को संभालने का एक तरीका चाहिए। वापस WndProc करने के लिए सिर और WM_COMMAND के तहत स्विच करने के लिए एक नया मामला जोड़ना चाहिए यह होना चाहिए

case WIXSTDBA_CONTROL_OPTIONS_CHECKBOX:
    pBA->OnClickOptionsCheckbox();
    return 0;

अब सिर्फ OnClickAcceptCheckbox () की तरह अपने Bootstrapper अनुप्रयोग पर एक OnClickOptionsCheckbox विधि जोड़ें

void OnClickOptionsCheckbox()
{
    BOOL fAccepted = ThemeIsControlChecked(m_pTheme, WIXSTDBA_CONTROL_OPTIONS_CHECKBOX);
    ThemeControlEnable(m_pTheme, WIXSTDBA_CONTROL_INSTALL_BUTTON, fAccepted);
}

अंत में, हमें एलईएलईटेड सामग्री को जोड़ने की जरूरत है जिसे हमने ऑन चाइजेस्टेट WIXSTDBA_PAGE_INSTALL मामले से WIXSTDBA_PAGE_OPTIONS तक निकाल दिया और इंस्टॉल बटन की डिफ़ॉल्ट स्थिति भी सेट की है

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);
    }
}

बदल जाएगा

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);
    }
}

कुछ चीजें हैं जो मैं अभी भी इस कार्यान्वयन के साथ बदलूंगा लेकिन मैं उच्चतर सुझाव देता हूं कि बूटस्ट्रैपर आवेदन क्या करता है और यह कैसे काम करता है।

यदि आप अपने संस्थापन के दौरान UI के व्यवहार को बदलना चाहते हैं, तो आपको यहां से परिचित होने की आवश्यकता होगी। आप नए पृष्ठों को जोड़ सकते हैं, नियंत्रण जोड़ सकते हैं, और कुछ अन्य सामान के साथ चर सेट कर सकते हैं।

यदि यह बहुत सारे कामों की तरह लग रहा है (यह सब निश्चित रूप से अपने आप से लगाया गया था) यह विचार करें कि आप डिफ़ॉल्ट प्रकार की डिफ़ॉल्ट थीम में से किसी एक के डिफ़ॉल्ट व्यवहार पर वास्तव में इस प्रकार के व्यवहार की आवश्यकता है या नहीं।





wixstdba