Как показать немодальный собственный диалог в .NET 1.1 - PullRequest
1 голос
/ 10 августа 2011

Мне нужно показать немодальное диалоговое окно в .NET 1.1 . Следующий код работает в .NET 2.0 или выше:

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetActiveWindow();

private void ShowModelessOwnedDialog()
{
   IntPtr wHnd = GetActiveWindow();
   NativeWindow parent = NativeWindow.FromHandle(wHnd);
   MyForm f = new MyForm();
   f.Show(parent);
}

Вызов Show(IWin32Window) был введен в .NET 2.0. Вы знаете, как заставить этот код работать в .NET 1.1 ? Может быть, любой неуправляемый звонок?

Ответы [ 4 ]

2 голосов
/ 10 августа 2011

Это способ назначить владельца для управляемой формы в .NET 1.1. Я извлек следующий код из ответа @Dave Markle и Show(IWin32Window) реализации .NET 2.0.

    private void AssignOwner()
    {
        AssignOwner(this, GetActiveWindow());
    }

    private void AssignOwner(Form f, IntPtr ownerHandle)
    {
        if (ownerHandle == IntPtr.Zero) return;

        NativeWindow parent = NativeWindow.FromHandle(ownerHandle);

        GetWindowLong(new HandleRef(f, f.Handle), -8);
        SetWindowLong(new HandleRef(f, f.Handle), -8, new HandleRef(parent, ownerHandle));
    }

    public static IntPtr GetWindowLong(HandleRef hWnd, int nIndex)
    {
        if (IntPtr.Size == 4)
        {
            return GetWindowLong32(hWnd, nIndex);
        }
        return GetWindowLongPtr64(hWnd, nIndex);
    }

    public static IntPtr SetWindowLong(HandleRef hWnd, int nIndex, HandleRef dwNewLong)
    {
        if (IntPtr.Size == 4)
        {
            return SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
        }
        return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern IntPtr GetActiveWindow();
    [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
    public static extern IntPtr GetWindowLong32(HandleRef hWnd, int nIndex);
    [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
    public static extern IntPtr GetWindowLongPtr64(HandleRef hWnd, int nIndex);
    [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowLongPtr32(HandleRef hWnd, int nIndex, HandleRef dwNewLong);
    [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, HandleRef dwNewLong);
2 голосов
/ 10 августа 2011

Здесь - это статья 1999 года, показывающая, как вы вызываете SetWindowLong для достижения этой цели. Мои соболезнования вам за использование .NET версии 1.

1 голос
/ 10 августа 2011

MSDN заявляет , что после создания окна владение не может быть передано.
Поскольку создание окна происходит в конструкторе Form, это создает для вас проблему.

Однако Рэймонд Чен говорит :

Владение - это концепция, которая относится к окнам верхнего уровня. Окно верхнего уровня может иметь владельца, который также указывается при вызове CreateWindowEx и , который можно изменить с помощью сложного механизма, описанного в моем докладе .

Я предполагаю, что речь идет о от PDC 05 , но я не уверен.

Вы дали SetParent попытку?

static extern void SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
0 голосов
/ 10 августа 2011

Существует перегрузка MessageBox.Show получение и IWin32Window в .net 1.1

http://msdn.microsoft.com/en-us/library/aa335416(v=VS.71).aspx

public static DialogResult Show(
 IWin32Window owner,
 string text,
 string caption,
 MessageBoxButtons buttons,
 MessageBoxIcon icon,
 MessageBoxDefaultButton defaultButton
);

А это и пример получения IWin2Window здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...