2009-03-04 28 views

cevap

3

Daha iyi bir yanıt yerine, boyut tutamağını çizen ve isabet testini gerçekleştiren kodu göndereceğim. Ayrıca, yeniden tanımlamak için OnSize sırasında uygun alanı geçersiz kılmanız gerekir.

BOOL CMyDialog::OnEraseBkgnd(CDC* pDC) 
{ 
    if (CDialog::OnEraseBkgnd(pDC)) 
    { 
     // draw size grip 
     CRect r; 
     GetClientRect(&r); 
     int size = GetSystemMetrics(SM_CXVSCROLL); 
     r.left = r.right - size; 
     r.top = r.bottom - size; 
     pDC->DrawFrameControl(&r, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); 
     return TRUE; 
    } 
    else 
    { 
     return FALSE; 
    } 
} 

-

LRESULT CMyDialog::OnNcHitTest(CPoint point) 
{ 
    // return HTBOTTOMRIGHT for sizegrip area 
    CRect r; 
    GetClientRect(&r); 
    int size = GetSystemMetrics(SM_CXVSCROLL); 
    r.left = r.right - size; 
    r.top = r.bottom - size; 
    ScreenToClient(&point); 

    if (r.PtInRect(point)) 
    { 
     return HTBOTTOMRIGHT; 
    } 
    else 
     return CDialog::OnNcHitTest(point); 
} 

Kaynak: http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.ui/2006-01/msg00103.html

0

bedavaya bu işlevselliği almak için bir varsayılan stil olduğunu düşünmüyorum. Sen genişlemiş aksi takdirde iz bırakacaklardır SBS_SIZEGRIP pencere büyüklüğünde zaman kavrama alanını geçersiz gerekecektir yukarıda bahsettiği OnEraseBkgnd ve OnNcHitTest ek olarak

0

, sınıf adı Scrollbar ve kontrol tarzı ile yeni bir alt pencere oluşturmak zorunda :

void CMyDialog::OnSize(UINT nType, INT cx, INT cy) 
{ 

    CRect rc; 
    int iSize=GetSystemMetrics(SM_CXVSCROLL); 

    GetClientRect(rc); 
    InvalidateRect(CRect(rc.left-iSize, rc.bottom-iSize, rc.right, rc.bottom), FALSE); 
    CDialog::OnSize(nType, cx, cy); 
}