Modeless, resizeable, property sheet
От: Вепрь  
Дата: 09.03.06 15:28
Оценка:
Доброго всем времени суток.
Цель: создание немодального property sheet с возможностью изменеия размеров.
Как делаю:
// Базовый класс для страниц-закладок
template <WORD t_wDlgTemplateID>
class CModelessPropertyPage: 
    public CPropertyPageImpl<CModelessPropertyPage>, 
    public CDialogResize<CModelessPropertyPage>
{
public:
    enum { IDD = t_wDlgTemplateID };

CModelessPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL): 
    CPropertyPageImpl<CModelessPropertyPage>(title)
    {
    }
    ~CModelessPropertyPage() { if(m_hWnd) DestroyWindow(); }
    
    BEGIN_MSG_MAP(CModelessPropertyPage)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitPage)
        CHAIN_MSG_MAP(CPropertyPageImpl<CModelessPropertyPage>)
        CHAIN_MSG_MAP(CDialogResize<CModelessPropertyPage>)
    END_MSG_MAP()
    
    BEGIN_DLGRESIZE_MAP(CModelessPropertyPage)
    END_DLGRESIZE_MAP()
    
    LRESULT OnInitPage(UINT, WPARAM , LPARAM , BOOL& bHandled)
    {
        bHandled = false;
        DlgResize_Init(false, false, WS_CHILD | WS_CLIPCHILDREN);
        return 0;
    }
};

// Базовый класс для sheet
// Сразу замечу, что я убиваю property sheet только при закрытии самого приложения, иначе, 
// я его просто прячу.
class CModelessPropertySheet : 
    public CPropertySheetImpl<CModelessPropertySheet>, 
    public CDialogResize<CModelessPropertySheet>
{
public:
    CModelessPropertySheet(_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL):
        CPropertySheetImpl<CModelessPropertySheet>(title, uStartPage, hWndParent)
    {
        m_fChilded = false;
        m_psh.dwFlags |= PSH_NOAPPLYNOW;
        m_psh.dwFlags |= PSH_NOCONTEXTHELP;
    }
    
    ~CModelessPropertySheet() { if(m_hWnd) DestroyWindow(); }

    virtual HWND Create()
    {
        if(m_hSheet) ShowWindow(SW_SHOW);
        else 
        {
            m_hSheet = CPropertySheetImpl<CModelessPropertySheet>::Create();
            ModifyStyle(0, WS_THICKFRAME);
            DlgResize_Init(true, false, 0);
        }
        ::SetFocus(m_hSheet);
        return m_hSheet;
    }

    BEGIN_MSG_MAP(CModelessPropertySheet)
        MESSAGE_HANDLER(WM_CLOSE, OnClose)
        COMMAND_HANDLER(IDOK, BN_CLICKED, OnHide)
        COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnHide)
        CHAIN_MSG_MAP(CPropertySheetImpl<CModelessPropertySheet>)
        CHAIN_MSG_MAP(CDialogResize<CModelessPropertySheet>)
    END_MSG_MAP()

    BEGIN_DLGRESIZE_MAP(CModelessPropertySheet)
    END_DLGRESIZE_MAP()
    
    LRESULT OnHide(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    { 
        return ShowWindow(SW_HIDE); 
    }
    LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    { 
        return ShowWindow(SW_HIDE);
    }

private:
    bool m_fChilded;
    HWND m_hSheet;
};

Сооответственно, я создаю наследников от этих базовых классов, добавлюя закладки, вроде всё работает нормально, но никак не получается изменить размеры окна. В чём тут может быть проблема?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
God grant me the serenity to accept the things I cannot change,
courage to change the things I can,
and wisdom to know the difference. (C) Reinhold Niebuhr
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.