0

UserControlいくつかの通常の Button コントロールを含むライブラリを作成しました。

ドラッグでサイズを変更したい。ドラッグ検出は、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 ただし、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

どうやって進める?

4

1 に答える 1

0

Size プロパティは、値型である構造体を返します。したがって、変更したコピーを取得しますが、元は同じままです。フォームのサイズを変更するには、次を設定できます。

this->Size = new Size(100, 100);

または、幅と高さのプロパティを使用します。

this->幅 += 100;

于 2013-03-27T00:14:20.753 に答える