建立派生自CPropertySheet的CProsht类,派生自CPropertyPage的三个类CProp1,CProp2,CProp3.在CProsht类里定义三个页面成员,然后在CProsht的构造函数里ADD上三个页面。在C***View类里有某个消息响应函数用来弹出非模态向导
void C***View::PopWizard()
{
                CPropSht *propSheet=new CPropSht(_T(""));
propSheet->SetWizardMode();
propSheet->Create(this);
                propSheet->ShowWindow(SW_SHOW);
}
发现显示出来的向导里每一个属性页的大小是一样的,即使资源里所建属性页的大小并不一样,最后显示的大小跟资源里最大的属性页一样。
现在我需要定义每一个属性页的大小,当然要使每一个属性页大小不一样。
于是我在CProp1类定义了OnInitDialog(),用来实现OnInitDialog版本。
BOOL CProp1::OnInitDialog()
{
         CPropertyPage::OnInitDialog()
         CRect   rectWnd;   
         GetWindowRect(&rectWnd);
         SetWindowPos(NULL,0,0,rectWnd.Width()-100,rectWnd.Height(),SWP_NOMOVE
 |   SWP_NOZORDER   |   SWP_NOACTIVATE);   
        return true;
}结果发现显示的向导还是一点改变都没有。
请问如何改变每一个属性页的大小?

解决方案 »

  1.   

    不太好办吧page是绘制在sheet上 的,sheet大小固定的,page大小怎么改变呢。要改变只能整个sheet变大或变小
      

  2.   

    我发现在CProp1,CProp2,CProp3类的OnInitDialog函数里更改属性表单(不是属性页)的大小,显示出来的向导
    的3个属性页的大小确实不一样了。比如上面的SetWindowPos写成
    ((CPropertySheet*)GetParent())->SetWindowPos......但是也出现了一个非常严重的问题,就是向导的“上一步”“下一步”/“完成”“取消”这些按钮的位置并没有改变,还是按照资源里最大的那个页的布局来的。这样把属性页的显示改小之后,会出现看不到这些按钮的情形。有办法改变这些按钮的位置么?使得不同页它们的位置不一样?
    或者,有其他方案可以解决这个问题吗?
      

  3.   

    回fish_phenix:
    有可能的话我也不想去改这些,但是不得不改。
    因为资源里三个属性页最大的第二页那个我必须把它做成可扩展的,也就是说初始显示它是不完整的,按下该页上的某个按钮之后才完整显示。就像xp附件画图程序里面的颜色编辑对话框那样,按下“自定义颜色”之后对话框会延展出来。
    但该死的向导自动把每一个属性页都变成资源里第二页的完整大小了,不仅其他两页变成空泛很难看,就是扩展功能也变得不可能。因为刚开始要隐藏一部分,虽然可以隐藏控件,但页框还是完整的,太怪了。现在按照我上一楼说的,倒是可以把页框也变小了,但是”下一步“那些按钮也都看不到了,哭啊
      

  4.   

    PropertySheet适合于常见的固定的模式,如果要改变大小,自己用TabControl和子对话框更方便一些。
    如果要自己调整PropertySheet,需要设置各个页面的大小,按钮可以通过GetDlgItem根据ID获得句柄,再移动位置。
      

  5.   

    http://topic.csdn.net/t/20040426/16/3009662.html发现这问题不只我遇上了。都没有什么真正有效的解决办法。回cnzdgs:
    tab控件不能很好地表现流程性。就是几个属性页表示的是有先后顺序的一个流程,当然是用向导更好些。老师也要求了用向导的。
    因为“上一步”那些按钮不是我自己添加的,是向导自己生成,找不到这些按钮的ID,自然GetDlgItem然后移动位置的方法不可用。回Mdesigner:
    表单类无setSize
      

  6.   

    我是觉的需求奇怪啦,尺寸用page最大的不中?
    关注吧,
      

  7.   

    这些按钮ID都是固定的,你可以用SPY++查出来。
      

  8.   

    回cnzdgs:
    谢谢。
    我也在网上找了好几天这方面的资料,发现有些是自己写一个类继承CPropertySheet,再自己定义方法来改变属性表单大小的。如:http://www.codeguru.com/Cpp/controls/propertysheet/sizing/article.php/c599/
    这里放上来给有同样需要的大家看看。过两天我再依照这些资料做做看,有困难再找大家求助,没困难就结贴。谢谢热心回复的各位
      

  9.   

    结果还是用了cnzdgs的方法。
    这里把spy++查到的CPropertySheet的几个ID列出来
     
    //afxres.h #define   ID_APPLY_NOW                                         
    #define   ID_WIZBACK                                              
    #define   ID_WIZNEXT                                             
    #define   ID_WIZFINISH可以移动位置了。但是移动之后,即使是可用的(不是灰色)的按钮都不能按了。例如向导在第一页按下一步不会进入第二页。为什么呢?
    CWnd *pWnd = GetDlgItem(ID_WIZNEXT);
     pWnd->MoveWindow(200,350,80,25);就只是这样而已,怎么就不能用了?求解