// WM_NCLBUTTONUP handler 
BOOL cef_dark_window::HandleNcLeftButtonUp(UINT uHitTest, LPPOINT point)
{
    NonClientButtonStateData oldData(mNonClientData);

    mNonClientData.Reset();

    UpdateNonClientButtons();

    switch (oldData.mActiveButton) 
    {
    case HTCLOSE:
        if (oldData.mButtonOver) {
            SendMessage (WM_SYSCOMMAND, SC_CLOSE, (LPARAM)POINTTOPOINTS(*point));
            TrackNonClientMouseEvents(false);
        }
        return TRUE;
    case HTMAXBUTTON:
        if (oldData.mButtonOver) {
            if (IsZoomed()) 
                SendMessage (WM_SYSCOMMAND, SC_RESTORE, (LPARAM)POINTTOPOINTS(*point));
            else 
                SendMessage (WM_SYSCOMMAND, SC_MAXIMIZE, (LPARAM)POINTTOPOINTS(*point));
            TrackNonClientMouseEvents(false);
        }
        return TRUE;
    case HTMINBUTTON:
        if (oldData.mButtonOver) {
            SendMessage (WM_SYSCOMMAND, SC_MINIMIZE, (LPARAM)POINTTOPOINTS(*point));
            TrackNonClientMouseEvents(false);
        }
        return TRUE;
    }
    
    return FALSE;
}
// WM_NCCREATE handler
BOOL cef_dark_window::HandleNcDestroy()
{
    TrackNonClientMouseEvents(false);

    delete mSysCloseButton;
    delete mSysRestoreButton;
    delete mSysMinimizeButton;
    delete mSysMaximizeButton;

    delete mHoverSysCloseButton;
    delete mHoverSysRestoreButton;
    delete mHoverSysMinimizeButton;
    delete mHoverSysMaximizeButton;

    delete mPressedSysCloseButton;
    delete mPressedSysRestoreButton;
    delete mPressedSysMinimizeButton;
    delete mPressedSysMaximizeButton;

    ::DeleteObject(mBackgroundBrush);
    ::DeleteObject(mCaptionFont);
    ::DeleteObject(mMenuFont);
    ::DeleteObject(mHighlightBrush);
    ::DeleteObject(mHoverBrush);
    ::DeleteObject(mFrameOutlinePen);

    return cef_window::HandleNcDestroy();
}
// WM_NCMOUSEMOVE handler 
BOOL cef_dark_window::HandleNcMouseMove(UINT uHitTest)
{
    bool needUpdate = false;

    if (mNonClientData.mActiveButton != uHitTest) 
    {
        needUpdate = true;
        if (mNonClientData.mButtonDown) {
            // If the mouse button was down, we just want 
            //  to indicate that we're no longer over the system button
            mNonClientData.mButtonOver = false;
        } else {
            switch (uHitTest)
            {
            case HTCLOSE:
            case HTMAXBUTTON:
            case HTMINBUTTON:
                // Otherwise, we're just mousing over stuff 
                //  so we need to show the visual feedback
                mNonClientData.mButtonOver = true;
                mNonClientData.mActiveButton = uHitTest;
                TrackNonClientMouseEvents();
                break;
            default:
                // User isn't hovering over anything that 
                //  we care about so just reset and redraw
                mNonClientData.Reset();
                UpdateNonClientButtons ();
                // let the DefaultWindowProc handle this 
                return FALSE;
            }
        }
    } else {
        // Check to see if the user moved the mouse back over
        //  the button that they originally click and held and
        //  redraw the button in the correct state if they did
        if (mNonClientData.mButtonDown && !mNonClientData.mButtonOver) {
            mNonClientData.mButtonOver = true;
            needUpdate = true;
        }
    }

    if (needUpdate) {
        UpdateNonClientButtons ();
    }
    return TRUE;
}
// WM_NCMOUSEMOVE handler
BOOL cef_dark_aero_window::HandleNcMouseMove(UINT uHitTest, LPPOINT pt)
{
    if (cef_dark_window::HandleNcMouseMove(uHitTest)) {
        if (mMenuActiveIndex == -1) {
            HiliteMenuItemAt(NULL);
        }
        return TRUE;
    }

    if (mMenuActiveIndex == -1) {
        if (uHitTest == HTMENU) {
            HiliteMenuItemAt(pt);
            TrackNonClientMouseEvents();
        } else {
            HiliteMenuItemAt(NULL);
        }
    }

    return FALSE;
}
// WM_NCLBUTTONDOWN handler 
BOOL cef_dark_window::HandleNcLeftButtonDown(UINT uHitTest)
{
    switch (uHitTest)
    {
    case HTCLOSE:
    case HTMAXBUTTON:
    case HTMINBUTTON:
        // we only care about these guys
        mNonClientData.mActiveButton = uHitTest;
        mNonClientData.mButtonOver = true;
        mNonClientData.mButtonDown = true;
        UpdateNonClientButtons();
        TrackNonClientMouseEvents();
        return TRUE;
    default:
        mNonClientData.Reset();
        UpdateNonClientButtons();
        return FALSE;
    }
}