Как отобразить элемент управления MFC в приложении Windows Form? - PullRequest
3 голосов
/ 03 февраля 2010

Я хотел бы создать элемент управления Windows Form, который показывает элемент управления MFC, например CIPAddressCtrl, с рабочим свойством Text и событием TextChanged. Как отобразить элемент управления MFC в приложении Windows Form? Я счастлив использовать C ++ / CLI при необходимости.

ПРИМЕЧАНИЕ. Я не спрашиваю, как создать новый элемент управления формами окон; Я хочу разместить устаревший элемент управления в приложении Windows Form.

Ответы [ 2 ]

5 голосов
/ 03 февраля 2010

В этой статье представлено решение, которое обернет ваш элемент управления MFC. Уловка этого заключается в использовании SubclassWindow в переопределении Control :: OnHandleCreated. Остальная часть кода включает в себя ручную упаковку атрибутов элемента управления MFC со свойствами .NET.

1 голос
/ 16 декабря 2018

В моем аналогичном случае SubclassWindow в OnHandleCreated по какой-то причине не сработало. После некоторой борьбы я заработал (без C ++ / CLI):

Сначала получите HWND от Form#Handle и передайте его в свою MFC DLL.

class GuestControl : Control
{
    private IntPtr CWnd { get; set; }

    public GuestControl()
    {
        CWnd = attach(Handle);
    }

    protected override void Dispose(bool disposing)
    {
       if (disposing)
       {
          detach(CWnd);
       }

       base.Dispose(disposing);
    }

    [DllImport("your_mfc_dll")]
    private static extern IntPtr attach(IntPtr hwnd);
    [DllImport("your_mfc_dll")]
    private static extern void detach(IntPtr hwnd);
}

Затем в вашей DLL CWnd::Attach до полученного HWND и инициализируйте управление. Очистить с помощью CWnd::Detach при утилизации.

/** Attach to C# HWND and initialize */
extern "C" __declspec(dllexport) CWnd* PASCAL attach(HWND hwnd) {
    auto w = std::make_unique<CWnd>();

    if (!w->Attach(hwnd)) { return nullptr; }

    // ... initialize your MFC control ...

    return w.release();
}

/** Detach and delete CWnd */
extern "C" __declspec(dllexport) void PASCAL detach(CWnd *cwnd) {
    auto w = std::unique_ptr<CWnd>(cwnd);
    w->Detach();
}

См. Полный пример GuestControl.cs / guest.cpp *.

Редактировать: Код в этот связанный вопрос также использовать Attach / Detach.

* Пример - моя работа. (Лицензия MIT)

...