wxWidgets и WM_NCHITTEST - PullRequest
       31

wxWidgets и WM_NCHITTEST

1 голос
/ 19 марта 2011

Я использую wxWidgets с Visual C ++ 2010.
Одна из моих целей - возможность перемещать созданный мною кадр с любой частью окна (клиентской или другой).Для этого я использовал WM_NCHITTEST в прошлом, чтобы обмануть Windows, думая, что каждая часть моего окна является строкой заголовка.
Как это сделать в wxWidgets?

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

После обширных исследований из-за неактивности в автоответчике я нашел несколько приемлемое (хотя и не переносимое) решение:

WXLRESULT [your-wxWindow-inheriting-objectname-here]::MSWWindowProc(WXUINT message,WXWPARAM wParam,WXLPARAM
lParam)  
{  
    if(message==WM_NCHITTEST) { return HTCAPTION; }

    return wxFrame::MSWWindowProc(message,wParam,lParam);
}

Это можно использовать для любого сообщения WINAPI.

0 голосов
/ 26 декабря 2013

другое портативное решение, может быть, такое:

//assume your frame named wxUITestFrame
//headers
class wxUITestFrame : public wxFrame
{
    DECLARE_EVENT_TABLE()

protected:
    void OnMouseMove(wxMouseEvent& event);
    void OnLeftMouseDown(wxMouseEvent& event);
    void OnLeftMouseUp(wxMouseEvent& event);
    void OnMouseLeave(wxMouseEvent& event);

private:
    bool        m_isTitleClicked;
    wxPoint     m_mousePosition; //mouse position when title clicked
};


//cpp
BEGIN_EVENT_TABLE(wxUITestFrame, wxFrame)
    EVT_MOTION(wxUITestFrame::OnMouseMove)
    EVT_LEFT_DOWN(wxUITestFrame::OnLeftMouseDown)
    EVT_LEFT_UP(wxUITestFrame::OnLeftMouseUp)
    EVT_LEAVE_WINDOW(wxUITestFrame::OnMouseLeave)
END_EVENT_TABLE()


void wxUITestFrame::OnMouseMove( wxMouseEvent& event )
{
    if (event.Dragging())
    {
        if (m_isTitleClicked)
        {
            int x, y;
            GetPosition(&x, &y); //old window position

            int mx, my;
            event.GetPosition(&mx, &my); //new mouse position

            int dx, dy; //changed mouse position
            dx = mx - m_mousePosition.x;
            dy = my - m_mousePosition.y;

            x += dx;
            y += dy;

            Move(x, y); //move window to new position
        }
    }
}

void wxUITestFrame::OnLeftMouseDown( wxMouseEvent& event )
{
    if (event.GetY() <= 40) //40 is the height you want to set for title bar
    {
        m_isTitleClicked = true;
        m_mousePosition.x = event.GetX();
        m_mousePosition.y = event.GetY();
    }
}

void wxUITestFrame::OnLeftMouseUp( wxMouseEvent& event )
{
    if (m_isTitleClicked)
    {
        m_isTitleClicked = false; 
    }
}

void wxUITestFrame::OnMouseLeave( wxMouseEvent& event )
{
    //if mouse dragging too fase, we will not get mouse move event 
    //instead of mouse leave event here.
    if (m_isTitleClicked)
    {
        int x, y;
        GetPosition(&x, &y);

        int mx, my;
        event.GetPosition(&mx, &my);

        int dx, dy;
        dx = mx - m_mousePosition.x;
        dy = my - m_mousePosition.y;

        x += dx;
        y += dy;

        Move(x, y);
    }
}

На самом деле решение, упомянутое Джоном Локком на 1-м этаже, - more, предложенное в wxMSW ,, а в системе, подобной linux, мы можем смоделировать сообщение ALT BUTTON DOWN при нажатии на заголовок.

...