Создаю мастером WTL на MS VC 7.0 новый проект Single, Form ( Dialog Based ).
Теперь мне нужно в главное окно вставить CPropertySheet так, чтобы он не занимал все окно.
Люди, подскажите как это сделать? Или где почитать.
Здравствуйте, 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. Порка кода приветствуется