Держите окно, полученное из CView, всегда сверху - PullRequest
0 голосов
/ 03 января 2019

Я хочу подражать поведению модального 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?

...