Visual c ++, изменить размер элемента управления на mousedown

Я сделал UserControllibrary, которая содержит несколько обычных элементов управления Button.

я хотел бы изменить его размер при перетаскивании. Dragdetction выполняется через сообщения Windows и работает безупречно.

Мне даже удалось установить правильный курсор и .. вернуться на WM_MOUSELEAVE.

virtual void WndProc( Message %m ) override
{
    // Listen for operating system messages
    switch ( m.Msg )
    {
        // more code
        // .
        // ..
        // ...
        case WM_MOUSEMOVE:
            if(m.WParam.ToInt32() ==  MK_CONTROL)
            {
                Debug::WriteLine("MK_CONTROL");
                return;
            }
            else if(m.WParam.ToInt32() ==  MK_LBUTTON)
            {
                Debug::WriteLine("MK_LBUTTON");
                if(isMouseDown)
                {
                    Debug::WriteLine("drag Detected");
                    Debug::WriteLine("isMouseDown: " + isMouseDown.ToString());
                    int tempX = (short)(m.LParam.ToInt32() & 0x0000FFFF);
                        this->Size.Width = (this->Location.X - tempX); // <--- does not work!
                    return;
                }
                return;
            }
            else if(m.WParam.ToInt32() ==  MK_MBUTTON)
            {
                Debug::WriteLine("MK_MBUTTON");
                return;
            }
            else if(m.WParam.ToInt32() ==  MK_RBUTTON)
            {
                Debug::WriteLine("MK_RBUTTON");
                return;
            }
            else if(m.WParam.ToInt32() ==  MK_SHIFT)
            {
                Debug::WriteLine("MK_SHIFT");
                return;
            }
            else if(m.WParam.ToInt32() ==  MK_XBUTTON1)
            {
                Debug::WriteLine("MK_XBUTTON1");
                return;
            }
            else if(m.WParam.ToInt32() ==  MK_XBUTTON2)
            {
                Debug::WriteLine("MK_XBUTTON2");
                return;
            }   
        return;
        // more code
        // .
        // ..
        // ...
        return;
    }
    System::Windows::Forms::UserControl::WndProc( m );
}

Однако это this->Size.Width = (this->Location.X - e->Location.X); // ‹--- не работает! this->Size.Width останется на своем значении по умолчанию 400, ранее установленном в окнах свойств.

Я знаю, что можно установить размер через сообщения Windows, но я не понимаю, как это сделать. взято из примера C #: Размер элементов управления не изменится, если иерархия вложенности окон превысит определенную глубину

    // this doesn't seam the right synthax for C++
    [DllImport("User32.dll", CharSet=CharSet.Auto)]
    public static extern int SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);

    [DllImport("User32.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern bool SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter,
    int x, int y, int cx, int cy, int flags);

UserControl не имеет свойства / метода под названием SetWindowPos

Как действовать?


person NaturalDemon    schedule 26.03.2013    source источник


Ответы (1)


Свойство Size возвращает структуру, которая является типом значения. Таким образом, вы получаете копию, которую вы изменяете, но оригинал остается прежним. Чтобы изменить размер формы, вы можете установить:

this-> Size = новый размер (100, 100);

или лучше, используйте свойства ширины и высоты:

this-> Ширина + = 100;

person ebutusov    schedule 27.03.2013
comment
ты прав this->Width, что-то случилось ... хотя, я не могу понять ... что именно ... на этом. - person NaturalDemon; 27.03.2013