ColmanJ
ColmanJ

Reputation: 456

how to move parent window without border from child using WM_NCHITTEST

so I have created this popup window with a custom move and sizing, pressing ctrl and click anywhere in the client to move and alt at the borders to size. The problem is, now i'm creating child windows for inside this window and here it goes "wrong". I can't find how to send the message to the parent window. This is what I've tried.

I handle these messages in the wndproc of the parent window

case WM_NCHITTEST:
    //determines if the window should be moving, sizing or don't do a thing
    return DoHitTest(pWnd, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) );

case WM_NCLBUTTONDOWN:
    //just set the cursor for visual notice
if (GetAsyncKeyState(VK_CONTROL) & 0x8000)
    SetCursor(LoadCursor(NULL, IDC_SIZEALL));
break;

and this is the doHitTest method

int WindowGnaq::DoHitTest(WindowBase* pWnd, int x, int y)
{
    if( GetAsyncKeyState( VK_CONTROL ) & 0x8000 )
        return HTCAPTION;

    if( m_bAdjustable && GetAsyncKeyState( VK_MENU ) & 0x8000 )
    {
        short spare = 5;
        RECT r;
        pWnd->GetRect(r);
        r.right -= 1;
        r.bottom -= 1;

        if (x < (r.left + spare) && y < (r.top + spare))
            return HTTOPLEFT;
        else if (x < (r.left + spare) && y > (r.bottom - spare))
            return HTBOTTOMLEFT;
        else if (x < (r.left + spare))
            return HTLEFT;
        else if (x > (r.right - spare) && y < (r.top + spare))
            return HTTOPRIGHT;
        else if (x > (r.right - spare) && y > (r.bottom - spare))
            return HTBOTTOMRIGHT;
        else if (x > (r.right - spare))
            return HTRIGHT;
        else if (y < (r.top + spare))
            return HTTOP;
        else if (y > (r.bottom - spare))
            return HTBOTTOM;
    }
    return HTCLIENT;
}

and this is what I'm trying in the childs window procedure

    case WM_NCHITTEST:
        //this just moves the mouse to the border i don't have but doesn't make me able to move
        return SendMessage( m_pParent->GetHandle(), WM_SYSCOMMAND, SC_MOVE, -1); 
        //this doesn't to anything
        return PostMessage( m_pParent->GetHandle(), msg, wParam, lParam); 

        //this makes the childwindow move instead of the parent
        return SendMessage( m_pParent->GetHandle(), msg, wParam, lParam);

Upvotes: 3

Views: 2470

Answers (1)

Alexey Kukanov
Alexey Kukanov

Reputation: 12784

The childrens' window procedures should return HTTRANSPARENT in response to WM_NCHITTEST, and (citing MSDN) "the message will be sent to underlying windows in the same thread until one of them returns a code that is not HTTRANSPARENT".

Upvotes: 4

Related Questions