WTL, CPropertySheet. Скажи нет Модальности!
От: Madjack  
Дата: 26.06.04 13:58
Оценка:
Создаю мастером WTL на MS VC 7.0 новый проект Single, Form ( Dialog Based ).
Теперь мне нужно в главное окно вставить CPropertySheet так, чтобы он не занимал все окно.

Люди, подскажите как это сделать? Или где почитать.
Re: WTL, CPropertySheet. Скажи нет Модальности!
От: _nn_  
Дата: 26.06.04 14:39
Оценка:
Здравствуйте, Madjack, Вы писали:

M>Создаю мастером WTL на MS VC 7.0 новый проект Single, Form ( Dialog Based ).

M>Теперь мне нужно в главное окно вставить CPropertySheet так, чтобы он не занимал все окно.

В главное окно вставить Property Sheet ?
Наверно вам нужно Tab Control — класс CTabCtrl.

M>Люди, подскажите как это сделать? Или где почитать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: WTL, CPropertySheet. Скажи нет Модальности!
От: Tarantul Украина  
Дата: 27.06.04 10:12
Оценка:
Здравствуйте, Madjack, Вы писали:

M>Создаю мастером WTL на MS VC 7.0 новый проект Single, Form ( Dialog Based ).

M>Теперь мне нужно в главное окно вставить CPropertySheet так, чтобы он не занимал все окно.

M>Люди, подскажите как это сделать? Или где почитать.


Оно? :

Custom класс для PropSheet:

// ChildPropertySheet.h
// Автор: Я :)
#pragma once

#define WM_SHEET_MAKECHILD WM_APP + 1

class CChildPropertySheet : public CPropertySheetImpl<CChildPropertySheet>
{
public:
    // Construction
    CChildPropertySheet(_U_STRINGorID title = (LPCTSTR) NULL, UINT uStartPage = 0, HWND hWndParent = NULL):
    CPropertySheetImpl<CChildPropertySheet>(title, uStartPage, hWndParent)
    {
        m_Childed = false;
        m_psh.dwFlags |= PSH_NOAPPLYNOW;
    }

    ~CChildPropertySheet()
    {
        if(m_hWnd) DestroyWindow();
    }
    
    HWND Create(HWND hWndParent)
    {
        CWindow wndFocus = GetFocus();
        HWND hSheet = CPropertySheetImpl<CChildPropertySheet>::Create(hWndParent);
        ::SetFocus(wndFocus);
        return hSheet;
    }

    // Maps
    BEGIN_MSG_MAP(CChildPropertySheet)
        MESSAGE_HANDLER(WM_SHEET_MAKECHILD, OnMakeChild)
        MESSAGE_HANDLER(WM_SIZE, OnSize)
        CHAIN_MSG_MAP(CPropertySheetImpl<CChildPropertySheet>)
    END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//    LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//    LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//    LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

    LRESULT OnMakeChild(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        if(!m_Childed)
        {
            m_Childed = false;
            
            CWindow sheet = *this;
            sheet.SetParent(m_psh.hwndParent);
            sheet.SetWindowLong(GWL_STYLE, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
            sheet.SetWindowLong(GWL_EXSTYLE, WS_EX_STATICEDGE);

            GetDlgItem(IDOK).ShowWindow(SW_HIDE);
            GetDlgItem(IDCANCEL).ShowWindow(SW_HIDE);
        }
        return 0;
    }
    
    LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
    {
        CTabCtrl tabCtrl = GetTabControl();
        if(tabCtrl != NULL)
        {
            tabCtrl.MoveWindow(0, 0, LOWORD(lParam), HIWORD(lParam));

            CWindow activePage = GetActivePage();
            if(activePage != NULL)
            {
                CRect rect;
                tabCtrl.GetClientRect(&rect);
                tabCtrl.AdjustRect(FALSE, &rect);
                activePage.MoveWindow(rect);
            }
        }
        return 0;
    }

private:
    bool m_Childed;
};


Custom класс для PropPage


// ChildPropertyPage.h
// Автор: Я :)
#pragma once

#define WM_SHEET_MAKECHILD WM_APP + 1

template <WORD t_wDlgTemplateID>
class CChildPropertyPage: public CPropertyPageImpl<CChildPropertyPage>
{
public:
    enum { IDD = t_wDlgTemplateID };
    // Construction
    CChildPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL):
    CPropertyPageImpl<CChildPropertyPage>(title)
    {
    }

    ~CChildPropertyPage()
    {
        if(m_hWnd) DestroyWindow();
    }
    // Maps
    BEGIN_MSG_MAP(CChildPropertyPage)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitPage)
        CHAIN_MSG_MAP(CPropertyPageImpl<CChildPropertyPage>)
    END_MSG_MAP()

    // Handler prototypes (uncomment arguments if needed):
    //    LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    //    LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    //    LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

    LRESULT OnInitPage(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
    {
        bHandled = false;
        GetPropertySheet().SendMessage(WM_SHEET_MAKECHILD);
        return 0;
    }
};


Работают только вместе. Просто вызываешь yourSheet.Create(hParent), поддерживается resizing.
Кусочек идеи взят у Michael Dunn.

P.S. Порка кода приветствуется
Re: WTL, CPropertySheet. Скажи нет Модальности!
От: Madjack  
Дата: 27.06.04 10:15
Оценка:
Спасибо всем за своевременную помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.