Пример #1
0
int FindNCHitEx(PWND pwnd, int ht, POINT pt)
{
    /*
     * Bug 263057 joejo
     * It seems that pwnd->spmenu can be released and set to null,
     * without the WFMPRESENT flag being cleared. Make sure that
     * we have a good pwnd->spmenu before continuing.
     */
    if (ht == HTMENU && pwnd->spmenu && TestWF(pwnd, WFMPRESENT)) {
        PMENU spmenu = pwnd->spmenu;
        PITEM pitem;
        int nItem;

        nItem = MNItemHitTest(spmenu, pwnd, pt);
        if (nItem >= 0) {
            pitem = (PITEM)&spmenu->rgItems[nItem];
            switch ((ULONG_PTR)pitem->hbmp) {
            case (ULONG_PTR)HBMMENU_SYSTEM:
                ht = HTMDISYSMENU;
                break;
            case (ULONG_PTR)HBMMENU_MBAR_RESTORE:
                ht = HTMDIMAXBUTTON;
                break;
            case (ULONG_PTR)HBMMENU_MBAR_MINIMIZE:
            case (ULONG_PTR)HBMMENU_MBAR_MINIMIZE_D:
                ht = HTMDIMINBUTTON;
                break;
            case (ULONG_PTR)HBMMENU_MBAR_CLOSE:
            case (ULONG_PTR)HBMMENU_MBAR_CLOSE_D:
                ht = HTMDICLOSE;
                break;
            case (ULONG_PTR)HBMMENU_CALLBACK:
                ht = HTERROR;
                break;
            default:
                ht = HTMENUITEM;
                break;
            }
        }
        return MAKELONG(ht, nItem);
    } else if (ht == HTVSCROLL && TestWF(pwnd, WFVPRESENT)) {
        return MAKELONG(HitTestScrollBar(pwnd, TRUE, pt), 1);
    } else if (ht == HTHSCROLL && TestWF(pwnd, WFHPRESENT)) {
        return MAKELONG(HitTestScrollBar(pwnd, FALSE, pt), 0);
    }

    return ht;
}
void CXTPSkinObjectFrame::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
    if (m_pButtonHot)
    {
        TrackCaptionButton();
    }

    CPoint ptClient(point);
    ScreenToFrame(&ptClient);

    for (int i = 0; i < 2; i++)
    {
        XTP_SKINSCROLLBARPOSINFO* pSBInfo = &m_spi[i];
        int ht = HitTestScrollBar(pSBInfo, ptClient);

        if (ht != HTNOWHERE)
        {
            TrackInit(ptClient, pSBInfo, (GetKeyState(VK_SHIFT) < 0) ? TRUE : FALSE);
            return;
        }
    }

    if (nHitTest == HTZOOM || nHitTest == HTREDUCE || nHitTest == HTCLOSE || nHitTest == HTHELP)
        return;

    CXTPSkinObject::OnNcLButtonDown(nHitTest, point);
}
void CXTPSkinObjectFrame::OnNcRButtonUp(UINT nHitTest, CPoint point)
{
    CPoint ptClient(point);
    ScreenToFrame(&ptClient);

    for (int i = 0; i < 2; i++)
    {
        XTP_SKINSCROLLBARPOSINFO* pSBInfo = &m_spi[i];
        int ht = HitTestScrollBar(pSBInfo, ptClient);

        if (ht != HTNOWHERE)
        {
            m_bLockFrameDraw++;
            RECT rc = CXTPWindowRect(this);
            SendMessage(WM_NCCALCSIZE, FALSE, (LPARAM)&rc);
            m_bLockFrameDraw--;

            SendMessage(WM_CONTEXTMENU, (WPARAM)m_hWnd, MAKELPARAM(point.x, point.y));

            RefreshFrameStyle();
            return;
        }
    }

    CXTPSkinObject::OnNcRButtonDown(nHitTest, point);
}
void CXTPControlScrollBar::OnMouseMove(CPoint point)
{
	int ht = HitTestScrollBar(point);

	if (ht != m_spi.ht)
	{
		m_spi.ht = ht;
		RedrawParent(FALSE);
	}
}
BOOL CXTPSkinObjectFrame::HandleMouseMove(CPoint point)
{
    CPoint ptClient(point);
    ScreenToFrame(&ptClient);

    CCaptionButton* pButton = HitTestButton(ptClient);

    if (m_pButtonHot != pButton)
    {
        if (m_pButtonHot && !pButton)
            CancelMouseLeaveTracking();

        m_pButtonHot = pButton;
        InvalidateButtons();

        if (m_pButtonHot)
        {
            SetTimer(XTP_TID_MOUSELEAVE, 50, &OnTimerInternal);
            return  TRUE;
        }
    }

    if (m_pSBTrack)
        return TRUE;

    BOOL bResult = FALSE;
    for (int i = 0; i < 2; i++)
    {
        XTP_SKINSCROLLBARPOSINFO* pSBInfo = &m_spi[i];
        int ht = HitTestScrollBar(pSBInfo, ptClient);

        if (ht != pSBInfo->ht && pSBInfo->fVisible)
        {
            if (pSBInfo->ht != HTNOWHERE && ht == HTNOWHERE && !bResult)
            {
                CancelMouseLeaveTracking();
            }

            pSBInfo->ht = ht;
            RedrawScrollBar(pSBInfo);
        }

        if (ht != HTNOWHERE)
        {
            SetTimer (XTP_TID_MOUSELEAVE, 50, &OnTimerInternal);
            bResult = TRUE;
        }
    }

    return bResult;
}