在CDialog中显示尺寸夹点?

时间:2009-03-04 18:50:21

标签: winapi mfc resize

我已经看过处理这个东西的绘制的代码(DFCS_SCROLLSIZEGRIP),但是肯定有一个窗口样式我可以应用它来“免费”。正确?

3 个答案:

答案 0 :(得分:3)

代替一个更好的答案,我会发布我所拥有的代码来绘制大小的抓地力并处理命中测试。您还需要在OnSize期间使相应区域无效,以便重新绘制它。

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);
}

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

答案 1 :(得分:0)

我认为没有默认样式可以免费获得此功能。您必须创建一个具有类名Scrollbar和控件样式SBS_SIZEGRIP

的新子窗口

答案 2 :(得分:0)

除了上面提到的OnEraseBkgnd和OnNcHitTest之外,你需要在窗口大小时使握把区域无效,否则在放大时会留下痕迹:

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);
}