Доброго всем времени суток.
Цель: создание немодального 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
Спасибо, конечно, но я это уже видел. Я не могу найти ошибку в своём коде.
... << 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
Здравствуйте, Gosha, Вы писали:
G>Убирать стиль DS_MODALFRAME пробовал? По крайней мере в трех сорцах по ссылкам вверху такую строчку встречал.
Попробовал, но никакого эффекта не последовало .
... << 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
Здравствуйте, Вепрь, Вы писали:
В>Доброго всем времени суток.
Товарищи, киньте пожалуйста идею по данной проблеме, а то замучился уже с этим property.
... << 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
Здравствуйте, Вепрь, Вы писали:
В>Здравствуйте, Вепрь, Вы писали:
В>>Доброго всем времени суток.
В>Товарищи, киньте пожалуйста идею по данной проблеме, а то замучился уже с этим property.
А если поменять местами ?
CHAIN_MSG_MAP(CPropertyPageImpl<CModelessPropertyPage>)
CHAIN_MSG_MAP(CDialogResize<CModelessPropertyPage>)
Здравствуйте, techMick, Вы писали:
M>А если поменять местами ? M> CHAIN_MSG_MAP(CPropertyPageImpl<CModelessPropertyPage>) M> CHAIN_MSG_MAP(CDialogResize<CModelessPropertyPage>)
Не, не пробовал и наверно уже не попробую, так как сделал по другому, благодаря одной из ссылок, приведённых Gosh'ей. Чтобы считать данную тему закрытой, выкладываю результат.
Сразу замечу, что всячески приветствуются критика, особенно по методу CModelessPropertySheet::OnSize().
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
Здравствуйте, Вепрь, Вы писали:
В>Здравствуйте, Gosha, Вы писали:
G>>Убирать стиль DS_MODALFRAME пробовал? По крайней мере в трех сорцах по ссылкам вверху такую строчку встречал.
В>Попробовал, но никакого эффекта не последовало .
У меня сделано приблизительно вот так:
template <class T, class TBase = CPropertySheetWindow, class baseSheet = CPropertySheetImpl<T, TBase> >
class CResizablePropertySheetImpl :
public baseSheet,
....
{
....
static int CALLBACK PropSheetCallback(HWND hWnd, UINT uMsg, LPARAM lParam)
{
if(uMsg == PSCB_PRECREATE)
{
int nResult = baseClass::PropSheetCallback(hWnd, uMsg, lParam);
T* pT = (T*)ATL::_AtlWinModule.ExtractCreateWndData();
ATL::_AtlWinModule.AddCreateWndData(&pT->m_thunk.cd, pT);
Здравствуйте, Вепрь, Вы писали:
В>Здравствуйте, Gosha, Вы писали:
G>>Убирать стиль DS_MODALFRAME пробовал? По крайней мере в трех сорцах по ссылкам вверху такую строчку встречал.
В>Попробовал, но никакого эффекта не последовало .
У меня сделано приблизительно вот так:
template <class T, class TBase = CPropertySheetWindow, class baseSheet = CPropertySheetImpl<T, TBase> >
class CResizablePropertySheetImpl :
public baseSheet,
....
{
....
static int CALLBACK PropSheetCallback(HWND hWnd, UINT uMsg, LPARAM lParam)
{
if(uMsg == PSCB_PRECREATE)
{
int nResult = baseClass::PropSheetCallback(hWnd, uMsg, lParam);
T* pT = (T*)ATL::_AtlWinModule.ExtractCreateWndData();
ATL::_AtlWinModule.AddCreateWndData(&pT->m_thunk.cd, pT);
Здравствуйте, Константин Ленин, Вы писали:
В>> if(wActivePage != NULL) КЛ>Это, по-моему, и то кривее
Хотелось бы знать причину, или Вы имеете ввиду, что-то типа этого:
if(wActivePage) {...}
... << 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
Здравствуйте, Вепрь, Вы писали:
В>Здравствуйте, Константин Ленин, Вы писали:
В>>> if(wActivePage != NULL) КЛ>>Это, по-моему, и то кривее
В>Хотелось бы знать причину, или Вы имеете ввиду, что-то типа этого: В>