2016-03-15 2 views
1

У меня есть класс, полученный от CPropertysheet. В нем есть две страницы свойств. Я сделал лист немодальным. Но изменение размера с помощью перетаскивания мышью невозможно. Как сделать страницу свойств изменчивой?Изменение размера немодального листа свойств

+0

Может быть эта связь может иметь некоторую помощь: [это] (https://support.microsoft.com/en-us/kb/143291) –

+0

ли эта помощь? https://support.microsoft.com/en-us/kb/325613 –

ответ

4

Для модального листа свойств см. Ссылки в разделе комментариев. Для немодальной версии создайте лист свойств с WS_THICKFRAME. Этого достаточно, чтобы изменить размер диалогового окна. Например:

propSheet->Create(this, WS_THICKFRAME | 
    WS_VISIBLE | WS_SYSMENU | WS_POPUP | WS_VISIBLE | WS_CAPTION); 

Для обработки изменения размера, добавьте следующие элементы:

class CMyPropertySheet:public CPropertySheet 
{ 
    CRect save_rc; 
    BOOL OnInitDialog(); 
    void OnSize(UINT nType, int cx, int cy); 
    void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); 
    ... 
}; 

перегрузки OnInitDialog следующим образом:

BOOL CMyPropertySheet::OnInitDialog() 
{ 
    m_bModeless = FALSE; 
    m_nFlags |= WF_CONTINUEMODAL; 

    BOOL bResult = CPropertySheet::OnInitDialog(); 

    m_bModeless = TRUE; 
    m_nFlags &= ~WF_CONTINUEMODAL; 

    GetClientRect(&save_rc); 

    return bResult; 
} 

Остальное объясняется в примере MSDN:

void CMyPropertySheet::OnSize(UINT nType, int cx, int cy) 
{ 
    CPropertySheet::OnSize(nType, cx, cy); 

    if (!GetActivePage()) return; 
    if (!GetTabControl()) return; 

    int dx = cx - save_rc.Width(); 
    int dy = cy - save_rc.Height(); 
    HDWP hDWP = ::BeginDeferWindowPos(5); 
    for (CWnd *child = GetWindow(GW_CHILD); child; child = child->GetWindow(GW_HWNDNEXT)) 
    { 
     CRect r; 
     child->GetWindowRect(&r); 
     ScreenToClient(&r); 
     if (child->SendMessage(WM_GETDLGCODE) & DLGC_BUTTON) 
     { 
      r.left += dx; 
      r.top += dy; 
      ::DeferWindowPos(hDWP, child->m_hWnd, 0, r.left, r.top, 0, 0, 
       SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); 
     } 
     else 
     { 
      r.right += dx; 
      r.bottom += dy; 
      ::DeferWindowPos(hDWP, child->m_hWnd, 0, 0, 0, r.Width(), r.Height(), 
       SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); 
     } 
    } 
    ::EndDeferWindowPos(hDWP); 
    GetClientRect(&save_rc); 
} 

void CMyPropertySheet::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{ 
    CPropertySheet::OnGetMinMaxInfo(lpMMI); 
    if (!GetActivePage()) return; 

    //height should be no less than 200, otherwise we could end up 
    //with negative height when resizing child controls 
    lpMMI->ptMinTrackSize.x = 200; 
    lpMMI->ptMinTrackSize.y = 200; 
} 

Также добавьте ON_WM_SIZE и ON_WM_GETMINMAXINFO на карте сообщение

Смежные вопросы