Я хочу подражать поведению модального diaolg в моем листе свойств, чтобы он всегда оставался сверху, и никакие другие действия из соответствующего листа не могут быть предприняты, пока лист не будет закрыт.
У меня есть следующая структура класса;
class ViewPSheet : public CView
{
protected:
ViewPSheet();
DECLARE_DYNCREATE(ViewPSheet)
// Overrides
public:
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
virtual void OnInitialUpdate(); // called first time after construct
virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
virtual void OnActivateFrame(UINT nState, CFrameWnd* /*pFrameWnd*/);
// Generated message map functions
protected:
afx_msg void OnDestroy();
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
DECLARE_MESSAGE_MAP()
};class SheetDim : public ViewPSheet
{
protected:
SheetDim(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(SheetDim)
// Operations
public:
protected:
virtual void OnInitialUpdate(); // called first time after construct
virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
protected:
virtual ~SheetDim();
public:
void OnApplyNow();
void OnCancel();
void OnOK();
// Generated message map functions
protected:
DECLARE_MESSAGE_MAP()
};
SheetDimclass действует как держатель страницы свойств и имеет несколько классов CPropertyPage, добавленных в OnInitialUpdate ().
Я попытался использовать следующие методы, чтобы получить правильную таблицу, в том числе попробовать закомментированные строки.
void SheetDim::OnActivateView(
BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
ViewPSheet::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (bActivate == WA_INACTIVE)
{
::SetWindowPos( this->GetParent()->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE );
//::SetWindowPos( this->GetParent()->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
//::SetWindowPos( this->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
}
Но не мог заставить надлежащую таблицу вести себя как немодальный диалог. Есть ли способ достичь этого без изменения родительского класса ViewPSheet?
Задача ещё не решена.
Других решений пока нет …