15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Wizard

Eric Lamontagne -- ericl@dra.com
Monday, April 29, 1996


VC++ 4.1/ NT 4.0 build 1234

I'm using a CPropertySheet to create a wizard (SetWizardMode()).  I would   
like to have the  and Finish  buttons availlable at all the   
time.  My problem is that when I use the functions SetWizardsButtons with   
PSWIZB_NEXT | PSWIZB_BACK | PSWIZB_FINISH, the Next button is not   
visible.  How can I make them all visible at the same time?

Thank you.

Eric Lamontagne
ericl@dra.com  



LeRoy Baxter -- lbaxter@cinfo.com
Monday, April 29, 1996

[Mini-digest: 2 responses]

you can't - unless you re-write the Wizard/CPropertySheet.  You can get _either_
the next button or the finish (without looking at the code, I would suspect that
Next and Finish are the same button with different labels)

-----From: "David W. Gillett" 

  The "Finish" button is basically the "Next" button with a changed 
caption. 

  I can see two other ways to get the sort of effect that you want.  
One approach is to coopt one of the other standard buttons (Cancel, 
Help), setting its text to "Finish" and intercepting it in a derived 
class.
  The other approach, also requiring a derived class, is to overload 
OnCreate() or OnInitDialog to move the "Back" and "Next" buttons, and 
insert your own "Finish" button.  Again this is handled in the 
derived class, but this doesn't interfere with any of the other 
buttons.

  A third approach might be to rethink your user interface to more 
closely approximate the existing "Wizard" framework.  [Having 
"Finish" available from every page is not necessarily "bad" -- 
although apparently it won't work under Win32s -- but it *is* 
different from every other wizard your users will meet.]

Dave





Barbara Laird -- Barbara_Laird@qm.claris.com
Tuesday, April 30, 1996

[Mini-digest: 6 responses]

                      RE>Wizard                                    4/30/96

I ran into this same problem.  What's happening is that the next and back
buttons are in the exact same location.  So, I changed my OnInitDialog to
enable, move, and show the buttons so that they are all visible (ID_WIZNEXT,
ID_WIZBACK, ID_WIZFINISH, and IDCANCEL).  
-----From: beriksen@cda.com

     The person that said that "The finish button is basically the next 
     button with a changed caption" is _absoleutely_ wrong.  All three 
     buttons are there.  (You can find this out by stepping through the 
     children of the CPropertyPage-derived object.)

-----From: beriksen@cda.com

     It seems that CPropertySheet only allows 2 of the buttons at a time.  
     Really they're all there, but one of the three is always underneath 
     the other two.  The way I solved this was to move the buttons on 
     ::OnInitDialog of the first CPropertyPage-derived object that is added 
     to the CPropertySheet-derived object using the following code:
     
     BOOL CMyPropertyPage::OnInitDialog(void) {
        CPropertyPage::OnInitDialog();
        //... other initialization ...
     
        ((CPropertySheet*)GetParent())->
           SetWizardButtons(PSWIZB_NEXT|PSWIZB_FINISH);
     
        CWnd *buttonBack = GetParent()->GetDlgItem(ID_WIZBACK);
        CWnd *buttonNext = GetParent()->GetDlgItem(ID_WIZNEXT);
     
        //move around the back and next buttons
        CRect rectBackButton;
        buttonBack->GetWindowRect(&rectBackButton);
        ScreenToClient(&rectBackButton);
        buttonBack->
           SetWindowPos(NULL,
                        rectBackButton.left-rectBackButton.Width(),
                        rectBackButton.top,
                        0,
                        0,
                        SWP_NOACTIVATE||SWP_NOSIZE||
                           SWP_NOZORDER||SWP_SHOWWINDOW);
        buttonNext->
           SetWindowPos(buttonBack,
                        rectBackButton.left,
                        rectBackButton.top,
                        rectBackButton.Width(),
                        rectBackButton.Height(),
                        SWP_NOACTIVATE||SWP_SHOWWINDOW);
        buttonNext->EnableWindow(TRUE);
        buttonNext->ShowWindow(SW_SHOW);
     
        return(TRUE);
     }
     
The catch with this hack is that you can never call SetWizardButtons again, or 
else you'll lose what you've done.  You must manually enable/disable/hide/show 
the buttons with the standard CWnd member functions.

Brian Eriksen
CDA/Wiesenberger
beriksen@cda.com

-----From: Jeff_Stong@bio-rad.com

     <<[Having "Finish" available from every page is not necessarily "bad" 
     -- although apparently it won't work under Win32s -- but it *is* 
     different from every other wizard your users will meet.] >>
     
     Except of course for AppWizard, which uses the very model suggested by 
     the original poster.

-----From: "David W. Gillett" 
     
  The "Finish" button is basically the "Next" button with a changed 
caption. 
     
  I can see two other ways to get the sort of effect that you want.  
One approach is to coopt one of the other standard buttons (Cancel, 
Help), setting its text to "Finish" and intercepting it in a derived 
class.
  The other approach, also requiring a derived class, is to overload 
OnCreate() or OnInitDialog to move the "Back" and "Next" buttons, and 
insert your own "Finish" button.  Again this is handled in the 
derived class, but this doesn't interfere with any of the other 
buttons.
     
  A third approach might be to rethink your user interface to more 
closely approximate the existing "Wizard" framework.  [Having 
"Finish" available from every page is not necessarily "bad" -- 
although apparently it won't work under Win32s -- but it *is* 
different from every other wizard your users will meet.]
     
Dave
     
     

-----From: Brad Wilson/Crucial Software 

>>  A third approach might be to rethink your user interface to more 
>> closely approximate the existing "Wizard" framework.  [Having 
>> "Finish" available from every page is not necessarily "bad" -- 
>> although apparently it won't work under Win32s -- but it *is* 
>> different from every other wizard your users will meet.]

There are extremely valid reasons for wanting Finish and Next,
as the Visual C++ team would tell you.  Instead of paging
through many pages of things you would leave as default,
simply click Finish to expedite the process.

Why wouldn't it work under Win32s?
Brad





| Вернуться в корень Архива |