как переместить родительское окно без границы от дочернего, используя WM_NCHITTEST - PullRequest
3 голосов
/ 23 января 2012

, поэтому я создал это всплывающее окно с пользовательским перемещением и размером, нажимая ctrl и щелкая в любом месте клиента, чтобы перемещать и изменять границы по размеру.Проблема в том, что сейчас я создаю дочерние окна внутри этого окна, и здесь все идет не так.Я не могу найти, как отправить сообщение в родительское окно.Это то, что я пробовал.

Я обрабатываю эти сообщения в wndproc родительского окна

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;

, и это метод doHitTest

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

это то, что я пытаюсь в детской процедуре окна

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

1 Ответ

4 голосов
/ 23 января 2012

Процедуры окна детей должны возвращать HTTRANSPARENT в ответ на WM_NCHITTEST и (цитируя MSDN ) "the message will be sent to underlying windows in the same thread until one of them returns a code that is not HTTRANSPARENT".

...